Spring Boot中使用之JSP篇

SpringBoot官方不推荐的jsp,先来看看整体的框架结构,跟前面介绍Thymeleaf的时候差不多,只是多了webapp这个用来存放jsp的目录,静态资源还是放在resources的static下面。

引入依赖

<!--WEB支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--jsp页面使用jstl标签-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

<!--用于编译jsp-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

使用内嵌的tomcat容器来运行的话只要这3个就好了

application.properties配置

要支持jsp,需要在application.properties中配置返回文件的路径以及类型

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

这里指定了返回文件类型为jsp,路径是在/WEB-INF/jsp/下面。

创建WebApp文件夹

新建Springboot项目如果模板要用jsp的话,需要把jsp文件放到webapp下面,这时需要手动创建文件夹,或者把别的项目中的webapp拷贝过来,这时该文件夹是不是能被识别的,需要如下图:


这里写图片描述

解决方法:
只需要配置一下,将webapp文件夹关联上就可以了,如下图:

这里写图片描述

控制类

上面步骤有了,这里就开始写控制类,直接上简单的代码,跟正常的springMVC没啥区别:

@RequestMapping("/showEmp")
public ModelAndView showEmp(){
        ModelAndView mav=new ModelAndView("/show");
        List list=new ArrayList<Emp>();
        Emp emp=new Emp();
        list=empService.queryAll(emp);
        mav.addObject("list",list);
        return mav;

    }

jsp页面编写

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>learn Resources</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

<div style="text-align: center;margin:0 auto;width: 1000px; ">
    <h1>Spring boot</h1>
    <a href="/emp/toAdd">添加员工</a>
    <table width="100%" border="1" cellspacing="1" cellpadding="0">
        <tr>
            <td>编号</td>
            <td>姓名</td>
            <td>密码</td>

        </tr>
        <c:forEach var="emp" items="${list}">
            <tr>
                <td th:text="${emp.empId}">编号</td>
                <td th:text="${emp.empName}">姓名</td>
                <td th:text="${emp.password}">密码</td>

            </tr>
        </c:forEach>
    </table>
</div>
</body>
</html>

启动类

启动类不变还是最简单的

@SpringBootApplication
public class Application  {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

内嵌Tomcat容器运行项目

基本配置好了就可以启动项目http://localhost:8080/emp/showEmp

Thymeleaf和jsp共存

众所周知,Springboot中新增了Thymeleaf模板的自动装载,但如果同时使用jsp会发生什么事情呢?答案是自动注入的ThymeleafviewResolver也会匹配到寻找Jsp视图的请求,ThymeleafviewResolver找不到对应的Thymeleaf视图后接着返回了error错误页面

如果让程序即支持Thymeleaf又不支持jsp,那么可以如下改配置文件:

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
spring.mvc.view.order: 2

说明:在寻找时会首先寻找.html文件,如果找不到再找.jsp文件

-----------------------------------------------------------------------------------------------------------------------------------------------------------

内嵌Tomcat属性配置

关于Tomcat的偶有属性都在org.springframework.boot.autoconfigure.web.ServerProperties配置类中做了定义,我们只需在application.properties配置属性做配置即可。通用的Servlet容器配置都已”server”左右前缀,而Tomcat特有配置都以”server.tomcat”作为前缀。下面举一些常用的例子。

配置Servlet容器

#配置程序端口,默认为8080
server.port= 8080
#用户绘画session过期时间,以秒为单位
server.session.timeout=
# 配置默认访问路径,默认为/
server.context-path=

配置Tomcat:

# 配置Tomcat编码,默认为UTF-8
server.tomcat.uri-encoding=UTF-8
# 配置最大线程数
server.tomcat.max-threads=1000

外部的Tomcat服务器部署war包

Spring Boot项目需要部署在外部容器中的时候,Spring Boot导出的war包如果直接在Tomcat的部署会报错,不信你可以试试看。
需要做到下面两点修改才可以:

  • 继承SpringBootServletInitializer
    外部容器部署的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要在启动类中继承SpringBootServletInitializer并实现configure方法:
public class Application extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

这个类的作用与在web.xml中配置负责初始化Spring应用上下文的监听器作用类似,只不过在这里不需要编写额外的XML文件了。

  • pom.xml修改tomcat相关的配置
    如果要将最终的打包形式改为war的话,还需要对pom.xml文件进行修改,因为spring-boot-starter-web中包含内嵌的tomcat容器,所以直接部署在外部容器会冲突报错。这里有两种方法可以解决,如下
    方法一
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

在这里需要移除对嵌入式Tomcat的依赖,这样打出的war包中,在lib目录下才不会包含Tomcat相关的jar包,否则将会出现启动错误。
还有一个很关键的关键点,就是tomcat-embed-jasper中scope必须是provided。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有这个javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了。这个关键点同样适应于下面说的第二种方法。

方法二
直接添加如下配置即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

provided的作用上面已经介绍的很透彻了,这里就不啰嗦了,这种方式的好处是,打包的war包同时适合java -jar命令启动以及部署到外部容器中。

如果你不喜欢默认的打包名称,你可以通过节点里添加内容。

<build>
  <finalName>springBootJsp</finalName>
</bulid>

最后启动tomcat输入http://localhost:8080/springBootJsp/emp/showEmp查看效果,还是美美哒
 

关于使用jar部署

上面已经测试过了,正常情况下包含jsp的页面是无法用jar的运行的,因为jsp默认是在webapp目录下,可是打包成jar是没有webapp这个目录结构的。

虽然网上有介绍说通过pom.xml配置,把WEB-INF目录复制到META-INF/resources下面。但是博主试了一整天还是访问不了,最后放弃了。各位如何有兴趣可以继续尝试,毕竟war也可以通过java -jar命令来启动的不是么。

 

猜你喜欢

转载自blog.csdn.net/fmwind/article/details/81144905