JSP,域对象,Thymeleaf(七)

591 阅读5分钟

JSP

JSP简介

JSP特点

​ Jsp只能运行在服务器不能直接使用浏览器打开。

动态页面与静态页面

​ 静态页面:html

​ 动态页面:Jsp

JSP工作原理

​ 第一次运行Jsp时,服务器将xxx.jsp文件先翻译为xxx.java,再编译为xxx.class。

​ 第n次运行,如果没有改变代码,不会进行翻译和编译,如果改变了代码,会重新翻译和编译。

域对象

域对象概述

程序中的域对象:将数据从一处共享到另一处。

​ 页面域:pageContext

​ 请求域:request

​ 会话域:session

​ 上下文【web】域:application【ServletContext】

四个域对象的作用范围

1 pageContext【页面域】

  • 类型:PageContext
  • 作用范围:当前页面有效,离开当前页面失效。

请求转发也会失效。

2 request【请求域】

  • 类型:HttpServletRequest
  • 作用范围:当前请求有效,离开当前请求失效。

当前请求:

地址栏不变即为当前请求,地址栏改变不再是当前请求。

3 session【会话域】

  • 类型:HttpSession
  • 作用范围:当前会话有效,离开当前会话失效

当前会话:

会话指的是浏览器服务器通信状态。

当浏览器不关闭和不更换即为当前会话。

4 application【上下文域】

  • 类型:ServletContext
  • 作用范围:当前web应用正常运行【上下文】有效。web应用关闭或卸载【比如从tomcat中remove】上下文失效。

使用域对象

setAttribute(String s,Object obj)

getAttribute(String s)

removeAttribute(String s)

域对象应用场景

1 servlet

  • request域在doGet()和doPost()中可以直接使用
  • session域对象获取方式:request.getSession()
  • application域对象获取方式:getServletContext()

2 Thymeleaf也可以使用域对象

Thymeleaf

Thymeleaf:服务器——数据——>浏览器页面

axios:浏览器页面——数据——>服务器

为什么使用Thymeleaf

以查询功能为例,需要将Servlet中的数据共享给html页面,而Html是静态页面不能书写Java代码,所以此时需要渲染工具:Thymeleaf.

Thymeleaf之HelloWorld

步骤

1 导入相关的jar包

2 创建ViewBaseServlet积累

3 配置上下文参数

  • view-prefix
  • view-suffix

4 创建Servlet继承ViewBaseServlet

//@WebServlet(name = "ViewBaseServlet")
public class ViewBaseServlet extends HttpServlet {
    private TemplateEngine templateEngine;
    protected void processTemplate(String templateName, HttpServletRequest req,HttpServletResponse resp) throws IOException {
        /*1 设置响应体内容类型和字符集*/
        resp.setContentType("text/html;charset=UTF-8");
        /*2 创建WebContext对象*/
        WebContext webContext = new WebContext(req, resp, getServletContext());
        /*3 处理模板数据*/
        templateEngine.process(templateName,webContext,resp.getWriter());
    }
    @Override
    public void init() throws ServletException {
        /*1 获取ServletContext对象*/
        ServletContext servletContext = this.getServletContext();
        /*2 创建Thymeleaf解析器对象*/
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
        /*3 给解析器对象设置参数*/
        /*① Html是默认模式,明确设置是为了代码更容易理解*/
        templateResolver.setTemplateMode(TemplateMode.HTML);
        /*② 设置前缀*/
        String viewPrefix = servletContext.getInitParameter("view-prefix");
        templateResolver.setPrefix(viewPrefix);
        /*③ 设置后缀*/
        String viewSuffix = servletContext.getInitParameter("view-suffix");
        templateResolver.setSuffix(viewSuffix);
        /*④ 设置缓存过期时间(单位:毫秒)*/
        templateResolver.setCacheTTLMs(60000L);
        /*⑤ 设置是否缓存*/
        templateResolver.setCacheable(true);
        /*⑥ 设置服务器端编码方式*/
        templateResolver.setCharacterEncoding("UTF-8");
        /*4 创建模板引擎对象*/
        templateEngine = new TemplateEngine();
        /*5 给模板引擎对象设置模板解析器*/
        templateEngine.setTemplateResolver(templateResolver);

    }

}
  • 处理请求,做出响应【使用processTemlate()跳转页面,转发
  • ViewBaseServlet无需注册
    • 因为不需要直接请求ViewBaseServlet
    • 创建子类之前,创建父类

