Servlet详细教程(二)

十三、请求转发

            实现请求转发:请求转发指一个 web 资源受到客户端请求后,通知服务器去调用另一个 web 资源进行处理

            HttpServletRequest对象(也叫Request对象)提供了一个getRequestDispatcher,该方法返回一个RequestDispatcher 对象,

                                       调用这个对象的 forward 方法可以实现请求转发

            Request.getRequestDispatcher(资源地址).forward(request,response);

                                      资源地址:不需要项目名。因为它只是在WEB服务器内部转发。

           实例:由 Servlet1 转发数据到 Servlet2

           1)使用 forward不能转发到web应用 url

           2)因为 forward是发生在web服务器,所以 Servlet1 Servlet 2使用的是用一个requestresponse.

           3)使用sendRedirect() 方法不能通过request.setAttribute() 把 属性传递给下一个Servlet,因为两个 Servlet 的 request 不是同一个。

           4)Request中的Attribute在一次请求有效

                 一次请求:只要没有停止,也没有回到浏览器重定向,就算一次(可以是多个 Servlet 之间依次请求,此时任意一个Servlet都是同一个Attribute)

           5)sendRedirect() 和forward 的区别

                         一个web资源收到客户端请求后,通知服务器去调用另外一个 web 资源进行处理,

                                                                 称为请求转发(因不经过浏览器所以效率比重定向高,推荐使用)(forward)

                        一个web资源收到客户端请求后,通知浏览器去访问另外一个 web 资源,称之为请求重定向sendRedirect()

                         (1)      叫法不同:sendRedirect() 重定向

                                                      forward() 叫转向

                         (2)      实际发生的位置不一样

                                         sendRedirect发生 浏览器

                                         forward 发生 web服务器

                         (3)      用法不一样

                                    request.getRequestDispatcher(“/资源URI”).forward(request,response)

                                    response.sendRedirect(“/web应用/资源URI”);

                         (4)       能够去URL范围不一样

                                     sendRedirect可以去 外边URL

                                     forward 只能去当前的WEB应用的资源

           6)如果转发多次,我们的浏览器地址栏,保留的是第一次 转向的那个ServletUrl

    

十四、会话

          1、基本概念

               指用户开一个浏览器,访问一个网站,只要不关闭浏览器,不管该用户点击多少个超链接,

                                                          访问多少资源,直到用户关闭浏览器,整个过程称为一个会话。

         2、Cookie

               1)功能举例:

                        a)保存用户上次登录时间

                        b)保存用户名密码,下次自动登录

                        c)显示用户浏览历史

                2)特点:

                        a)Cookie是在服务器端创建的。

                        b)Cookie是保存在浏览器这一端的。

                      

                        d)Cookie是可以被多个浏览器共享的。

                        e)一个浏览器最多放入300个cookie,一个站点最多20个cookie 每个cookie大小限制在4K以内。

                        f )Cookie存放时是以明文方式存放的,因此安全性比较低。我们可以通过加密后在保存。

               3)生命周期:

                        a) Cookie生命周期是会话级别的

                        b) Cookie的生命周期可以通过cookie.setMaxAge(2000); 设置(单位为秒)。

                                                     如果不设置,该cookie的生命周期当浏览器关闭时就消亡。

                                setMaxAge(正数) 即多少秒后该cookie失效

                                setMaxAge(0)  删除该cookie

                                setMaxAge(负数),相当于该cookie的生命周期是会话级的

                 4)Cookie存放中文怎么处理

                          

                                 存放时:


String val =java.net.URLEncoder.encode("服务器","UTF-8");

Cookie cookie =new Cookie("uname",val);


                                取出时:


String val =java.net.URLEncoder.decode(cookie.getValue(),"UTF-8");

Out.println("uname="+val);


        3、Session

              1)特点

                      a)Session是存在服务器的内存中的。

                      b)一个用户浏览器,独享一个session对象。

                      c)Session中可以存放多个属性。

                      d)Session可以存放对象。

                      e)如果同一个用户浏览器向Session设置属性时名字相同会替换。

              2)生命周期:

                    a)Session中的属性的默认生命周期是30min,可以通过修改web.xml来修改。

                    b)修改的一个地方是:tomcat/conf/web.xml

<session-config>

<session-timeout>30</session-timeout>

</session-config>

                        对所有的web应用生效。

                   c)第二个地方是:在单个web应用下的web.xml文件下添加或修改ession-config

<session-config>

<session-timeout>10</session-timeout>

