回到顶部
您的当前位置: 编程语言> JAVA> JAVA基础> WEB开发
Servlet技术-请求重定向与请求转发(一)
2014-04-22 10:20:49
标签: 原创 Servlet 开发 请求重定向 请求转发

    在Servlet程序中,有时需要调用另外一个资源来对浏览器的请求进行响应,这可以通过两种方式来实现:其中一种是调用RequestDispatcher.forward方法实现的请求转发;另外一种则是调用HttpServletResponse.sendRedirect方法实现的请求重定向.

RequestDispatcher接口

    RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个被其他资源调用的资源(例如:servlet,html文件,JSP文件等),并可以通过其中的方法来将客户端的请求转发给所包装的资源.

    RequestDispatcher接口中定义了两个方法:forward方法和include方法,他们分别用于将请求转发到RequestDispatcher对象封装的资源和将RequestDispatcher对象封装的资源作为当前响应内容的一部份包含进来. Forward和include方法接收的两个参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象,或者是对它们进行了包装的ServletRequestWrapper或ServletResponseWrapper对象,以便调用和被调用的两个资源共享相同的ServletRequest和ServletResponse对象.

ServletContext.getRequestDispatcher()方法

    该方法返回包装了某个路径所指定的资源的RequestDispatcher对象,传递给该方法的路径字符串必须以”/”开头,这个”/”代表的是当前Web应用程序的根目录.WEB-INF目录中的内容对RequestDispatcher对象是可见的.所以,传递给getRequestDispatcher方法的资源可以是WEB-INF目录中不能被外界访问的文件.

ServletContext.getNamedDispatcher()方法

    该方法返回了包装某个Servlet或JSP文件的RequestDispatcher对象,传递给该方法的参数是在Web应用程序部署描述符中为Servlet或JSP文件指定的友好名称.

ServletRequest.getRequestDispatcher()方法

    在ServletRequest接口中也定义了一getRequestDispatcher方法获得RequestDispatcher对象,它与ServletContext.getRequetDispatcher方法的区别在于:传递给这个方法的参数除了可以采用以”/”开头的路径字符串,还可以采用非”/”开头的相对路径.RequestDispatcher对象只能包装当前Web应用程序中的资源,所以,forward方法和include方法只能在同一个Web应用程序内的资源之间转发请求和实现资源包含.

用include方法实现资源包含

    RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来.被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略.在调用RequestDispatcher.include方法时,Servlet容器不会去调整HttpServletRequest对象中的信息,HttpServletRequest对象仍然保持其初始的URL路径和参数信息,也就是说,在被调用者程序中检索当前访问路径时,得到的结果是调用者程序URL路径,而不是被调用者程序自己的URL路径.

includingServlet.java
public class IncludingServlet extends HttpServlet{
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
	PrintWriter out=response.getWriter();
	String china="2008是中国的奥运年";
	RequestDispatcher rd=getServletContext().getRequestDispatcher("/includedServlet?p1="+china);
	out.println("before including..........."+"<br>");
	rd.include(request,response);
	out.println("after including............"+"<br>");
	out.close();
    }
}

public class IncludedServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse   response)         throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
	response.setCharacterEncoding("UTF-8");
	PrintWriter out=response.getWriter();
	out.println("<h2>努力学习!!!!</h2>"+"<br>");
	//返回请求行中的资源名部分
	out.println("URI:"+request.getRequestURI()+"<br>");
	//返回请求行中的参数部分,也就是资源路径后面的问号(?)以后的所有内容
	out.println("QueryString :"+request.getQueryString()+"<br>");
	//返回传递过来的参数值
	out.println("Parameterp1:"+request.getParameter("p1")+"<br>");	
    }	
}