day06 乱码+重定向转发+Cookie

来源:互联网 发布:window10装mac系统 编辑:程序博客网 时间:2024/06/05 00:53

1、常用表单输入域的使用

       radio:如果用户没有选择,服务器端接收到null;选择了,接收到选中的value的值

       checkbox:(已婚)如果用户没有选择,服务器接收到null;选择了:界面上指定了value 属性,得到value的值,没有指定value,得到on。

2、客户端提交的中文数据编码问题

1.客户端当前使用什么编码,就以什么编码给你传递数据。

2.而Servlet请求默认使用ISO-8859-1编码 ,这样很可能会产生乱码问题。

解决办法:告诉服务器程序,客户端使用什么编码方式。

request.setCharacterEncoding("UTF-8"):只对POST请求有效

解决办法:拿到原始字节码(ISO-8859-1),重新编码

newString(name.getBytes("ISO-8859-1"),"UTF-8");

 

3、请求转发和重定向:RequestDispatcher

请求重定向:

特点:

    1.浏览器行为

              2.发出了2次请求

              3.地址栏会变

              4.不共享请求和响应对象

              代码:

                     response.setStatus(302);

                     response.setHeader("Location","/day06/servlet/RequestDemo3");

                     或者

                     response.sendRedirect("/day06/servlet/RequestDemo3");//等同以上2

转发:

 

    特点:

       1.服务端行为

              2.发出了1次请求

              3.地址栏不会变

              4.共享请求和响应对象

       5.不能转发给不同应用的组件

              代码:

                     RequestDispatcher rd = request.getRequestDispatcher("/servlet/RequestDemo3");

                     rd.forward(request, response);

 

       转发注意事项:

 

              源组件à目标组件转发

              转发给目标组件前,容器会清空response对象的所有的输出正文部分。(源组件向      response中写入的所有正文数据都无效)

              转发前请不要刷新response的缓存或关闭输出流

 

       代码:

 

           request.getRequestDispatcher(String path):path必须以"/"(代表当前应用)开头,表 

       示绝对路径。

           ServletContext.getRequestDispatcher(Stringpath):如果以"/"开头,表示绝对路径;如   

       果不以"/"开头,表示相对路径

 

       Tip:

               各种路径的写法

            服务器:/代表当前应用。

         客户端:/day6(需要加应用名)

    例子:

               转发的路径:/就代表当前应用

               重定向的路径:客户端用的/day6

               <a href/>  客户端用的/day6

               <script src=""/>   客户端用的/day6

               <img src=""/>   客户端用的/day6

               <link type="text/css"href=""/>  客户端用的/day6

               <form action=""/>   客户端用的/day6

       示意图:

4、包含:

       RequestDispatcherinclude(ServletRequest request,ServletResponse response)动态包含

       源组件包含目标组件

       目标组件设置的头无效。

5、request域对象

       因为request为局部变量,存活时间只发生在转发的时候,方法调用完之后这个局部变量就会被释放掉。

    存放的内容与request对象的生命周期有关。

      

6、会话概述

用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

 

7、Cookie技术

       1.Cookie深入了解:

              javax.servlet.http.Cookie

          Cookie是一段小数据,可以由服务器写给浏览器,浏览器将此数据存放在自己的

     缓存中。要想传中文,必须编码后才能存(BASE64Encoder

       浏览器再次访问服务器,会带着数据过去。

       2.Cookie的属性:

                 nameCookie的名称。必须有的属性

                 value:唯一的值。取值,必须有

                 path:路径。可选的。默认值:写Cookie的那个程序的主机名后的

           路径。/day06/servlet

                 domain:域。可选的。默认值:写Cookie的那个程序的主机名。

           http://localhost:8080

           age:最大存活时间。可选的。默认是一次会话。

                 version:版本号。可选的。

          comment:可选属性。注释

 

         例子:setPath("/day06/servlet"):访问什么资源时会把Cookie带过来?

                     http://localhost:8080/day06/servlet/ServletDemo1(带)

                     http://localhost:8080/day06/ServletDemo2   (不带)     

3.Cookie的方法

   public Cookie(String name,String value)

               setValue与getValue方法

               setMaxAge与getMaxAge方法 (秒)

               setPath与getPath方法

               setDomain与getDomain方法

              getName方法

 

       4.向客户端写Cookie:

                                   Cookiecookie = new Cookie();

                                   response.addCookie(Cookie c)

                               相当于:response.setHeader("Set-Cookie","name=value");         

              浏览器对于一个网站最多支持20Cookie。总共不能超过300个。且每个Cookie

           的长度不能超过4KB

             

       5.如何获取客户端带来的Cookie:

          Request.getCookies()domain+path+name才能定位。