</session-config>

                      只对本web应用生效,如果两个配置文件冲突,就以单个web应用的配置为准。

                   d)第三种方法是:session.setMaxInactiveInterval(600);//以秒为单位

                   e)session周期是发呆时间,在失效前访问session,则重新计时

                   f)如果重启 tomcat 或者 reload web 应用,或者关机,session 都会失效

                   g)可以通过函数让 session 失效

                         invalidate() 该方法是让 session 中所有的属性失效,通常用于安全退出

                         如果只希望某个属性失效,使用方法:removeAttribute(name)

           3)验证用户登陆

                 1)封装成一个函数

                 2)过滤器

       4、cookie 与 session 比较

             1)存在的位置

                   Cookie存在客户端的临时文件夹

                   Session存在在服务器内存中,一个session域对象为一个用户浏览器服务。

              2)安全性

                    Cookie是以明文方式存放在客户端的,所以说安全性相对较弱.可以MD5加密再存放。

                    Session是存放服务器内存中的,安全性相对较强。

             3)网络传输量

                   Cookie会传递信息给服务器

                  Session属性值不会传递给客户端。

              4)生命周期

                   Cookie的生命周期是累积时间,即到点就失效。即我们给cookie设置setAge(30);30秒后及失效。

                   Session 的声明周期间隔时间,即从最后一次访问后开始计时。即我们设置Session为20分钟,如果20分钟内没有访问,Session即失效。

                   以下情况Session也会失效

                  A.关闭tomcat

                  B.重启web应用

                 C.时间到

                 D..调用session.invalidate();

            5)使用原则

                 因为Session会占用服务器内存,因此不要往session中存放过多过大的对象。

                 每个站点最多20个cookie 每个cookie大小限制在4K以内。

十五、ServletContext

       1、概念:

             1.ServletContext 是在服务器创建

              2.ServletContext被所有客户端共享

              3.ServletContext 当web应用启动时自动创建,

              4.ServletContext 当web应用关闭 重启动或服务器关闭时都会造成ServletContext销毁

                    对ServletContext的用法小结:


//获取ServletContext的两种方法
this.getServletContext(); 或者 this.getServletConfig().ServletContext();
//添加属性
servletcontext.setAttribute(String , object);
//取出属性
servletcontext.getAttribute("属性名");
//删除
servletcontext.removeAttribute("属性名");

  

          

         2、ServletContext的应用

              1)获取web应用的初始化参数

<!-- 如果希望所有的Servlet都可以访问该配置-->

<context-param>

<param-name>name</param-name>

<param-value>socott</param-value>

</context-param>


                 如何获取

                 String val =this.getServletContext().getInitParameter("name");

                2)  使用ServletContext实现跳转

                      目前跳转到页面有几种方法

                      1 、response.sendRedirect("/web应用名/资源URL");

                      2 、resquest.getRequestDispatcher("/资源URL").forward(resuest,response);

                           区别 1: getRequestDispatcher跳转发生在服务器而sendRedirect跳转发生在浏览器

                                    2: 如果resquest.setAttribute("name","gust");希望下个页面可以使用其属性则用getRequestDispatcher

                                    3: 如果session.setAttribute("uname","顺平");希望下个页面可以使用其属性则用两种方法都可以,

                                          建议使用getRequestDispatcher因为效率高些

                                    4: 如果我们要跳转到本应用外的URL则使用sendRedirect

                   3 、this.getServletContext().getRequestDispatcher("/资源URL").forward(resuest,response);

跟第二种方法一样...


               3)   读取文件,和获取文件的路径


//读取文件

InputStream is =this.getServletContext().getResourceAsStream("dbinfo.properties");

//创建properties

Properties pp = new Properties();

pp.load(is);

Out.println("name="+pp.getProperty("username"));

 

//如果文件在src目录下要用类加载器去读

InputStream is=Servlet类名.class.getClassLoader().getResoureAsStream("dbinfo.properties");

 

//获取文件全路径

Stringpath=this.getServletContext().getRealPath("/imgs/a.jpg");

Out.println("path="+path);


                   防刷新: 用response.sendRedirect("/web应用名/资源URL");跳转能防刷新





          特别说明:如果某个web应用你不需要,请把该web应用从 webapps目录下移走,否则tomcat启动的速度会越来越慢.




《Head First Servlet JSP》 里对Sevlet 也有很多的讲解,可看网上的博客笔记:http://lavasoft.blog.51cto.com/62575/275590

阅读更多
换一批

没有更多推荐了,返回首页