2021-08-19

跳转页面,jsp,el表达式

页面跳转

请求转发

只会发送一条请求
在这里插入图片描述

只发送一条请求,地址栏不变,还是index,客户端无感知跳转
因为只发送了一条请求,所以request中数据共享

适合向页面传递数据,比如数据展示,可以通过后端把数据获取,然后设置到request中
并转发到对应的jsp页面,在jsp页面进行操作

@WebServlet("/a/b/c")
public class _01_Forward extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  // 请求转发
  // 加 / 是绝对定位 , 绝对定位是定位到当前项目的 webapps\JSP_01
  // 不加 / 是相对定位, 相对当前请求
  // 比如说 请求 /a/b/c的时候 到达的这个java文件, 在这个文件中的相对环境 就是 /a/b
  // 也就是说  发送的所有相对路径的请求,都需要加上/a/b/的前缀 , 比如 我要请求d
  // 就等于是请求 /a/b/d
  
  // 向request域中保存数据
  request.setAttribute("name", "张三");
  //转发请求
  request.getRequestDispatcher("/_01_forward.jsp").forward(request, response);
 }
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  doGet(req, resp);
 }
}

在这里插入图片描述

重定向

在这里插入图片描述

重定向跳转 客户端发送两条请求,地址栏变为login,并且 request数据不共享,适合做普通的页面跳转

@WebServlet("/q/w/e")
public class _02_SendRedurect extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  // 重定向
  // 加/ 定位到 webapps
  // 不加 相对路径
  
  req.setAttribute("name", "李四");
  // getContextPath : /项目名
  String str = req.getContextPath();
  // /JSP_01
  System.out.println(str);
  resp.sendRedirect(req.getContextPath()+"/_01_forward.jsp");
 }
}

在这里插入图片描述

通过测试发现 重定向跳转 会发送两条请求而地址栏 也是最后一个请求,并且request数据不共享,所以不能做数据传递

JSP内置对象

不用创建,直接使用
本质 就是service方法中的局部变量
Request 请求对象
Response 响应 对象
Session 会话
Out 输出流,用于向页面打印
Application servletContext 全局环境
Config servletConfig

<!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>Insert title here</title>
</head>
<body>
 被跳转过来的<%=request.getAttribute("name") %>
 <%= session.getAttribute("xxx") %>
 <%= application.getAttribute("xxx") %>//不用创建直接用
</body>
</html>

E表达式

EL表达式

EL表达式 主要用于获取数据 等于 request.getAttribute(“xxxx”)

  • 为什么使用EL表达式
    MVC应该是轻量级的框架,但是在JSP中 通过 <%%> 这种写法,功能太强,不符合MVC设计理念
    甚至你可以直接把操作数据库的JDBC代码在JSP中编写,完全脱离了后端java类
    所以 为了尽可能的在视图层出现java逻辑代码,提出了EL表达式和JSTL

4.3 语法
${xxx} 等于 request.getAttribute(“xxx”) 这两句话是等价的

<body>
 request.getAttribute("hello") : <%= request.getAttribute("hello") %> <br>
 \${hello } : ${hello }
</body>

可以通过\ 忽略el表达式

JSTL表达式

JSTL : JSP Standard Tag Library JSP标准标签库
使用JSTL必须先导入对应的jar包
最初的设计目的是解决两个问题,
1 上述分析的问题,不符合MVC模式
2 写JSP的人,应该是前端或者是美工,不需要有java编程基础

简单来说 它们就是用来简化JSP中的java代码的,使JSP代码更简短美观但是EL表达式只能解决数据获取的问题,比如用户列表等循环遍历操作或者是流程控制操作,EL表达式是做不到的,此时就需要依赖JSTL完成这件事.但是JSTL不能获取数据所以 一般EL表达式会和JSTL一起使用,功能才更加强大

  • 标签库
    1 核心标签库 : 最常用的部分,比如流程判断,循环遍历等
    2 I18N 格式标签库 : 对数据显示进行格式化,比如时间格式化,数字格式化
核心标签库

1.导包
在这里插入图片描述

2 引入

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
在这里插入图片描述

3.1循环结构

例,后端传入一个集合


  // TODO 模仿数据库查询获取数据list
  List<User> users = new ArrayList<User>();
  users.add(new User(1, "admin1", "root"));
  users.add(new User(2, "admin2", "root"));
  users.add(new User(3, "admin3", "root"));
  users.add(new User(4, "admin4", "root"));
  users.add(new User(5, "admin5", "root"));
  // 设置数据
  request.setAttribute("users", users);

//map
  Map map = new HashMap();
  map.put("k1", "v1");
  map.put("k2", "v2");
  map.put("k3", "v3");
  // 设置数据
  request.setAttribute("map", map);

jsp遍历

<table width="500" align="center" border="1">
  <tr>
   <th>ID</th>
   <th>用户名</th>
   <th>密码</th>
   <!-- 			集合操作 -->
  </tr>
  <%--    items 是集合,通过EL表达式获取数据, --%>
  <%--    把集合中的每个数据 都赋值给变量 user , 然后就可以通过el表达式 获取这个user中的数据并展示到页面 --%>
  <c:forEach items="${users }" var='user'>
   <tr>
    <td>${user.id }</td>
    <td>${user.username }</td>
    <td>${user.password }</td>
   </tr>
  </c:forEach>

  <!-- 		map操作 -->
  <c:forEach items="${map }" var="entry">
   ${entry.key } : ${entry.value } <br>
  </c:forEach>

3.2 分支结构

后端发送
request.setAttribute("value", new Random().nextInt(11));
jsp操作

<!-- 		流程控制 if -->

  <!-- 判断是否为空  只有if 没有else -->
  <c:if test="${empty users }">
   没有获取数据
 </c:if>

  <!-- 	相当于switch   -->
  <c:choose>
   <%--   case  == eq  > gt  >=ge  < lt <= le != ne --  && and  || or %>
   <c:when test="${value < 5 }"></c:when>
   <%--   case --%>
   <c:when test="${value > 5 or value < 10 }"></c:when>
   <%--   default --%>
   <c:otherwise>
   豹子
  </c:otherwise>
  </c:choose>
格式标签库

导fmt包
后端发送并跳转

request.setAttribute("date", new Date());
  
  request.getRequestDispatcher("fmt.jsp").forward(request, resp);

jsp操作

默认 : ${date }
 <br>
格式化之后 :  <fmt:formatDate value="${date }" /> <br>
自定义格式 :  <fmt:formatDate value="${date }"  pattern="yyyy年MM月dd日 HH:mm:ss SSS"/> <br>
<!-- 		pattern前面加空格 -->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值