Servlet-03- 的转发和包含
2017-12-27 09:46
253 查看
参考:http://blog.csdn.net/al_assad/article/details/76086839
Servlet 的转发和包含
1、尽管一个 Servlet 无法直接调用另一个 Servlet 的 service(),但是Servelt 规范为 Web 组件之间的协作提供了2种途径:
请求转发: Servlet(源组件)先对客户端请求进行一些预处理,然后将请求转发给其他的 Web 组件(目标组件,通常是JSP页面),来完成生成响应结果在内的后续操作;
包含:Servlet(源组件)把其他的 Web 组件(目标组件,可以是 HTML,Servlet类,JSP)生成的响应结果包含到自身的响应结果中;
2、Servlet 模型中对组件进行转发和包含,主要是依靠 javax.servlet.RequestDispatcher类,这2过程类似于原生 php 的 header() 和 include() 函数;
3、一个 Servlet 对象的 RequestDispatcher 对象可以通过 2种方法获取:
1)该Servlet的 ServletContext对象 的 getRequestDispatcher(url) 函数获取;
2)该Servlet service()方法参数中的 ServletRequest对象 的 getRequestDispatcher(url) 函数获取;
4、RequestDispatcher的 forward、include 方法
以下是RequestDispatcher的这2部分的API:
① forward() 方法的处理流程如下:
清空调用方法的 Servlet 用于存放响应正文的缓冲区;
如果转发目标组件为 Servlet 或 JSP,就调用它们的 service() 方法,把响应结果发送到客户端;如果转发页面为 HTML 文档,就读取文档中的数据并发送到客户端;
② include() 方法的处理流程如下:
如果源组件为 Sevlet 或 JSP,就调用它们相应的 sevice() 方法,把方法产生的响应正文添加到源组件的响应结果中;如果该目标组件为 HTML 文档,就把文档的内容添加到响应结果中;
返回源组件的服务方法中,继续执行后续代码;
5、请求范围
请求范围指服务器端响应一次客户请求的过程,从Servlet 容器接收到第一个客户请求开始,到返回响应结果结束;
请求范围在具体实现上与ServletRequest,ServletResponse 对象的生命周期对应;
当源组件和目标组件之间为请求转发/包含关系时,对于每一个客户端请求,它们都共享一个 ServletRequest 和 ServletResponse 对象,因此请求范围内的共享数据可以作为 ServletRequest 的 attribute 存在,在请求方位内的各个组件,可以通过 SevletRequest 的 getAttribute(),setAttribute()
方法共享数据;
6、以下进行简单的代码示例
login.html提交一个表单数据给CheckServlet,CheckServlet检查提交的表单数据是否为空,将相应的信息写入请求范围后,转发到OutputServlet产生响应正文,OutputServlet中包含WelcomeServlet产生的响应正文(html开头部分);
login.html
CheckSevlet.java
WelcomeServlet.java
OutputServlet.java
web.xml
Servlet 的转发和包含
1、尽管一个 Servlet 无法直接调用另一个 Servlet 的 service(),但是Servelt 规范为 Web 组件之间的协作提供了2种途径:
请求转发: Servlet(源组件)先对客户端请求进行一些预处理,然后将请求转发给其他的 Web 组件(目标组件,通常是JSP页面),来完成生成响应结果在内的后续操作;
包含:Servlet(源组件)把其他的 Web 组件(目标组件,可以是 HTML,Servlet类,JSP)生成的响应结果包含到自身的响应结果中;
2、Servlet 模型中对组件进行转发和包含,主要是依靠 javax.servlet.RequestDispatcher类,这2过程类似于原生 php 的 header() 和 include() 函数;
3、一个 Servlet 对象的 RequestDispatcher 对象可以通过 2种方法获取:
1)该Servlet的 ServletContext对象 的 getRequestDispatcher(url) 函数获取;
//假设目标 Servlet 的映射url为 /hello,名称为 hello public class DemoServlet extends GenericServlet{ public void service(ServletRequest request,ServletRseponse reponse){ ServletContext context = getServletContext(); RequestDispatcher dispatcher = context.getRequestDispatcher("/hello"); } }
2)该Servlet service()方法参数中的 ServletRequest对象 的 getRequestDispatcher(url) 函数获取;
//假设目标 Servlet 的映射url为 /hello,名称为 hello public class DemoServlet extends GenericServlet{ public void service(ServletRequest request,ServletResponse reponse){ RequestDispatcher dispatcher = request.getRequestDispatcher("hello"); } }
4、RequestDispatcher的 forward、include 方法
以下是RequestDispatcher的这2部分的API:
forward(ServletRequest request, ServletResponse response) | 将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。此方法允许一个 servlet 对请求进行初步处理,并使另一个资源生成响应; |
include(ServletRequest request, ServletResponse response) | 包含响应中某个资源(servlet、JSP 页面和 HTML 文件)的内容。事实上,此方法支持编程式服务器端包含。 |
清空调用方法的 Servlet 用于存放响应正文的缓冲区;
如果转发目标组件为 Servlet 或 JSP,就调用它们的 service() 方法,把响应结果发送到客户端;如果转发页面为 HTML 文档,就读取文档中的数据并发送到客户端;
② include() 方法的处理流程如下:
如果源组件为 Sevlet 或 JSP,就调用它们相应的 sevice() 方法,把方法产生的响应正文添加到源组件的响应结果中;如果该目标组件为 HTML 文档,就把文档的内容添加到响应结果中;
返回源组件的服务方法中,继续执行后续代码;
5、请求范围
请求范围指服务器端响应一次客户请求的过程,从Servlet 容器接收到第一个客户请求开始,到返回响应结果结束;
请求范围在具体实现上与ServletRequest,ServletResponse 对象的生命周期对应;
当源组件和目标组件之间为请求转发/包含关系时,对于每一个客户端请求,它们都共享一个 ServletRequest 和 ServletResponse 对象,因此请求范围内的共享数据可以作为 ServletRequest 的 attribute 存在,在请求方位内的各个组件,可以通过 SevletRequest 的 getAttribute(),setAttribute()
方法共享数据;
6、以下进行简单的代码示例
login.html提交一个表单数据给CheckServlet,CheckServlet检查提交的表单数据是否为空,将相应的信息写入请求范围后,转发到OutputServlet产生响应正文,OutputServlet中包含WelcomeServlet产生的响应正文(html开头部分);
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <form method="POST" action="check"> <label>Input your name : </label><input type="text" name="name" /><br/> <input type="submit" name="submit" value="submit"> </form> </body> </html>
CheckSevlet.java
public class CheckServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse reponse) throws ServletException,IOException{ //获取来自login.html提交的表单,获取数据进行判断后转发给结果输出 String name = request.getParameter("name"); String msg = ""; if(name.isEmpty()) msg = "Please input the name"; else msg = "Hello,"+name; request.setAttribute("msg",msg); //向请求范围写入msg键值 //页面请求转发 ServletContext context = getServletContext(); RequestDispatcher dispatcher = context.getRequestDispatcher("/output"); //or RequestDispatcher dispatcher = request.getRequestDispatcher("output"); dispatcher.forward(request,reponse); } }
WelcomeServlet.java
public class WelcomeServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { servletResponse.setContentType("text/html;charset=UTF=8"); PrintWriter out = servletResponse.getWriter(); out.println("<html><head><title>welcome</title>"); out.println("<body><h1>Welocme</h1>"); out.println("<p>Date"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+"</p>"); } }
OutputServlet.java
public class OutputServlet extends GenericServlet{ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //页面请求写入 include,向响应正文写入html前半段 ServletContext context = getServletContext(); RequestDispatcher dispatcher = context.getRequestDispatcher("/welcome"); dispatcher.include(servletRequest,servletResponse); //最终输出 String msg = (String)servletRequest.getAttribute("msg"); PrintWriter out = servletResponse.getWriter(); out.println("<p>"+msg+"</p>"); out.println("</body></html>"); servletResponse.flushBuffer(); out.close(); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>check</servlet-name> <servlet-class>control1.CheckServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>check</servlet-name> <url-pattern>/check</url-pattern> </servlet-mapping> <servlet> <servlet-name>welcome</servlet-name> <servlet-class>control1.WelcomeServlet</servlet-class> </servlet>s <servlet-mapping> <servlet-name>welcome</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping> <servlet> <servlet-name>output</servlet-name> <servlet-class>control1.OutputServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>output</servlet-name> <url-pattern>/output</url-pattern> </servlet-mapping> </web-app>
相关文章推荐
- 03. Servlet 的转发和包含
- Servlet 转发、包含、重定向对比
- 【Java.Web】Servlet —— 请求的转发和包含
- 多个servlet之间的跳转(转发、重定向、请求包含)的总结
- servlet---知识点深化---重定向/转发/字节流字符流共存问题/多个servlet输出问题/请求包含
- Servlet之转发与包含
- Servlet 转发、包含和重定向
- 重定向、转发、请求包含、同一个servlet中字符字节流共存问题相关的一些知识点
- servlet获取表单提交的数据、请求转发、请求包含、请求重定向
- javaweb servlet转发,包含,重定向; jsp转发,包含
- javaEE------------------有关servlet的一些细节(输出流以及转发、重定向和请求包含)
- servlet请求转发、包含以及重定向
- Servlet中的请求转发与包含
- servlet请求转发的三种方式,请求转发与重定向以及包含
- Servlet中的站内转发、重定向以及请求包含
- Servlet第三方jar包使用3(Servlet获取form表单中的多有元素以及,请求转发,请求重定向,请求包含)
- servlet请求转发、包含以及重定向
- Servlet入门介绍第四章——Servlet中的请求转发、包含、重定向
- Servlet请求转发与包含
- servlet转发、包含详解(七)