服务器端跳转又叫做服务端转发还可以叫做服务端重定向。
用户发送请求到看到数据会经历如下的过程
- 用户发送到请求到服务器
- 服务器会将请求交给对应的控制器(目前是servlet处理,在控制器中调用业务层方法取得数据
- 之后将数据保存到request内置对象中(后续使用前后端分离就不会将数据保存到request内置对象了)
- 然后再跳到页面将保存在request内置对象中的数据再次取出来之后显示到页面(用户看到信息)
protected void doGet(HttpServletRequest req, HttpServletResponse resp){
Integer empno = Integer.parseInt(req.getParameter("id"));
try {
//将查询到的数据保存到request内置对象中
req.setAttribute("emp", empService.findEmpById(empno));
//跳转到显示雇员的页面
//取得对象
RequestDispatcher dispatcher=req.getRequestDispatcher("/Pages/emp.jsp");
//开始转发
dispatcher.forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
<%@ page language="java" contentType = "text/html;charset=utf-8" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@page isELIgnored="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'emp.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>显示雇员的信息:${emp}
</h1>
<table border="1">
<tr>
<td>编号</td><td>姓名</td><td>职位</td><td>薪资</td>
<td>领导编号</td><td>入职日期</td><td>佣金</td><td>部门编号</td>
</tr>
<tr>
<td>${emp.empno}</td><td>${emp.ename}</td>
<td>${emp.job}</td><td>${emp.sal}</td>
<td>${emp.mgr}</td><td>${emp.hiredate}</td>
<td>${emp.comm}</td><td>${emp.deptno}</td>
</tr>
</table>
</body>
</html>
小结:
服务器端转发的特征
- 实现方式是调用RequestDispatcher类的forward()方法实现
- 服务器端转发浏览器的地址栏信息不会发生改变
- 使用服务器转发之后,可以在jsp页面中取得保存在request内置对象中的属性
使用${参数名}在jsp中取得对应的值的方式叫作EL表达式