• 转发和重定向


    1.转发 
    一个web组件(servlet/jsp)将未完成的处理交给另外一个web组件继续做。
    比如,一个servlet将处理结果转发给一个jsp来展现。
    2.如何转发
    step1,绑定数据到request上。
    request.setAttribute(String name,Object obj);
    注:
    根据绑定名获得绑定值。
    Object request.getAttribute(String name);
    step2,获得转发器
    RequestDispatcher rd = request.getRequestDispatcher(String uri);
    uri:转发的地址。
    step3,转发
    rd.forward(request,response);
    3.转发的特点
    a.转发之后,浏览器地址栏的地址不变。
    b.转发地址有限制(必须是同一个应用)。

    include指令
    告诉容器,在将jsp文件转换成servlet类时,将file属性指定的文件的内容
    插入到指令所在的位置。
    比如:<%@include file="header.jsp"%>

    处理servlet运行时产生的异常
    (1)编程式处理
    step1,捕获异常
    step2,转发
    比如:
    request.setAttribute("error_msg","系统繁忙,稍后重试");
    request.getRequestDispatcher("error.jsp").forward(request,response);
    (2)声明式处理(即交给容器来处理) 
    step1,捕获异常,然后抛出异常给容器。
    step2,配置异常处理页面
    <error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/error.jsp</location>
    </error-page>
    声明式异常常常用来处理系统异常(异常发生之后不能回复,比如数据库服务停止),发生这类异常之后,提示用户稍后重试即可。
    编程式异常(转发的方式)更灵活,可以用来处理应用异常(比如,用户输入错误的密码等)。


    比较转发与重定向
    (1)转发所涉及的各个web组件可以共享同一个request对象;重定向不可以。
    注:
      容器收到请求之后,会创建request对象和response对象,当相应发送完毕,容器会立即删除request对象和response对象。
    也就是说,request对象和response对象的生存时间是一次请求和响应期间。重定向是两次请求。
    (2)重定向之后,浏览器地址栏的地址会变,但是转发不会变。
    (3)重定向地址是任意的,而转发地址必须是同一个应用。
    (4)转发是一件事未完成,而重定向是一件事已经完成。 

    路径问题
    链路地址,表单提交地址,重定向,转发这四种情况下,如果填写路径。
    <a href=""></a>
    <form action="">
    response.sendRedirect("");
    request.getRequestDispatcher("");
    (1)相对路径
    不以"/"开头的路径
    (2)绝对路径
    以"/"开头的路径。
    (3)如何写绝对路径
    链接地址,表单提交地址,重定向从应用名开始写;
    转发从应用名之后开始写。 
    注:
    要使用String request.getContextPath();来获得实际部署时的应用名。


    转发与重定向的区别
    (1)能否共享request
    转发可以,而重定向不行。
    注:
    容器收到请求之后,会创建request和response,
    当响应发送完毕,会销毁这两个对象。
    (2)浏览器地址栏的地址有无变化
    转发无变化,而重定向有变化。
    (3)目的地有无限制
    转发有限制(同一个应用),而重定向无限制。

    状态管理
    (1)什么是状态管理
    将浏览器与web服务器之间的多次交互作为一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
    (2)cookie
    1)什么是cookie?
    服务器临时保存在浏览器端的少量的数据。
    2)工作原理
    当浏览器访问服务器时,服务器可以将少量数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据临时保存下来。
    当浏览器再次访问服务器,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
    3)添加cookie
    Cookie c = new Cookie(String name,String value);
    response.addCookie(c); 
    4)读取cookie
    Cookie[] cookies = request.getCookies();
    String cookie.getName();
    String cookie.getValue();
    5)编码问题
    cookie只能保存合法的ASCII字符,对于中文,需要将其转换成相应的ASCII
    字符的表示形式。
    URLEncoder.encode
    URLDecoder.decode
    注:
    添加cookie时,建议最好统一编码处理。
    6)生成时间问题
    缺省情况下,浏览器会把cookie一直保存,只要浏览器不关闭,cookie就会一直存在,浏览器关闭,cookie就会被销毁。
    setMaxAge(int seconds)
    注:
    单位是秒。
    seconds > 0 浏览器会将cookie保存在硬盘上,如果超过了指定的时间,则cookie会被删除。
    seconds < 0 缺省值
    seconds = 0 删除cookie
    比如,要删除一个名词为“cart”的cookie,
    Cookie c = new Cookie("cart","");
    c.setMaxAge(0);
    respongse.addCookie(c);
    7)路径问题
    a.什么是cookie的路径问题
    浏览器在向服务器上的某个地址发请求时,会比较该地址是否符合cookie的路径的要求,只有符合条件的cookie才会被发送出去。
    b.cookie的默认的路径
    等于添加该cookie的组件(servlet/jsp)的路径。
    比如,/web07/biz01/addCookie.jsp添加一个名称为
    "cart"的cookie,则该cookie有一个默认的路径("/web07/biz01/")。
    c.匹配规则
    请求地址必须等于cookie的路径,或者是其子路径。
    /web07/findCookie1.jsp no
    /web07/biz01/findCookie2.jsp yes
    /web07/biz01/sub/findCookie3.jsp yes 
    e.cookie只能保存字符串。

  • 相关阅读:
    leetcode Power of Two
    Lowest Common Ancestor of a Binary Search Tree
    Lowest Common Ancestor of a Binary Tree
    leetcode Delete Node in a Linked List
    leetcode Search a 2D Matrix II
    leetcdoe Valid Anagram
    leetcode Add Digits
    leetcode Single Number III
    leetcode Ugly Number
    leetcode Ugly Number II
  • 原文地址:https://www.cnblogs.com/crazypokerk/p/8986768.html
Copyright © 2020-2023  润新知