欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

程序员文章站 2022-03-30 15:56:58
...

   这篇文章就是我最近学习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。可能有人不懂,这在哪。看下图

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

我发现确实可以了,但必须用这种方式吗? 我就百度了,发现有人做出了解答,只要删除第二个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这样的文件夹吧。看图。

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

注意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 自动创数据库表的奇怪地方。如图IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

  接下来 我们来打包,直接运行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文件

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目


IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

我们可以用压缩包工具打开jar文件,看看里面打包情况。 这个jar包,41M。

然后我们写一个bat文件运行。

java -jar dadminboot-0.0.1-SNAPSHOT.jar --spring.config.location=application.properties

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

双击运行。IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

浏览器访问

IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目

当然了,我运行可以。如果你运行相同的jar就不一定行了,因为 数据库的地址访问 不一样啦。我们可以直接对jar包中properties文件进行修改的,然后运行的。

   经过这些天 对 spring boot的学习, spring boot 确实是非常非常优秀的。以前你所学的所有,都不是没有用的,都是可以转到boot上来的。

  下面奉上项目源码 : 百度网盘。 http://pan.baidu.com/s/1pLdZ02v。  csdn: http://download.csdn.net/download/u011998835/10043892