spring5.0整合struts2.3 时的一些注意事项 和使用AspectJ springAOP Log4J2配置问题 jar包依赖等
spring5.0整合struts2.3 时的一些注意事项 和使用AspectJ springAOP Log4J2配置问题 jar包依赖等
Elipse+MySQL8+Struts2.3+Spring5.0+Log4J2 2.11
(写给自己的参考)
一、目录结构
说明:
① jdk版本要与tomcat版本兼容,这里用的是tomcat9+jdk1.8。
② notice为配置aop的位置
③ Jar 依赖包
aopalliance-.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
aspectjweaver.jar
cloud-cglib.jar
commons-fileupload-1.3.2.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.2.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
log4j-api-2.11.2.jar
log4j-core-2.11.2.jar
log4j-web-2.11.2.jar
mysql-connector-java-8.0.15.jar
ognl-3.0.21.jar
spring-aop-5.0.0.RELEASE.jar
spring-aspects-5.0.0.RELEASE.jar
spring-beans-5.0.0.RELEASE.jar
spring-context-5.0.0.RELEASE.jar
spring-context-indexer-5.0.0.RELEASE.jar
spring-context-support-5.0.0.RELEASE.jar
spring-core-5.0.0.RELEASE.jar
spring-expression-5.0.0.RELEASE.jar
spring-jdbc-5.0.0.RELEASE.jar
spring-messaging-5.0.0.RELEASE.jar
spring-orm-5.0.0.RELEASE.jar
spring-tx-5.0.0.RELEASE.jar
spring-web-5.0.0.RELEASE.jar
spring-webmvc-5.0.0.RELEASE.jar
struts2-convention-plugin-2.3.34.jar
struts2-core-2.3.34.jar
struts2-spring-plugin-2.3.34.jar
xwork-core-2.3.34.jar
-
包下载的链接:
- spring jar包下载:http://repo.spring.io/release/org/springframework/spring/
- spring AspectJ包最新版本下载:https://www.eclipse.org/aspectj/downloads.php
- spring aopalliance.jar官网下载:https://sourceforge.net/projects/aopalliance/
- CGLIB包下载:http://www.java2s.com/Code/Jar/c/Downloadcloudcglibjar.htm
- MySQL 驱动 下载:
http://central.maven.org/maven2/mysql/mysql-connector-java/ - log4j2的包可以在官网下载,进去找download
http://logging.apache.org/log4j/2.x/manual/configuration.html
注意:
- 日志管理使用的是log4j2 ,这个版本虽然依然支持.properties文件的配置,但是个人建议用xml格式的配置简单,容易修改,理解和使用。
- log4j2的三个依赖包一个都不要少,最好不要少,log4j-api-2.11.2.jar,log4j-core-2.11.2.jar,log4j-web-2.11.2.jar
- 这个版本配置文件名称也有所不同,log4j2.xml配置文件的位置需要在一个source文件夹中,一般放在src下,项目启动时会自动到source即src下寻找该xml文件。
- 使用spring aop 需要额外引入 aopalliance.jar包和aspectjweaver.jar
-
本人用的是MySQL8 ,新版本的驱动加载方式变为 com.mysql.cj.jdbc.Driver,如果连接数据库时报了time zone等等一些奇怪的的错误,在url后面加上
useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";, 建议在一开始就加上这个,什么都错不了,请参考这个博主的链接https://blog.****.net/weixin_37577564/article/details/80329775 - 整合struts2需要额外引入 struts2的一个插件包struts2-spring-plugin-2.3.34.jar,在官方下载的压缩包下解压后可以找到的
二、Log4J2日志配置
这是官方网址,有能力的可以进去自行查看各种具体的信息和配置:http://logging.apache.org/log4j/2.x/manual/configuration.html**
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="info" monitorInterval="1800">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
</Console>
<!-- 配置在 项目所在盘的根目录
(该项目在E盘,因此在E盘下会有一个与项目同名的文件夹,文件夹下有该命名日志文件)
${web:contextPath}表示为web项目所在的盘或者根目录
下保存日志 -->
<File name="conextPathLog" fileName="${web:contextPath}/logs/myLog.log">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
</File>
<!-- 配置绝对路径下保存日志文件 -->
<RollingFile name="abLog" fileName="F:\logs\log0.log"
filePattern="F:\logs\%d{yyyy-MM-dd}-%i-log.log.gz"
immediateFlush="true">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<!-- 配置web项目相对路径下的日志 -->
<RollingFile name="actionLogRoot" fileName="logs/log.txt"
filePattern="logs/%d{yyyy-MM-dd}-%i-myLog.log.gz"
immediateFlush="true">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="1 KB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<!-- 配置日志保存在运行该项目的tomcat的logs文件夹下 -->
<RollingFile name="actionLogCatalina" fileName="${sys:catalina.home}/logs/myLog.log"
filePattern="${sys:catalina.home}/logs/%d{yyyy-MM-dd}-%i-actionLog.log.gz"
immediateFlush="true">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
</Appenders>
<Loggers>
<!-- 制定的日志 -->
<!-- 可正常输出日志 -->
<Logger name="xyz.tzh.example" level="Info" additivity="true">
<AppenderRef ref="abLog" />
</Logger>
<Logger name="xyz.tzh.example.action" level="info" additivity="true">
<AppenderRef ref="conextPathLog"></AppenderRef>
</Logger>
<Logger name="xyz.tzh.example.action" level="info" additivity="true">
<AppenderRef ref="actionLogCatalina"></AppenderRef>
</Logger>
<!-- 还没跑通 -->
<Logger name="xyz.tzh.example.action" level="info" additivity="true">
<AppenderRef ref="actionLogRoot"></AppenderRef>
</Logger>
<!-- 自动打印的日志 -->
<Root level="info">
<!-- 这里是输入到文件,很重要-->
<!-- 绝对路径下日志 -->
<AppenderRef ref="abLog" />
<!-- web项目所在根目录下或盘下日志 -->
<AppenderRef ref="conextPathLog"/>
<!-- web项目相对路径日志 -->
<!-- <AppenderRef ref="actionLogRoot"/> -->
<!-- tomcat服务器下logs下的日志 -->
<AppenderRef ref="actionLogCatalina"/>
<!-- 这里是输入到控制台-->
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
-
具体配置的作用请参考这篇,有很大帮助,更多细节请参考官方的说明:https://www.cnblogs.com/new-life/p/9246143.html
-
log4j2注意事项及说明:
-
日志文件保存路径问题:
-
目前本人经过操作后只知道这些路径可以配置:
- 绝对路径:即D:\myLogs\log01.log (文件后缀任意),注意斜杠。
- 使用系统环境获取的相对路径:
${sys:catalina.home}/logs/myLog.log
这个意思为:你跑项目的tomcat安装路径/logs/myLog.log,
logs是tomcat自己就有的logs文件夹。 - 官方给的
${web:rooDir}/logs/myLog.log
我没跑通,
用的时候无法获取路径,也无法创建日志文件,它也不报错。更奇怪的是当我在properties里面定义变量名,在fileName里取的时候,它也获取不到,它会先报个错误,Catalina-utility-1 ERROR appenders Appenders has no parameter that matches element Properties
,并直接把取变量用的表达式当作源字符串来命名文件,并且位置是在Elipse安装目录下,目前这个问题还没找到原因。 - 但是当我用另外一个类似的方法
${web:contextPath}
去取路径的时候是没问题的,没报错,definitely i’m so vegetable。可能是包冲突了,或者什么配置没加。 - 相对路径:虽然不知道原因,但是还是找到了低级点的方法,直接在fileName里写
logs/myLog.log
是可以正常使用的,而且创建了正常的文件夹,日志也可以输出。但是任然有问题,因为我想把它创建到web应用中,但是它还是创建到了Elipse中,虽然能记录日志,但是等发布到网上时将会有很多问题。任何手写的相对路径文件都会被创建到Elipse中。 - 一些其它方法:比如
${web:contextPath}
可以获取根目录或者项目所在的盘;${sys:catalina.home}
获取跑项目的tomcat安装目录,可以把日志放到tomcat的logs文件夹下,具体请查看上面的配置文件注释部分说明。
- 也可以参考这位博主的:https://blog.****.net/lwwl12/article/details/83109815
-
目前本人经过操作后只知道这些路径可以配置:
-
日志文件保存路径问题:
-
web.xml文件中log4j2的配置:
(直接复制加到 web.xml 最后就可以了)
<!-- log4j2-begin -->
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- log4j2-end -->
-
注意:
- web.xml中log4j2的监听器和过滤器在原来的log4j1.x中都已经失效了,强行配置会报 Exception:ClassNotFound。
-
同样的道理,在 Java 代码中的使用也发生了变化,原来的Logger类不再可用,它变成了父接口,因此你 . 也点不出来任何方法
Logger log=Logger.getLogger();,
新版本需要使用
Logger log=LogManager.getLogger();
该方法请自行查看文档,有多个重写方法,根据需要搬就行。 - 具体的实现请参考下面
- 整个web.xml 下的spring和struts2的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>springAndstruts2</display-name>
<!-- 配置spring启动 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置struts启动 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- log4j2-begin -->
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- log4j2-end -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
-
Java代码使用log4j2:
- 因为使用了spring AOP,所以在spring的 Aspect 的通知中使用即可
//getLogger该方法可以无参,将调用log4j2.xml中的Root节点下的默认日志
//带参数表示将使用xml配置中
//Logger节点定义的指定包和类的日志
//注意:参数必须与Logger节点中定义的name相同
Logger log=LogManager.getLogger("xyz.tzh.example.action");
log.info("level is info,info message");
log.error("level is error,error message");
log.debug("level is debug,debug message");
...
三、Spring5.0 AspectJ的使用时的配置和注意事项
-
基于注解的Aspect配置
- applicationContext.xml对于aspect的配置 :
applicationContext.xml 中aspect
<!-- 配置基于注解的aop aspectJ -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
-
说明:
- proxy-target-class 设置为true,表示将强制使用CGLIB来实现动态代理,参考这位博主的讲解:https://blog.****.net/axiaositong/article/details/81867330
- 一定切记不要忘记加入一开始提到的两个jar包 aopalliance.jar包和aspectjweaver.jar,这两个也不能忘spring-web-5.0.0.RELEASE.jar
spring-webmvc-5.0.0.RELEASE.jar。
- 关于Java切面如何实现AOP,请参考自己的资源库。
四、struts.xml的配置注意事项
- 既然是整合,那就得让spring起作用。Spring的作用就是管理所有bean,在struts里面管理一般bean与不整合时是一样的,只有在管理action类时必须使用bean的prototype,即每次请求都会产生新的bean。其他的bean都可以使用注解的方式自动注解,唯有action需要在xml里面配置。
- 因为spring的强大,一次注入,处处使用,但是为了实现封装,所以对于model层的使用还是要封装一下,尽量不要在dao层直接使用model的bean,能传参就传参。
- struts.xml的action标签不再直接指向实现类,而指向IoC容器中的bean名字,其它的正常。