微信扫一扫

028-83195727 , 15928970361
business@forhy.com

JavaEE学习笔记之Servlet/JSP(2)

java ee2016-07-08

1.Form表单的提交

A.先说说提交方式,比较常用的有两种 get 和 post ,当然还有其他的提交方式,如 pull 、header 、等等。

由form表单里面的Methed属性控制(默认为GET方式)

GET:

①把数据放在协议的头部

②可以在浏览器的地址栏里面看到

③安全性不高

④只能提交最多256个字符

POST:①把数据放在协议的体部

  ②不可以在浏览器的地址栏中看到

  ③安全性高

  ④数据的长度是没有限制的

  ⑤明确指定使用POST提交,否则默认都用GET

B.拿到你在form表单里面填写的各项数据

request.getParameter(String key);   //key 为表单中输入框的中的name属性的值

2.乱码问题

原则:字符从编写到显示都采用一种编码

A.控制字符编写的编码

Eclipse中Window->Preferences–>输入 endoding–>可以对各种文件设置编码(css、html、xml、jsp)–>Encoding(GBK、UTF-8)随便选一个

这样的话你新建出来的文件的编码格式就为你设置的编码格式了。

B.数据传输上控制

request.setCharacterEncoding(“UTF-8”);

response.setCharacterEncoding(“UTF-8”);

C.request接收表单提交中文参数乱码问题解决

get方式提交表单:

    对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白),默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。

    解决办法:

        1) 在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
String name = request.getParameter("name");//接收数据
name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request

对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题

        2) server.xml中配置

            URIEncoding=utf-8

D.浏览器显示的乱码

//告诉浏览器发送过去的内容是什么类型的,并用什么编码格式解析
response.setHeader("content-type","text/html;charset=utf-8");

E.数据库中的乱码

存的时候是什么编码方式,那么取的时候就是什么编码格式

3.路径问题

相对路径:相对点—->相对当前访问的路径

绝对路径:全路径 —->/

1.在servlet后台中,/代表web应用的路径 WebContent

2.在前台中,/代表的是服务器根目录  webapps

4.跳转问题

假设 com.briup.servlet 包下有两个Servlet:

AServlet--->url-partern: /a

BServlet--->url-partern: /b

一、服务器的内部跳转

特点:

    ①浏览器的地址不会发生改变

    ②可以携带数据跳转

    ③只能访问Web应用内部的数据

如果浏览器请求a,而a请求b,b在相应浏览器,浏览器只请求了一次,所以地址不会发生变化。

两步:

1)获取跳转分发器(跳转转发器)

a.通过request获取分发器

    request.getRequestDispatcher("/a");

b.可以从上下文获取分发器

    getServletContext().getRequestDispatcher("/b");

/表示的是项目的根目录即WebContent

2)进行跳转

a.forword:清空前一个response的数据

b.include:保留前一个response的数据

二、.重定向跳转

response.sendRedirect("/dispatcher2");
特点:

    ①地址栏发生了改变

    ②没拿到request传递的数据

    ③可以访问外部资源的

如果浏览器请求a,而a返回叫浏览器访问b,就再发出请求b,b再相应,浏览器发出了两次请求,所以浏览器地址栏会发生变化。

举个例子:

假设请求地址为:http://localhost:8888/week2/one/a.jsp

而 a.jsp中是这样

<a href="loginServlet">aa</a>

当你点击aa的时候,地址变成 http://localhost:8888/week2/one/loginServlet 因为这是相对路径,并且a.jsp的路径为 http://localhost:8888/week2/one/

如果 a.jsp是这样的

<a href="/loginServlet">aa</a>

当点击aa的时候,地址变成 http://localhost:8888/loginServlet 因为/代表webapp即 http://localhost:8888/

注意:

如果想要访问在WEB-INF中的页面或者文件,必须使用内部跳转,因为WEB-INF是一个安全目录,不能直接访问。

如:请求地址:http://localhost:8888/week2/oneServlet 现在需要访问 WEB-INF/jsp/one.jsp

在oneServlet 中使用内部跳转

request.getRequestDispatcher("WEB-INF/jsp/one.jsp").forward(req,resp);

因为这是相对路径,而oneServlet 的路径为 http://localhost:8888/week2/,所以one.jsp 的地址为 http://localhost:8888/week2/WEB-INF/jsp/one.jsp,但是不能直接访问哦,因为WEB-INF是安全目录。

5.三大数据存放对象

ServletContext------application
    一直存在于项目中,直到项目被关闭
    application.setAttribute();

HttpServletRequest-----request
    request.setAttribute();
    存在于一次请求中

HttpSession-----session
    存在与会话期间
    session.setAttribute();

前台向后台传值

    <form action="loginServlet">
        <input name="username" type="text"/>
        <input name="aaa" type="text"/>
        <input type="submit">
    </form>

    <a href="loginServlet?username=terry&aaa=123">登陆</a>

    LoginServlet中代码{
        request.getParameter("");
    }

后台向前台传值(域)

ServletContext
    配置信息

HttpSession
    登陆信息

HttpServletRequest
    请求信息

6.Cookie & Session

1) Cookie

    Cookie在服务器端产生的,以文件的形式保存在客户端的,客户端每次发送请求,都会将相应的Cookie发送给服务器端

    过程:
        1.在服务器端创建Cookie对象

        new Cookie("name", "briup");

        Cookie里面只能存放String类型

        2.发送给本地、客户端保存起来。

        response.addCookie(c);

        3.查询Cookie,request

        request.getCookies();


    cookie的存活期:默认为-1
        会话Cookie:把Cookie保存到浏览器上,当存活期为负数,所以只要一关闭浏览器,Cookie就没有了
        持久Cookie:把Cookie保存到文件中,当存活期为正数,单位为秒
        设置存活期:c.setMaxAge(int seconds);

2) session

    创建于服务器端,保存于服务器,维护于服务器端,每创建一个新的Session,服务器端都会分配一个唯一的ID,并且把这个ID保存到客户端的Cookie中,保存形式是以JSESSIONID来保存的。

    步骤:

        1.创建Session
        HttpSession s = request.getSession();

        2.放数据
        session.setAttribute("name", "钦总");

        3.取数据
        session.getAttribute("name");

让Session失效

    1.关闭浏览器的时候

    2.session.invalidate();

    3.设置session的最大存活期
        a.session.setMaxInactiveInterval(10); 单位为秒
          10:不活动时间(发呆时间)
        b.  在servers中的web.xml的
            <session-config>
                <session-timeout>30</session-timeout>
            </session-config>
            单位为分钟(默认为20分钟)


当浏览器被禁用,session不能使用的时候,就采用重写URL,就是在URL地址后加上JSESSIONID
String url = response.encodeURL(path);
response.sendRedirect(url);