5 在HTML中使用th:xxx显示数据

stuName:<span th:text="${stuName}"></span>

Thymeleaf基本语法

th表示的是命名空间

命名空间.png

文本替换

语法:th:text

特点:

  1. 如果取到数据,将指定数据替换内部文本值
  2. 如果没有取到数据,将控制替换内部文本值

示例

<span th:text="${stuName}">span</span>

Value替换

语法:th:vlaue

特点:

  1. 如果取到数据,将指定数据替换value值
  2. 如果没有取到数据,将空值替换成value值

示例:

<input type="text" name="stuname" th:value="${stuNameddd}"/>

路径替换

语法:

  • th:href
  • th:src
  • th:action

特点:

  • 如果取到数据,将指定数据替换路径【href/src/action】值
  • 如果没有取到数据,将空值替换路径【href/src/action】值

示例:

<a th:href="@{/index.html}" href="错误的,WEB-INF/xxxx">index.html路径替换</a>
<form th:action="@{/index.html}">
    <input type="text" name="stuname" th:value="${stuName}" value="zhangsan">
    <input type="submit">
</form>

Thymeleaf绝对路径

语法:@{/}

Thymeleaf其他替换

  • th:name
  • th:id
  • th:xxx

Thymeleaf中的域对象

常用的三个域对象

request:请求域

session:会话域

application:上下文域【web应用】

Thymeleaf中域对象的使用

request.setAttribute("stuName","zhangsan");
//session域
HttpSession session = request.getSession();
session.setAttribute("stuAge",18);
//application
ServletContext application = getServletContext();
application.setAttribute("stuGender","男");
<h2>域对象</h2>
request域:<span th:text="${stuName}"></span><br>
session域:<span th:text="${session.stuAge}"></span><br>
application域:<span th:text="${application.stuGender}"></span><br>

Thymeleaf中的param【参数】

param请求参数对象

作用:与request.getParameter()以及request.getParameterValues()作用一致【获取请求参数】。

示例代码

param对象:<span th:text="${param.paramName}"></span><br>

Thymeleaf中的内置对象

解释

Thymeleaf中的内置对象:无需我们自己new,就可以直接使用的对象

常用内置对象

