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前面加空格 -->
内容概要:本文档是一份基于最新Java技术趋势的实操指南,涵盖微服务架构(Spring Cloud Alibaba)、响应式编程(Spring WebFlux + Reactor)、容器化与云原生(Docker + Kubernetes)、函数式编程与Java新特性、性能优化与调优以及单元测试与集成测试六大技术领域。针对每个领域,文档不仅列出了面试中的高频考点,还提供了详细的实操场景、具体实现步骤及示例代码。例如,在微服务架构中介绍了如何利用Nacos进行服务注册与发现、配置管理,以及使用Sentinel实现熔断限流;在响应式编程部分展示了响应式控制器开发、数据库访问和流处理的方法;对于容器化,则从Dockerfile编写到Kubernetes部署配置进行了讲解。 适合人群:具有一定的Java编程基础,尤其是正在准备面试或希望深入理解并掌握当前主流Java技术栈的研发人员。 使用场景及目标:①帮助求职者熟悉并能熟练运用微服务、响应式编程等现代Java开发技术栈应对面试;②指导开发者在实际项目中快速上手相关技术,提高开发效率和技术水平;③为那些想要深入了解Java新特性和最佳实践的程序员提供有价值的参考资料。 阅读建议:由于文档内容丰富且涉及多个方面,建议读者按照自身需求选择感兴趣的主题深入学习,同时结合实际项目进行练习,确保理论与实践相结合。对于每一个技术点,不仅要关注代码实现,更要理解背后的原理和应用场景,这样才能更好地掌握这些技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值