zoukankan      html  css  js  c++  java
  • Java Servlet总结整理(二)

    章节:

    Java  Servlet总结整理(一)

    Java  Servlet总结整理(二)   

    Java Servlet总结整理(三)

     Java Servlet总结(四) 综合运用案例

     

    转发与重定向:

    1、实现页面跳转所用到的知识点:

    转发、

    转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理.

    如何实现页面跳转、

    在调用业务逻辑的Servlet中,编写以下代码 requestl.getRequestDispatcher("/目标URL-pattern").forward(request, response);

    使用forward跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求。

    2、request作用域实现数据传递

    业务逻辑得到的数据结渠如何传递给显示结果的Scrvlct ,这个还是与请求有关

    forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据

    ··request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)。

      可以将数据存入request后,在一次请求过程中的任何位置进行获取

      可传递任何数据(基本数据类型、对象、数组、集合等)

    ··存数据:request.setAttribute(key,value);

      以键值对形式存储在request作用域中。key为string类型,value为object类型。

    ``取数据:request.getAttribute(key);

      通过string类型的key访问object类型的value

    3、转发的特点    

    转发是服务器行为

    转发是浏览器只做了一次访问请求。

    转发浏览器地址不变

    转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递、

    转发只能将请求转发给同一个web应用中的组件

    4、重定向    

    .客户端做了两次请求,请求到 “a” 页面,a页面响应一个新的页面请求地址。地址栏也会随着发生变化

    重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址发送新请求。

    4.1、重定向页面跳转    

    在调用业务逻辑的servlet中,编写以下代码e response.sendRedirect("目标URI");

    ·URI:统一资源标识符(Uniform Resource ldentifier),用来表示服务器中定位一个资源,资源在web项目中的路径(/project/source)

    4.2、数据传递

     sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求

    . response没有作用域,两次request请求中的数据无法共享  response只能传递String类型的数据,明文传递 (url?username=admin) ?问号后面拼接,request作用域可以传递任意类型数据

    .传递数据:通过URIl的拼接进行数据传递("/WebProject/b?username=tom");  

    .获取数据: request.getParameter("username");

    4.3、重定向特点

    重定向是客户端行为。

    ·重定向是浏览器做了至少两次的访问请求。

    .重定向浏览器地址改变。

    ·重定向两次跳转之间传输的信息会丢失(request范围)。

    .重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序中的资源、其他站点的资源。

    4.3、转发和重定向总结

    所以我们当两个servlet需要传递数据时,尽量选择forward转发。不建议使用sendRedirect进行传递,明文传递不安全

     5.Servlet的生命周期

    生命周期的四个阶段

    5.1.1 第一步执行实例化

    当用户第一次访问Servlet时。由容器调用Servlet的构造器(构造方法)创建具体Servlet对象,也可以在容器启动之后立刻创建实例,使用下列代码可以设置Servlet是否在服务器启动时就创建。如果是正整数,则启动tomcat时就创建,如果是负数或者不写,则只在你访问时创建

    <load-on-startup>1</load-on-startup>   

    注意:只执行一次

    5.1.2第二部 初始化

    在初始化阶段,init()方法就会调用,这个方法在javax.servlet.Servlet接口中定义,其中,方法以一个ServletConfig类型的对象作为参数。

    注意:同样的我们的init方法也只执行一次

    5.1.3 服务

     当客户端有一个请求时,容器就会将请求Servlet Request与响应ServletResponse对象转给Servlet,以参数的形式传给service方法,多次接受请求,响应方法。

    此方法与其他不同,此方法会执行多次

    5.1.4 销毁  

     当Servlet容器停止或者重新启动都会引起销毁Servlet对象并调用destory方法

    此方法只会执行一次

    生命周期流程图

    6.Servlet特性

    6.1Servlet线程安全问题

    Servlet在访问之后,会执行实例化操作,创建一个Servlet对象,而我们Tomcat容器可以同时多个线程并发访问同一个Servlet,如果方法中对成员变量做修改操作,就会有线程安全的问题

    6.2 如何保证线程安全

    synchronized

      将存在线程安全问题的代码放在同步代码块中

    实现SingleThreadModel接口

      servlet实现SingleThreadModel接口后,每个线程都会创建Servlet实例,这样每个客户端请求就不存在共享资源的问题,但是servlet响应客户端请求的效率太低,所以已经被淘汰

    尽可能地使用局部变量

    7.状态管理

    7.1现有问题

    HTTP协议是无效的,不能保存每次提交的信息

    如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有关系

    对于那些需要多次提交数据才能完成的Web操作,例如登录,就成问题了

    7.2概念

    将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及到的数据(即状态)保存下来

    7.3状态管理分类

    客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术

    服务器状态管理技术:将状态保存在服务器端。代表性的是Session技术(服务器传递sessionID时需要使用Cookie的方式)

    8.Cookie的使用

    8.1 什么是Cookie

    Cookie是在浏览器访问Web服务器时的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据

    一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给web服务器

    一个Cookie主要由标识该信息的名称(name)和值(value)组成

    8.2创建Cookie

            //新建一个cookie
            Cookie cookie = new Cookie("username" , "taotao");
            Cookie cookie2= new Cookie("password" ,"123456");
            //Cookie访问路径
            cookie.setPath("/tao");
            //该项目下所有地方都可被访问cookie
            cookie2.setPath("");
            //设置cookie过期时间,也叫内存存储,取值有三种:>0有效期,单位秒
            //=0 浏览器关闭 cookie过期  <0 内存存储,默认-1
            cookie.setMaxAge( 60*60 );
            cookie2.setMaxAge(60*60);
            //将cookie添加到response对象中,响应时发给客户端
            resp.addCookie(cookie);
            resp.addCookie(cookie2);

    8.3获取Cookie

     //创建一个Cookie数组  Cookie可以有多个 通过request对象获取所有的Cookie
            Cookie[] cookies = req.getCookies();
            //遍历所有的cookie
            if(cookies!=null){
                for (Cookie cookie : cookies){
                    System.out.println(cookie.getName() + ":" + cookie.getValue());
                }
            }

     8.4修改Cookie

          //新建一个Cookie
            Cookie cookie = new Cookie("username" , "admin");
            //访问路径要和你要修改的Cookie的路径一样  这样新的Cookie才会覆盖老的Cookie 达到修改的目的
            cookie.setPath("/tao");
            //设置Cookie有效期
            cookie.setMaxAge(60*60);
            //让浏览器添加Cookie
            resp.addCookie(cookie);

    8.5Cookie编码与解码

    Cookie不支持中文,只能包含ASCll字符,所欲Cookie需要对Unicode字符进行编码,否则会出现乱码

    编码

    Cookie cookie = new Cookie(URLEncoder.encode("姓名", "UTF-8"),URLEncoder.encode("张三","UTF-8"));

    解码

    System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") + ":" + URLDecoder.decode(cookie.getValue(),"UTF-8"));

    需要注意的是 编码的时候用的是

    URLEncoder.encode();

    解码的时候用的是

    URLDecoder.decode();

    9Cookie的总结

    优点 :

    可以配置到期规则   可配置到期时间

    简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对

    数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的。

    缺点:

    大小受到限制 :大多数浏览器对cookie的大小有4K,8k的限制

    用户配置为禁用:有些用户禁用了浏览器或者客户端设备接收Cookie的能力,限制了这一功能

    潜在的安全风险:Cookie可能被篡改。会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败

    但是如果说做一些简单的基础的应用可以使用Cookie  浏览器端不能禁用Cookie

  • 相关阅读:
    Linux运维工程师需要掌握什么才能胜任工作呢
    我眼中的Linux系统和红帽RHCE认证
    Linux系统从零到高手的进阶心得
    我在大学毕业后学习Linux系统的心得经验
    装RAC跑脚本报错
    Oracle rac11g 安装报INS41112
    Oracle升级11.2.0.3-11.2.0.4(Windows)
    防存储掉线安装监控软件
    跨平台迁移数据库windows-Linux
    linux crontab -e生成日期格式
  • 原文地址:https://www.cnblogs.com/wdyjt/p/14232425.html
Copyright © 2011-2022 走看看