一、什么是转发
一个web组件(Servlet/jsp)将未完成的处理通过容器转发给另一个web组件继续完成。
常见情况:
一个Servlet获得数据之后(比如通过调用dao)将这些数据转发给一个JSP,由这个JSP来展现这些数据
二、如何实现转发
1、绑定数据到request对象
实现绑定
request。setAttribute(String name,Object obj)
name:绑定名
obj:绑定值
读取绑定值
Object request.getAttrbute(String name)
如果绑定名对应的值不存在,返回null
2、获得转发器
RequestDispatcher rd=request.getRequestDispatcher(String path);
path:转发目的地,即将未完成的处理继续下去的另一个组件名,比如一个JSP文件
3、转发
实现转发:rd.forword(request,response);
通常情况下第二步和第三步合并为一行语句,如下:
request.getRequestDispatcher(path).forward(request,response);
三、转发的特点
1、转发之后,浏览器地址栏的地址不变。
2、转发地址有限制(必须是同一个应用)。
3、转发所涉及的各个web组件会共享一个request对象和response对象
四、转发和重定向的区别
1、转发所涉及的各个web组件可以共享同一个request对象,重定向不可以。
2.转发在服务器端完成的;重定向是在客户端完成的
3.转发的速度快;重定向速度慢
4.转发的是同一次请求;重定向是两次不同请求
5.转发不会执行转发后的代码;重定向会执行重定向之后的代码
6.转发地址栏没有变化;重定向地址栏有变化
7.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
五、实例分析
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.DBUtil;
import dao.EmployeeDAO;
import entity.Employee;
public class ActionServlet extends HttpServlet {
public void destroy() {
super.destroy();
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取请求资源路径
String uri = request.getRequestURI();
// 分析请求资源路径
String action = uri.substring(uri.lastIndexOf("/"), uri
.lastIndexOf("."));
// 依据分析的结果,调用不同的分支处理
request.setCharacterEncoding("utf-8");
if (action.equals("/list")) {
try {
EmployeeDAO dao = new EmployeeDAO();
List<Employee> employees = dao.findAll();
// 使用转发,将处理转交给empList.jsp
/**
* step1:绑定数据 step2:获得转发器 step3:转发
*/
// 1、绑定数据
request.setAttribute("emplist", employees);
// 2、获得转发器
RequestDispatcher rd = request
.getRequestDispatcher("empList.jsp");
// 3、转发
rd.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
// request.setAttribute("error", "系统繁忙,稍后重试");
// request.getRequestDispatcher("error.jsp").
// forward(request, response);
//
// 将异常抛给容器
throw new ServletException(e);
}
} else if (action.equals("/add")) {
String name = request.getParameter("name");
String salary = request.getParameter("salary");
String age = request.getParameter("age");
try {
// 创建EmployeeDAO对象
EmployeeDAO dao = new EmployeeDAO();
// 创建Employee对象
Employee e = new Employee();
e.setName(name);
e.setSalary(Double.parseDouble(salary));
e.setAge(Integer.parseInt(age));
DBUtil.getConnection();
// 调用EmployeeDAO的save方法
dao.save(e);
// 重定向
response.sendRedirect("list.do");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
} else if (action.equals("/delete")) {
int id = Integer.parseInt(request.getParameter("id"));
try {
EmployeeDAO emp = new EmployeeDAO();
emp.delete(id);
response.sendRedirect("list.do");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
} else if (action.equals("/load")) {
int id =Integer.parseInt(
request.getParameter("id"));
try{
EmployeeDAO dao =
new EmployeeDAO();
Employee emp =
dao.findById(id);
//绑定
request.setAttribute("emp",emp);
//转发
request.getRequestDispatcher("updateEmp.jsp").forward(request, response);
}catch(Exception e){
e.printStackTrace();
}
} else if (action.equals("/modify")) {
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
String salary = request.getParameter("salary");
String age = request.getParameter("age");
try {
EmployeeDAO dao = new EmployeeDAO();
Employee e = new Employee();
e.setId(id);
e.setName(name);
e.setSalary(Double.parseDouble(salary));
e.setAge(Integer.parseInt(age));
dao.modify(e);
response.sendRedirect("list.do");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}
}
public void init() throws ServletException {
// Put your code here
}
}