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表示的是命名空间
文本替换
语法:th:text
特点:
- 如果取到数据,将指定数据替换内部文本值
- 如果没有取到数据,将控制替换内部文本值
示例
<span th:text="${stuName}">span</span>
Value替换
语法:th:vlaue
特点:
- 如果取到数据,将指定数据替换value值
- 如果没有取到数据,将空值替换成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对象本身。
- #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.getId()}
- {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
应用场景:
抽取各个页面的公共部分.
操作步骤:
-
创建页面的公共代码片段:使用th:fragment来给这个片段命名:
<div th:fragment="header"> <p>被抽取出来的头部内容</p></div> -
在需要的页面中进行包含
语法 效果 特点 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的主标签。