jsp&thymeleaf双视图应用

来源:互联网 发布:apache java 编辑:程序博客网 时间:2024/05/20 09:48
如何同时使用jsp&thymeleaf双视图,下面的实践案例继续在之前已经构建的工程基础上展开。

1、首先定义两中视图对应的页面:
1.1、JSP:

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>JSP</title>
</head>
<body>
<h1>Hello ${name} from JSP!</h1>
</body>
</html>

1.2、Thymeleaf:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8" />
<title>Thymeleaf</title>
</head>
<body>
<h1>Hello <span th:text="${name}"></span> from Thymeleaf!</h1>
</body>
</html>

2、定义处理视图的视图解析器配置类:
package com.shf.springboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

/**
* 主要配置多视图实现的视图解析器相关bean实例
* @author song
*/
@Configuration
public class ViewResolverConfiguration {

@Bean
public InternalResourceViewResolver getJspViewResolver(){
InternalResourceViewResolver jspViewResolver=new InternalResourceViewResolver();
jspViewResolver.setPrefix("/WEB-INF/");
jspViewResolver.setSuffix(".jsp");
jspViewResolver.setViewClass(JstlView.class);
//通过ViewNames属性来实现,通过请求中返回的视图名称匹配其采用哪个对应的视图解析器处理,从而找到对应prefix下的页面
jspViewResolver.setViewNames("jsp/*");
jspViewResolver.setOrder(10);
//开发时不启用缓存,改动即可生效
jspViewResolver.setCache(false);
return jspViewResolver;
}
}

3、下一步即可编写一个控制器处理请求:
package com.shf.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
* 验证多视图模板
* @author song
*/
@Controller
public class HomeController {

@RequestMapping(value = "/{type}/home", method = RequestMethod.GET)
public ModelAndView showJspHome(@PathVariable(value="type") String type) {
ModelAndView model = new ModelAndView();
model.addObject("name", "帅帅");
if("jsp".equals(type)){
//加入类型路径,从而可以通过viewNames来判断选择视图对应的解析器
model.setViewName("jsp/home");
}else if("thymeleaf".equals(type)){
model.setViewName("thymeleaf/home");
}else{
model.setViewName("error");
}
return model;
}

}

4、下面我们启动服务,进行请求验证:



以上完美的实现了双视图的应用,下面来对1~4中关键配置进行分析。

4.1、ViewNames:在视图解析器配置中加入了jspViewResolver.setViewNames("jsp/*");配置,此配置能够协助我们根据controller中设定的视图名称判断,选择匹配的视图解析器进行视图选择处理。目前通过jsp/*的方式通配jsp视图。
4.2、springboot默认的thymeleaf视图存放路径在src/main/resource/templates下,此时为了能够更好的通过viewNames匹配,我们将thymeleaf视图页面存放在src/main/resource/templates/thymeleaf目录下,故通过thymeleaf/*的方式通配thymeleaf视图。

2、如果我们不想采用系统默认的thymeleaf存放路径,需要自定义设置thymeleaf模板应用相关属性(如路径),则直接在上述2中的视图解析配置类进行相关视图解析bean实例的构建:
2.1、修改视图解析器配置类:
package com.shf.springboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.view.ThymeleafView;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import org.thymeleaf.templateresolver.TemplateResolver;

/**
* 主要配置多视图实现的视图解析器相关bean实例
* @author song
*
*/
@Configuration
public class ViewResolverConfiguration {

@Bean
public InternalResourceViewResolver getJspViewResolver(){
InternalResourceViewResolver jspViewResolver=new InternalResourceViewResolver();
jspViewResolver.setPrefix("/WEB-INF/");
jspViewResolver.setSuffix(".jsp");
jspViewResolver.setViewClass(JstlView.class);
//通过ViewNames属性来实现,通过请求中返回的视图名称匹配其采用哪个对应的视图解析器处理,从而找到对应prefix下的页面
jspViewResolver.setViewNames("jsp/*");
jspViewResolver.setOrder(10);
//开发时不启用缓存,改动即可生效
jspViewResolver.setCache(false);
return jspViewResolver;
}
@Bean
public TemplateResolvertemplateResolver(){
TemplateResolver templateResolver=new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setOrder(0);
templateResolver.setCacheable(false);
templateResolver.setCharacterEncoding("UTF-8");
return templateResolver;
}
@Bean
public SpringTemplateEnginetemplateEngine(){
SpringTemplateEngine templateEngine=new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
return templateEngine;
}
@Bean
public ThymeleafViewResolverthymeleafViewResolver(){
ThymeleafViewResolver thymeleafViewResolver=new ThymeleafViewResolver();
thymeleafViewResolver.setTemplateEngine(templateEngine());
thymeleafViewResolver.setViewClass(ThymeleafView.class);
thymeleafViewResolver.setViewNames(new String[]{"thymeleaf/*"});
thymeleafViewResolver.setCharacterEncoding("UTF-8");
//开发时不启用缓存,改动即可生效
thymeleafViewResolver.setCache(false);
return thymeleafViewResolver;
}
}
2.2、添加设定路径下的页面模板

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8" />
<title>Thymeleaf</title>
</head>
<body>
<h1>Hello <span th:text="${name}"></span> fromWEB-INF Thymeleaf!</h1>
</body>
</html>
2.3、重新启动服务进行验证

验证成功,浏览器渲染的自定义路径下页面。

3、此时我们打包成jar启动服务尝试下访问Thymeleaf视图:


访问失败,由于我们设置新的模板路径在WEB-INF下,此时jar部署模式下无法查找其目录下对应的模板视图。并且虽然我们的在resource下设定了error页面,此时也无法使用,同样由于设置了Thymeleaf模板路径。
那么我们取消自定义设置,重新打包为jar,访问resource目录下对应的视图:

成功渲染。(jar模式启动服务在WEB-INF下的无法访问,仅可以访问resource下的

4、那么我们打包war包部署在常规容器下呢,验证下自定义路径的请求结果:


验证成功。

稍微调整下之前welcome的请求:
@GetMapping("/welcome")
public String welcome(Map<String, Object> model) {
model.put("time", new Date());
model.put("message", this.message);
return "jsp/welcome";
}


0 0