Servlet笔记 第三天
一、复习
1. client发送请求的方式
1) 地址栏手工输入程序地址(访问首页)
2) 点击超链接 href=“目标资源的路径( uri — /应用名/相对路径 )”
3) 点击表单的提交按钮 action=“目标资源路径(uri)”
2. servlet程序生命周期
1) tomcat只会为servlet程序创建一个对象,默认在第一次请求到达时创建
2) 可以认为设置servlet程序的初始化时机 : 通过标签 load-on-startup来设置 “正整数”
3) servlet程序的线程安全问题: servlet程序尽量不要定义实例变量, 非用不可加synchronized
二. 多个servlet配合完成用户需求
1. 配合方式(两种) 【重点】
1)请求转发 forward
2) 请求重定向 redirect
2. 请求转发 forward
1)代码 — 在第一个程序里添加如下代码
~~~java
RequestDispatcher rd = request.getRequestDispatcher(“下一个程序的url-pattern网名”);
rd.forward( request,response );
~~~
2)forward工作方式的特点
① forward连接的多个servlet程序有明显的先后顺序,形成工作流,在这个流程中,只有最后一个servlet有
权向client输出结果内容,前面servlet的输出一律清空
② forward连接的多个servlet程序处于一个请求的生命周期
③ forward动作发生在服务器内部,浏览器不知晓,最终导致地址栏和网页内容不匹配
④ 可以使用request作用域传递数据
⑤ forward方式不能在两个应用的程序之间跳转(不能跨应用, 不能跨域)
3) 关于forward过程中数据的传递问题
在forward连接的两个程序间可以使用request对象来传递数据,request本身又是一个存储空间(作用
域),可以存放起了名字的值(命名属性)
① 存数据 : request.setAttribute( “name” — String , value — Object );
② 取数据: Object value = request.getAttribute( “name” );
3. 请求重定向 redirect
1) 特点
① 重定向redirect连接的两个servlet程序处于两个请求的生命周期
② 第二次请求是浏览器根据第一次请求的响应自动发出的, 会导致浏览器地址栏发生改变
③ 不能使用request作用域传递数据( 整个过程是两个请求)
④ 可以跨域(在两个不同应用的程序之间跳转)
2) 代码
response.sendRedirect( " 下一个程序的uri ");
3) 数据传递
① 一般情况下,不需要数据传递
② 可以人为模拟表单的get提交方式,将数据直接拼接到地址后面传递
response.sendRedirect( “uri?name=value&name=value”);
接收: request.getParameter(“name”)
注意: 这种数据传递方式同时适用于超链接数据传递
4. forward和redirect异同点
1)相同: 代码运行后都可以使得程序的流程由AServlet跳转到Bservlet程序运行
2)不同: forward(一个请求,地址栏不变) , redirect(两个请求,地址栏变化)
3)使用选择:
① 如果当前程序执行结束,功能没有彻底完成 or 有大量数据需要传递,则选择 forward 跳转
② 如果当前程序执行结束, 功能已经完成(下一个程序涉及其他功能),选择 redirect 跳转
③ 无法确定,优选 redirect