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

注意
  • 日志管理使用的是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.csdn.net/weixin_37577564/article/details/80329775
  • 整合struts2需要额外引入 struts2的一个插件包struts2-spring-plugin-2.3.34.jar,在官方下载的压缩包下解压后可以找到的

二、Log4J2日志配置

  • 以下是log4j2.xml的具体配置:

  • ---------------先附上官方给的configuration说明---------------

这是官方网址,有能力的可以进去自行查看各种具体的信息和配置:http://logging.apache.org/log4j/2.x/manual/configuration.html**
在官方的配置说明

  • ------------log4j2.xml具体配置------------
<?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.csdn.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.csdn.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类时必须使用beanprototype,即每次请求都会产生新的bean。其他的bean都可以使用注解的方式自动注解,唯有action需要在xml里面配置。
  • 因为spring的强大,一次注入,处处使用,但是为了实现封装,所以对于model层的使用还是要封装一下,尽量不要在dao层直接使用model的bean,能传参就传参。
  • struts.xml的action标签不再直接指向实现类,而指向IoC容器中的bean名字,其它的正常。
总结一下,无能狂怒啊啊啊啊啊啊啊啊啊啊啊啊啊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值