springboot&jsp
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
springboot整合html模板引擎的时候,官方建议使用Thymeleaf和freemarker,已经放弃了对jsp的支持也不建议使用jsp,但是我们还是使用springboot整合jsp来讲述使用方法和中间遇到的一些坑。
一、目标
基于springboot2.x,整合jsp模板引擎,并展示用户的基本信息。
二、springboot整合jsp
1
引入依赖
springboot整合jsp除了引入基础依赖之外,还要引入javax.servlet-api和tomcat-embed-jasper。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--用于编译jsp--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!--<scope>provided</scope>--> </dependency>
springboot将引入所有必须的依赖并且注入所有必需的配置来使用jsp。
2
修改application.properties
要支持jsp,需要在application.properties中配置返回文件的路径以及类型。
spring.mvc.view.prefix=/WEB-INF/jsp spring.mvc.view.suffix=.jsp
springboot会去src/main/webapp/WEB-INF/jsp下寻找jsp文件。
3
编码实现
用户信息实体类:
@Setter @Getter @ToString public class User implements Serializable { private Long id; // 主键ID private String name; // 姓名 private Date createTime; private Integer sex; private Integer age; }
编写IndexController处理简单的用户信息查询请求:
@Controller @Slf4j public class IndexController { @GetMapping("/user/{id}") public String queryUser(@PathVariable("id") Long id, Model model) { User user = new User(); user.setId(id); user.setName("Typhoon"); user.setAge(28); user.setSex(1); model.addAttribute("user",user); return "/index"; } }
在src/main/webapp/WEB-INF/jsp目录下新建index.jsp文件:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!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>jsp</title> </head> <body> <p> 你好 ${user.name}</p> <p> 年龄 ${user.age}</p> </body> </html>
编写应用启动类:
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
4
启动应用&测试
使用Main启动应用,浏览器输入http://localhost:8080/user/1:
应用启动成功,但是发送请求出现404,服务端无法接收并处理请求。
使用mvn -U clean compile spring-boot:run命令启动应用,再次发起请求:
这种方式启动就能正常处理请求,为什么?在StackOverflow中搜索新的关键字,找到这个文章https://stackoverflow.com/questions/30237768/run-spring-boots-main-using-ide 里面有人遇到类似的问题"Seems like mvn spring-boot:run does some more magic that does not happen when running the main directly." 相关答案帖子里的1L,2L说的很详细了. IntelliJ IDEA没有将<scope>provided </scope>的依赖注入到类路径中,用main()方法启动的话就会出现上述问题,所以springboot整合jsp的时候建议使用mvn spring-boot:run启动。
总结
此篇幅中我们基于springboot2.x整合了jsp,并且在使用过程中遇到了一些问题,由于springboot官方不建议使用jsp作为模板引擎,所以其对jsp原生支持不太好,一些常见的问题也没有主动修复,所以springboot与jsp整合建议仅限于个人学习和知识扩展,真正的项目开发中建议使用Thymeleaf和freemarker替代jsp或者使用目前比较流行的前后端分离方案。