session{session}与{#session}的区别

${session}:是域对象【session对象作用之一】

${#session}:session对象本身。

  • #request:代表HttpServletRequest对象
  • #session:代表HttpSession对象
  • #servletContext:代表ServletContext对象
  • #strings:处理字符串对象
  • #lists:处理数组集合对象

内置对象示例代码

<h2>Thymeleaf中内置对象</h2>#request对象【获取上下文路径】:<span th:text="{#request.contextPath}"></span><br><span th:text="{#request.getContextPath()}"></span><br>#session对象【获取session的id】:<span th:text="{#session.id}"></span><br>#strings对象【转换为大写】:<span th:text="${#strings.toUpperCase('ssDDgG')}"></span><br>#lists对象【判断集合或数组是否为空】:<span th:text="${#lists.isEmpty(list)}"></span><br>

Thymeleaf中的OGNL

OGNL全称

Object-Graph Navigation Language对象-图,导航语言。

使用OGNL访问对象

  • ${student}
  • ${session.student}
  • ${application.student}

使用OGNL访问对象中的属性

  • student.id或者{student.id}或者{student.getId()}
  • session.student.subject.subName或者{session.student.subject.subName}或者{session.student.subject.getSubName()}

注意:OGNL中调用属性本质上是调用这个属性getXXX()方法

示例代码

<h2>OGNL获取student数据</h2>OGNL获取域中的对象:<span th:text="${session.student}"></span><br>OGNL获取域中的对象的属性id:<span th:text="${session.student.getStuId()}"></span><br>OGNL获取域中的对象的属性name:<span th:text="${session.student.stuName}"></span><br>OGNL获取域中的对象中Address的属性值name:<span th:text="${session.student.address.addName}"></span><br>OGNL获取域中的对象中Subject的属性name:<span th:text="${session.student.subject.subName}"></span><br>

Thymeleaf中分支与迭代

分支

语法:

  • th:if
  • th:unless
  • th:switch

示例代码:

<h2>OGNL分支与迭代</h2>分支:<span th:if="${#lists.isEmpty(list)}">list集合是空</span><br><span th:unless="${#lists.isEmpty(list)}">list集合不是空【unless】</span><br><span th:if="${not #lists.isEmpty(list)}">list集合不是空【not】</span><br>

迭代

  • th:each
<!--遍历显示请求域中的teacherList--><table border="1" cellspacing="0" width="500">    <tr>        <th>编号</th>        <th>姓名</th>    </tr>    <tbody th:if="${#lists.isEmpty(teacherList)}">        <tr>            <td colspan="2">教师的集合是空的!!!</td>        </tr>    </tbody>    <!--集合不为空,遍历展示数据-->    <tbody th:unless="${#lists.isEmpty(teacherList)}">        <!--使用th:each遍历用法:1. th:each写在什么标签上? 每次遍历出来一条数据就要添加一个什么标签,那么th:each就写在这个标签上2. th:each的语法    th:each="遍历出来的数据,数据的状态 : 要遍历的数据"3. status表示遍历的状态,它包含如下属性:3.1 index 遍历出来的每一个元素的下标3.2 count 遍历出来的每一个元素的计数3.3 size 遍历的集合的长度3.4 current 遍历出来的当前元素3.5 even/odd 表示遍历出来的元素是否是奇数或者是否是偶数3.6 first 表示遍历出来的元素是否是第一个3.7 last 表示遍历出来的元素是否是最后一个-->        <tr th:each="teacher,status : ${teacherList}">            <td th:text="${status.count}">这里显示编号</td>            <td th:text="${teacher.teacherName}">这里显示老师的名字</td>        </tr>    </tbody></table>

Thymeleaf包含其他模板文件

模板:th:fragment

引用:

  • th:insert
  • th:replace
  • th:include

应用场景:

抽取各个页面的公共部分.

操作步骤:

  1. 创建页面的公共代码片段:使用th:fragment来给这个片段命名:

    <div th:fragment="header">    <p>被抽取出来的头部内容</p></div>
    
  2. 在需要的页面中进行包含

    语法效果特点
    th:insert把目标的代码片段整个插入到当前标签内部它会保留页面自身的标签
    th:replace用目标的代码替换当前标签它不会保留页面自身的标签
    th:include把目标的代码片段去除最外层标签,然后再插入到当前标签内部它会去掉片段外层标记,同时保留页面自身标记

代码示例

<!-- 代码片段所在页面的逻辑视图 :: 代码片段的名称 --><div id="badBoy" th:insert="segment :: header">    div标签的原始内容</div><div id="worseBoy" th:replace="segment :: header">    div标签的原始内容</div><div id="worstBoy" th:include="segment :: header">    div标签的原始内容</div>

th:insert,th:include与th:replace的区别

  • th:insert :保留自己的主标签,保留th:fragment的主标签。
  • th:replace :不要自己的主标签,保留th:fragment的主标签。
  • th:include :保留自己的主标签,不要th:fragment的主标签。