JSP 转发

一、什么是转发

一个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 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
	}

}

你可能感兴趣的:(Java基础)