Javaweb学习总结(三)

来源:互联网 发布:淘宝产品为什么下架了 编辑:程序博客网 时间:2024/05/21 17:32

RequestDispatcher接口的概述:

RequestDispatcher是servlet容器创建的一个web资源的包装器,可以用来把当前的request传递到该资源或者把新的资源包括到当前响应中。


public interface RequestDispatcher
定义一个对象,该对象负责在服务器端接收来自客户端的请求并向他们发送资源(例如一个servlet,HTML文件,或者是JSP文件)。servlet容器创建RequestDispatcher对象,用来包装一个给定位置或名字的服务器资源。
该接口被设计于包装servlets,但一个servlet容器可以创建该对象以保证任何类型的资源。

forward()方法概述:
public void forward(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException
推进一个请求到服务器的某个资源(如:servlet,JSP文件,或HTML文件)。该方法允许一个servlet对一个请求作初步处理,而另一个资源将产生响应。
由于一个RequestDispatcher对象是通过getRequestDispatcher()方法获得,ServletRequest对象拥有自己的路径元素和变量以匹配目标资源路径。
forward()方法应该在响应被提交到客户端之前被唤起(在响应主体输出被刷新之前)。如果响应已经被提交,该方法抛出IllegalStateException 。在forward之前,响应未被提交的输出会被自动清理掉。
请求和响应的两个参数必须是与传递给servlet的service()方法相同的对象,或者是由ServletRequestWrapper、ServletResponseWrapper的子类(封装的)对象。

forward的处理方式:首先客户端client对第一个servlet发出一个请求,在第一个servlet里面调用forward方法,于是将这个请求转发到第二个servlet里面,最后由第二个servlet把结果返回给用户。


include()方法概述:
public void include(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException
该方法在响应中包含某些资源的内容(如:servlet,JSP文件,HTML文件)。该方法关键是能包含服务器端的程序。
ServletResponse对象包含来自调用者的保持不变的路径元素和参数。被包含的servlet不能改变响应状态代码或设置头信息;任何制造改变的尝试都会被忽略。
请求和响应的两个参数必须是与传递给servlet的service()方法相同的对象,或者是由ServletRequestWrapper、ServletResponseWrapper的子类(封装的)对象。

include的处理方式:首先客户端发出一个请求,这个请求会请求servlet1,servlet1通过include方法将这个请求转发给servlet2,servlet2处理结束之后将处理结果再发回给servlet1,由servlet1把结果相应给客户。这个过程中servlet1 始终是控制者,servlet2是执行者。


演示代码:

index页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="s1">Dispatcher</a>
</body>
</html>

web页面配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <servlet>
  <servlet-name>s1</servlet-name>
  <servlet-class>com.iotek.jee.servlet.Servlet1</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>s1</servlet-name>
  <url-pattern>/s1</url-pattern>
  </servlet-mapping>
 
  <servlet>
  <servlet-name>s2</servlet-name>
  <servlet-class>com.iotek.jee.servlet.Servlet2</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>s2</servlet-name>
  <url-pattern>/s2</url-pattern>
  </servlet-mapping>
</web-app>

src中的servlet1类:

package com.iotek.jee.servlet;


import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Servlet1 extends HttpServlet {

private static final long serialVersionUID = 5673468877806355401L;


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 使用dispatch的forward方法
// System.out.println("Servlet doget1!");
// resp.setContentType("text/html;charset=UTF-8");
// resp.getWriter().write("<strong>Servlet1</strong><br/>");
// RequestDispatcher res = req.getRequestDispatcher("s2");
// req.setAttribute("test", Math.random());
// res.forward(req, resp);

System.out.println("Servlet doget1!");
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<strong>Servlet1</strong><br/>");
RequestDispatcher res = req.getRequestDispatcher("s2");
res.include(req, resp);
Double d = (Double)req.getAttribute("test");
resp.getWriter().write("include servlet2 double values:" + d);
}

}

SRC中的servlet2类:

package com.iotek.jee.servlet;


import java.io.IOException;


import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Servlet2 extends HttpServlet {

private static final long serialVersionUID = 5673468877806355401L;


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 调用dispatcher的forward的方法
// System.out.println("Servlet2 doget!");
// Double d = (Double)req.getAttribute("test");
// resp.getWriter().write("req attr test" + d + "<br/>");
// resp.getWriter().write("Servlet2 你好 <br/>");

System.out.println("Servlet2 doget!");
// Double d = (Double)req.getAttribute("test");
// resp.getWriter().write("req attr test" + d + "<br/>");
req.setAttribute("test", Math.random());
resp.getWriter().write("Servlet2 你好 <br/>");

}

}

运行结果: