IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目
这篇文章就是我最近学习spring boot的一个小结。总结遇到的问题以及各种坑吧。
spring Boot 绝对是一个牛逼一塌糊涂的框架,boot 引导, 用spring boot 构建项目,简直是要多快有多快啊。
下面做一个spring boot 的小结
1. 这篇文章http://blog.csdn.net/u011998835/article/details/78352829,我主要写的是使用spring boot 如何进行热部署,加快开发效率
2. 这篇文章 http://blog.csdn.net/u011998835/article/details/78360796,我主要写的是新的模板引擎thymeleaf的用法。但我今天尝试把我以前写过的项目中jsp转换成thymeleaf,我发现我还是太天真了,有的还真是不是那么简单的就能转换的,include的命令,我用不好,路径的写法,js里面&&的编译错误,太伤人了。当然最让我没办法的就是 shiro的标签,我按照网上的方法,结果就是不起作用。所以我放弃了,我打算换成我熟悉的jsp吧。但是这个jsp也不是那么简单换的,本篇文章将细讲。
3. 这篇文章 http://blog.csdn.net/u011998835/article/details/78362795,我主要写的是spring boot与数据库如何打交道。在application.properties中配置一下,添加一些依赖,以及druid数据源的配置,但那篇文章忘记配置DruidWebStatFilter了,就是监控页面的配置,这个在这里补充了。
4. 这篇文章 http://blog.csdn.net/u011998835/article/details/78364360,我主要写的是spring boot 集成mybatis框架。但这里我使用网上最方便的注解方式,看着确实方便,但我忘记加分页情况的考虑的。估计以后的某篇文章我会补充。mybatis如果用这种方式写,那简直不要太简单了,纯粹写写sql语句,但是我知道这是天真的想法。
5. 这篇文章http://blog.csdn.net/u011998835/article/details/78369721,我主要写的是spring boot集成 hibernate 和ehcache框架。这个很顺利的完成了,最复杂的地方就是 sessionFactory的配置。
6. 这篇文章 http://blog.csdn.net/u011998835/article/details/78379905,集成shiro。我。。。我都想哭啊,这个hibernate集成shiro,我实在搞伤了。我在上一篇基础上也就是在集成了hibernate和ehcache两个框架基础上集成shiro。第一次我百度看是否可以直接使用xml文件,发现真的可以。@Configuration @ImportResource两个注解就搞定了,但不生效(实际上是生效的,只是我被url拦截这个坑搞了,参见这里http://blog.csdn.net/u011998835/article/details/78384759),我看网上都是java代码形式配置,那行吧,第二次我就按照java代码一点一点码代码码上去了。结果一运行起来,就报错,Could not obtain transaction-synchronized Session for current thread。这个异常,我百度解决办法,配置 openSessionViewFilter,运行不报错了。但是单元测试,依旧出问题。我就慢慢找原因啊,我只配置hibernate的时候都没错啊,加上shiro就错,肯定shiro配置错了,终于我找到错误,在java代码中不要实例化@Bean LifecycleBeanPostProcessor,虽然我不知道为什么。但确实完美解决了问题。
7.这篇文章 http://blog.csdn.net/u011998835/article/details/78384759,我发现@ImportResource这个注解还是 很强大的嘛,我把java代码版的shiro配置换成xml配置,发现就算有LifecycleBeanPostProcessor也不报错了。但是shiro的filterChainDefinitions这个真的要注意啦,不要随便怀疑就是shiro配置错了,有可能就是你拦截的url 太模糊太...导致是个请求都拦截了,所以要配置细致一些。
好了,本篇文章依旧是有大量干货。
1. 集成jsp的 pom文件
先删除掉 thymeleaf的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!--<scope>provided</scope>--> <!-- 如果不注释,你会发现main线程运行报404错误,必须使用 spring-boot:run这个命令运行才行。所以我们注释掉--> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
不少的网上,都是前两个有<scope>标签,但这两个标签就是坑。
如果第一个不删除,项目都无法跑起来,直接说找不到什么类。
第二个我为什么注释掉了呢,如果你写上,你会发现,你直接运行就是main线程方式运行,项目正常跑起来,但是所有jsp都是404。这是我最无语的了,我看了网上大部分资料,几乎千篇一律都是加上的,都说正常运行的,幸亏我在一个评论中找到,不能使用main线程,要使用spring-boot:run。可能有人不懂,这在哪。看下图
我发现确实可以了,但必须用这种方式吗? 我就百度了,发现有人做出了解答,只要删除第二个scope就可以用main形式了,但是如果打包成war,放到tomcat下,可能有api包冲突的情况吧。所以 pom文件是这样的。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
第二个: jsp文件放在哪呢。这我也有点不明白,可能是maven项目的web项目都要新建一个webapp这样的文件夹吧。看图。
注意WEB-INF下面的web.xml文件是不需要的了。注意图中 META-INF.resources目录是打jar自动生成的,不是我新建的目录。
网上大部分都是说在propties里面添加 spring.mvc.view.prefix什么的了。但这里我偷懒,直接使用以前配置spring对应的servlet.xml文件来解决。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- Model与View 的切换配置 -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 不拦截静态请求,如css,js -->
<mvc:default-servlet-handler />
<!-- 处理特殊的url -->
<mvc:view-controller path="/" view-name="front/index"/>
<mvc:view-controller path="/admin" view-name="admin/index"/>
<mvc:view-controller path="/admin/" view-name="admin/index"/>
<mvc:view-controller path="/user" view-name="front/user/index"/>
<mvc:view-controller path="/user/" view-name="front/user/index"/>
</beans>
然后配置java代码,很简单的啦。
package com.dashuai.dadminboot.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:applicationContext-servlet.xml")
public class ServletConfigFromXML {
}
就OK了。 这样基本jsp的配置就完成了。
接下来是我发现 使用 springboot 自动创数据库表的奇怪地方。如图
接下来 我们来打包,直接运行jar文件,就可以跑起来的web项目。
pom文件的修改
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<fork>true</fork>
<!-- 可执行的jar 必须有mainClass入口-->
<mainClass>com.dashuai.dadminboot.DAdminBootApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<resources>
<!-- 打包时将jsp文件拷贝到META-INF目录下-->
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到-->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
然后 clean package,就可以在target目录下找到jar文件
我们可以用压缩包工具打开jar文件,看看里面打包情况。 这个jar包,41M。
然后我们写一个bat文件运行。
java -jar dadminboot-0.0.1-SNAPSHOT.jar --spring.config.location=application.properties
双击运行。
浏览器访问
当然了,我运行可以。如果你运行相同的jar就不一定行了,因为 数据库的地址访问 不一样啦。我们可以直接对jar包中properties文件进行修改的,然后运行的。
经过这些天 对 spring boot的学习, spring boot 确实是非常非常优秀的。以前你所学的所有,都不是没有用的,都是可以转到boot上来的。
下面奉上项目源码 : 百度网盘。 http://pan.baidu.com/s/1pLdZ02v。 csdn: http://download.csdn.net/download/u011998835/10043892