MVC模型
- 存在问题
- Servlet中,要处理的事有:处理请求、调度页面、渲染页面,而渲染页面是前端代码,应该出现在前端程序中,也就是说要继续对Servlet进行拆分,拆分成MVC模型。
- 之前学习的技术,无法将java数据直接展示到页面。
- MVC模型
- m : model , 模型
- 封装数据,就是javabean
- v : view , 视图
- 渲染页面,就是thymeleaf (将java数据展示到页面)
- c : controller , 控制器
- 处理请求,调度页面
thymeleaf
- 概述
- Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎。类似JSP,Velocity, FreeMaker等, 它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板 引擎。它的主要作用是在静态页面上渲染显示动态数据
- 优势
- thymeleaf技术是SpringBoot框架默认支持的数据渲染引擎。
物理视图和逻辑视图
- 物理视图
- 就是请求转发的一个资源的绝对路径
- 逻辑视图
- 物理视图=视图前缀+逻辑视图+视图后缀
- 比如:/pages/user/login.html=/pages/user/(视图前缀) + login(逻辑视图) + .html(视图后缀)
thymeleaf入门
- 开发步骤
- ①引入thymeleaf相关jar包
- ②在web.xml中,配置视图前缀、视图后缀
- ③定义ViewBaseServlet
- 解析渲染thymeleaf
- ④自定义Servlet继承ViewBaseServlet
- ⑤编写html页面,渲染java数据
- ①引入thymeleaf相关jar包
- ②在web.xml中,配置视图前缀、视图后缀
<context-param>
<param-name>view-prefix</param-name>
<param-value>/pages/</param-value>
</context-param>
<context-param>
<param-name>view-suffix</param-name>
<param-value>.html</param-value>
</context-param>
- ②在web.xml中,配置视图前缀、视图后缀
public class ViewBaseServlet extends HttpServlet {
private TemplateEngine templateEngine;
@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);
}
/**
* 执行视图
* @param templateName : 逻辑视图
* @param req : 请求
* @param resp : 响应
* @throws IOException
*/
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());
}
}
④自定义Servlet继承ViewBaseServlet
@WebServlet("/demo01")
public class Demo01Servlet extends ViewBaseServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = "用户已经存在!";
req.setAttribute("msg", msg);
//请求转发到demo01.html
processTemplate("demo01", req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
⑤编写html页面,渲染java数据
<!DOCTYPE html>
<!--开启thymeleaf空间-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>demo01</title>
</head>
<body>
<span th:text="${msg}"></span>
</body>
</html>
注意事项
- 如果要在html页面中,使用thymeleaf指令,需要开启thymeleaf空间
thymeleaf修改标签内容
- 概述
- 使用th:text指令操作标签内容,类似于vue的v-text指令
- 代码实现
@WebServlet("/demo02")
public class Demo02Servlet extends ViewBaseServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = "用户名已经存在!";
req.setAttribute("msg", msg);
//req.getRequestDispatcher("/pages/demo02.html").forward(req, resp);
processTemplate("demo02", req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,