IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 2021-08-19 -> 正文阅读

[开发测试]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前面加空格 -->
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:46:10  更:2021-08-21 15:46:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:33:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码