具体解释为响应重定向和请求转发,一看响应就是服务器端的,请求转发就是客户端的
在B/C系统 B/S 系统和C/S做的系统又什么区别啊?_百度知道 (baidu.com) 中,我们很多时候会进行这个servlet跳转到另一个servlet,比如说我们在一个官网的首页,然后需要进行登陆的话,会弹出登录页面,我们登录之后就又回到首页,这样的话需要servlet之间的跳转。那么我们有两种方式做这个事情。
页面重定向页面重定向是我们浏览器给服务器发送了一个请求,然后servlet1响应给浏览器一个特殊的响应,告诉浏览器重新发送一个请求给servlet2,然后浏览器重新发送了一个请求给servlet2.在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
HttpServletResponse中定义了响应重定向的方法sendRedirect(String path)响应重定向是向目标(path)资源重新发送请求,响应重定向是使用GET方式提交请求,所以调用目标资源的doGet方法。
当然也可以在jsp页面中实现重定向:
<%response.sendRedirect("new.jsp");//重定向到new.jsp%>
响应重定向生成新的请求,所以当前请求中的数据不会再传到目标资源中。
//利用网页重定向跳转至欢迎界面
response.sendRedirect("HelloServlet");
2、请求转发
请求转发实现的原理是servlet与servlet之间在tomcat服务器中进行请求的转发,浏览器中之发送一个请求,这个转发的行为是web服务器内部做的,就相当于是tomcat做的。在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
使用步骤:
- 先使用请求中getRequestDispatcher(String path)方法获得请求转发器对象RequestDispatcher。
- 然后调用RequestDispatcher的forward(request,response)方法进行跳转。
- 修改LoginServlet中的跳转方法。
request.getRequestDispatcher("WEB-INF/page/login.jsp").forward(request, response);
在jsp页面中你也会看到通过下面的方式实现转发:
例:登录界面
在index.jsp中输入账号密码,提交表单,
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
FirstServlet.java
package com.company.project.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userId = request.getParameter("userId");
String pw = request.getParameter("pw");
if (userId != null && userId != "" && pw != null && pw != "") {
request.getRequestDispatcher("LoginServlet").forward(request, response);
}else {
out.println("账号、密码不能为空");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
LoginServlet.java
package com.company.project.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置相应内容类型
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
// 获取输出流对象
PrintWriter out = response.getWriter();
String userId = request.getParameter("userId");
String pw = request.getParameter("pw");
if (userId.equals("2584966199") && pw.equals("zgy")) {
out.println("恭喜你登录成功");
//利用网页重定向跳转至欢迎界面
response.sendRedirect("HelloServlet");
} else {
out.println("输入的账号密码有误");
}
// 关闭输出流对象
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
7.3 单控制器多业务处理Servlet实现
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
首页
请选择你的操作
OperationServlet.java
package com.company.project.servlet;
import java.io.IOException;
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;
@WebServlet("/OperationServlet")
public class OperationServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public OperationServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String oper = request.getParameter("operation");
if (oper != null || oper != "")
switch (oper) {
case "login":
request.getRequestDispatcher("WEB-INF/page/login.jsp").forward(request, response);
break;
case "register":
request.getRequestDispatcher("WEB-INF/page/register.jsp").forward(request, response);
break;
case "changePW":
request.getRequestDispatcher("WEB-INF/page/changePW.jsp").forward(request, response);
break;
case "personal":
request.getRequestDispatcher("WEB-INF/page/personal-data.jsp").forward(request, response);
break;
default:
request.getRequestDispatcher("WEB-INF/page/index.jsp").forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}



