文章目录
一、含义
项目 | 请求重定向 | 请求转发 |
---|---|---|
操作者 | 客户端行为 | 服务器端行为 |
本质 | 两次请求 | 一次请求 |
地址栏URL | 会改变 | 不会改变 |
对象保存 | 不会 | 会 |
1.1 请求重定向
含义:
(1)其实是两次请求
(2) 第一次,客户端请求服务器响应,这时候服务器response回来,告诉浏览器,你应该去另外一个地址访问。
(3)浏览器就会发送第二次请求,服务器会再一次应答。这个时候浏览器的网址可以看到地址变了,而且历史的回退按钮也亮了。
(4)重定向可以访问自己web应用以外的资源。
(5)在重定向的过程中,请求传输的信息会被丢失。
response.sendRedirect("success.jsp");
1.2 请求转发
含义:
(1)一次请求。
(2)服务器内部进行的转发操作,把对一个request/response的处理权,移交给另外一个jsp或者servlet处理。
(3)对于客户端而言,它只知道自己最早请求的那个网址,而不知道中间的经过多少个jsp或者servlet。
(4)在转发过程中请求的信息不会丢失。
request.getRequestDispatcher("success.jsp").forward(request,response);
1.3 网页包含
含义:指一个网页包含至少一个网页。即主页包含子页,都在主页上显示。
项目 | include指令 | include动作 |
---|---|---|
语法 | <%@ include file=“URL”%> | <jsp:include page=“URL” flush=“true|false”> |
发生作用的时间 | 页面转换期间 | 请求期间 |
包含的内容 | 文件的实际内容 (源代码) | 页面的输出(结果) |
转换成的Servlet个数 | 只有一个 | 多个 |
编译速度 | 较慢——资源必须被解析 | 较快 |
执行速度 | 较快 | 较慢——每次资源必须被解析 |
导入区别 | 静态导入 | 动态导入 |
适用场景 | 主页面的内容不经常变化时 | 主页面的内容经常变化时 |
1.3.1 指令include包含
作用:将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。
静态include用include伪码实现,不会检查所包含文件的变化,适用于包含静态页面。静态导入是将导入页面的代码完全融入,两个页面融合成一个整体的servlet。也就是相当于与把一个页面的内容复制到另外一个页面的效果是一样的。
<%@ include file="URL" %>
注意:主页面的内容经常变化时,使用include动作。
1.3.2 动作include包含
它总是会检查所包含文件中的变化,适用于包含动态页面,并且可以带参数。动态在使用时会先解析所包含的页面,解析后再和主页面放到一起显示。动态导入在servlet中使用include方法来引入被导入页面的内容。
<jsp:include page="URL" flush="true\|false">
二、示例
2.1 请求转发
2.1.1 DAO层
实现数据库访问层(CRUD操作)。
public List<User> getAll() {
List<User> users = new ArrayList<User>();
try {
conn = DBUtil.getConnction();
String sql = "select * from user";
ps = conn.PrepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setPass(rs.getString("pass"));
user.setUid(rs.getInt("uid"));
user.setUname(rs.getString("username"));
users.add(user);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
2.1.2 Servlet层
实现servlet。从数据库层中查询数据,然后放到request作用域中
UserListServlet.java:
public class UserListServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserDao userDao = new UserDao();
List<User> users = userDao.getAll();
request.setAttribute("users", users);
// 请求转发。服务器内部操作。
request.getRequestDispatcher("listuser.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.1.3 注册Servlet类
目的:实现请求URL与Servlet类的映射。
在主页上面新建一个超链接连接这个servlet。注意必须要先经过servlet才能访问数据库的数据,页面层不再直接访问数据库层。
web.xml:
<servlet>
<servlet-name>UserListServlet</servlet-name>
<servlet-class>com.servlet.UserListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserListServlet</servlet-name>
<url-pattern>/userList</url-pattern>
</servlet-mapping>
2.1.4 视图层
<body>
<%
List<User> users=(List<User>)request.getAttribute("users");
%>
<table border="1px">
<thead>
<tr>
<td>用户名</td>
<td>密码</td>
</tr>
<thead>
<tbody>
<% for(User user:users){ %>
<tr>
<td><%=user.getUname() %></td>
<td><%=user.getPass() %></td>
</tr>
<% } %>
</tbody>
</table>
</body>
2.2 页面包含
2.2.1 主页面
include_command.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include指令</title>
</head>
<body>
<h1>include指令</h1><hr/>
今天的日期:<%@include file="date.jsp" %>
</body>
</html>
2.2.2 副页面
date.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*,java.text.*" %>
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str = sdf.format(date);
out.println(str);
%>