JSP-请求重定向、请求转发和包含

一、含义

项目请求重定向请求转发
操作者客户端行为服务器端行为
本质两次请求一次请求
地址栏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);
%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值