Servlet跳转
从一个JSP或者是一个HTML页面可以通过表单或超链接跳转进Servlet,那么从Servlet也可以跳转到其他的Servlet、JSP或其他页面。
关于跳转,之前强调过有两种:
1):客户端跳转:地址栏跳转之后改变,而且无法传递request范围的属性,是在所有的操作都执行完毕之后才发生跳转的操作,语法:response sendRedirect()。
2):服务器端跳转:地址栏不改变,而且可以传递request范围的属性,属于无条件跳转,只要执行到了,则立刻执行跳转操作,语法:<jsp:forword>
Servlet之中也是可以完成跳转的,而且既然Servlet本身已经存在了HttpServletResponse对象,所以,直接通过此对象的sendRedirect()方法就可以完成跳转操作。
Servlet程序跳转的验证程序如下:【ClientRedirectDemo.java】
package com.skewrain.demo2;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ClientRedirectDemo extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
req.getSession().setAttribute("name","斜雨");
req.setAttribute("info","skewrain");
resp.sendRedirect("get_info.jsp");
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
this.doGet(req,resp);
}
}
该Servlet程序的配置信息如下:
<servlet>
<servlet-name>client</servlet-name>
<servlet-class>com.skewrain.demo2.ClientRedirectDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>client</servlet-name>
<url-pattern>/servletforward/ClientRedirectDemo</url-pattern>
</servlet-mapping>
这个程序中,我们在虚拟目录org目录下新建了一个servletforward目录,里面存放该Servlet要跳转进入的JSP文件,所以,在配置该Servlet的时候要特别注意。
【get_info.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>www.baidu.com</title></head>
<body>
<% request.setCharacterEncoding("GBK"); %>
<h2>session属性:<%=session.getAttribute("name")%></h2>
<h2>request属性:<%=request.getAttribute("info")%></h2>
</body>
</html>
首先,我们先执行Servlet:
我们用浏览器打开虚拟目录在“skewrain/”后面加上servletforward/ClientRedirectDemo,结果如下:
可见,浏览器的地址栏发生了改变,已经跳转到了get_info.jsp页面。
此时执行完成之后,可以发现已经将session的属性的内容进行了传递,但是request属性范围并没有传递,因为客户端跳转根本就无法完成request属性的传递。
服务器端跳转(重点)
在Servlet中没有像JSP中的”<jsp:forward>”指令,所以,如果要想执行服务器端跳转的话,就必须依靠RequestDispatcher接口完成,此接口中提供了如下的两个方法:
Public void forward(ServletRequest request,ServletResponse response)throws ServletException,IOException
Public void include(ServletRequest request,ServletResponse response)throws ServletException,IOException
使用RequestDispather接口的forward()方法就可以完成跳转功能的实现,但是如果要想使用此接口还需要使用ServletRequest接口提供的如下方法进行实例化
Public RequestDispatcher getRequestDispatcher(String path)。
在JSP中存在了<jsp:forward>,但是在Servlet之中,此操作并不存在,所以必须依靠RequestDispather接口。
但是现在的一个问题是RequestDispather是一个接口,那么如果要想使用此接口必须为其进行接口的对象实例化操作,但是此时只能依靠ServletRequest接口才可以完成。
在ServletRequest接口中,存在如下方法:
RequestDispatcher getRequestDispatcher(String path)。
服务器端跳转的演示程序如下:【ServerRedirectDemo.java】
package com.skewrain.demo2;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServerRedirectDemo extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
req.getSession().setAttribute("name","斜雨");
req.setAttribute("info","skewrain");
RequestDispatcher rd = req.getRequestDispatcher("get_info.jsp"); //准备好了跳转操作
rd.forward(req,resp); //完成跳转
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
this.doGet(req,resp);
}
}
配置的xml文件如下:
<servlet>
<servlet-name>server</servlet-name>
<servlet-class>com.skewrain.demo2.ServerRedirectDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>server</servlet-name>
<url-pattern>/servletforward/ServerRedirectDemo</url-pattern>
</servlet-mapping>
Get_info.jsp的内容不变。我们在打开虚拟目录skewrain,在后面输入:servletforward/ServerRedirectDemo,然后回车,产生的结果如下:
而且,地址栏没有发生任何改变。页面跳转成功。
服务器端跳转在实际开发中的应用比率为95%。
小结:
1):两种跳转的区别;
2):服务器端跳转可以传递request范围的属性,而客户端跳转无法传递request范围的属性。