重定向:
在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作。这时,可以使用请求重定向来完成。所谓请求重定向,是指Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。
为了实现请求重定向,HttpServletResponse接口定义了一个sendRedirect()方法,该方法用于生成Location头字段。
通过一个用户登陆的案例,分步骤讲解sendRedirect()方法的使用。
在一个项目的Web目录下编写用户登录的页面login.html和登录成功的页面。
login.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8" content="text/html" http-equiv="Content-Type">
<title>Insert title</title>
</head>
<body>
<!--把表单内容提交到studyclass项目下的LoginServlet-->
<form action="/studyclass/LoginServlet" method="post">
用户名:<input type="text" name="username" /><br />
密 码:<input type="password" name="password" /><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
welcome.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8" content="text/html" http-equiv="Content-Type">
<title>Insert title</title>
</head>
<body>
欢迎你!登陆成功
</body>
</html>
我的项目名是studyclass,login.html和welcome.html我放在了web目录下的denglu包中。
在studyclass项目的classfour包中编写一个名为LoginServlet的类,用于处理用户登录请求
package classfour;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//用HttpServletRequest对象的getParameter()方法获取用户名和密码
String username= request.getParameter("username");
String password=request.getParameter("password");
//假设用户名和密码为itcast和123
if (("itcast").equals(username)&&("123").equals(password)){
//如果用户名和密码正确,重定向到welcome.html
response.sendRedirect("/studyclass/denglu/welcome.html");
}else {
//如果用户名和密码错误,重定向到login.html
response.sendRedirect("/studyclass/denglu/login.html");
}
}
}
登录成功就会出现以下界面:
![](https://img-blog.csdnimg.cn/8c8453fa0313405eb247b347ae5dbb27.png)
请求转发:
Servlet之间可以相互跳转,利用Servlet的跳转可以把一项任务按模块分开,例如:
使用一个Servlet实现用户登录,然后跳转到另外一个Servlet实现用户资料修改。Servlet的跳转要通过RequestDispatcher接口的实例对象实现。HttpServletRequest接口提供了getRequestDispatcher()方法用于获取RequestDispatcher对象。
getRequestDispatcher()方法的具体格式
RequestDispatcher getRequestDispatcher (String path)
获取到RequestDispatcher对象后,如果当前web资源不想处理请求,RequestDispatcher接口提供了一个forward()方法,该方法可以将当前请求传递给其他web资源,由其他资源对这些信息进行处理并将响应提交给客户端,这种方式称为请求转发。
forward()方法的具体格式如下:
forward(ServletRequest request,ServletResponse response)
forward()方法用于将请求从一个Servlet传递给另一个web资源。在Servlet中,可以对请求做一个初步处理,然后调用forward()方法将请求传递给其他资源进行响应。需要注意的是,该方法必须在将响应提交给客户端之前被调用,否则将抛出异常。
在studyclass项目中建一个包,在包下创建一个名为RequestForwardServlet的类,该类调用forward()方法将请求转发到一个新的Servlet页面。
package QingqiuZhuanfa;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "RequestForwardServlet",urlPatterns = "/RequestForwardServlet")
public class RequestForwardServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setAttribute("username","张三");//将数据存储到request对象中
RequestDispatcher dispatcher=request.getRequestDispatcher("/ResultServlet");
dispatcher.forward(request,response);
}
}
可以看到通过使用forward()方法将当前Servlet的请求转发到ResultServlet页面。
再次在该包下写一个ResultServlet的类,用于获取RequestForwardServlet类中存储在request对象中的数据并输出。
package QingqiuZhuanfa;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "ResultServlet",urlPatterns = "/ResultServlet")
public class ResultServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
String username=(String) request.getAttribute("username");
if (username!=null){
out.println("用户名:"+username+"<br/>");
}
}
}
由图可知,地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器却显示ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中可以使用request属性进行数据共享。
对比重定向的地址栏,是有不同的,重定向的地址是重定向后的路径。