JDK8环境中使用struts2的步骤详解

 更新时间:2018年11月13日 11:29:56   作者:kongwenqiang  
这篇文章主要给大家介绍了关于在JDK8环境中使用struts2的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

背景

Struts是Apache基金组织中Jakarta项目组的一个开源(Open Source)项目,主要就是实现了MVC设计模式,在Struts中有自己的控制器(ActionServlet),同时也提供了各种常用的页面标签库以减少JSP页面中的Scriptlet代码,Struts实际上就属于在传统技术上发展起来的一种新的应用模式,其操作的本质依然还是JSP、Servlet、JavaBean等技术的应用,Struts的体系结构图如下。

最近将组内项目的部署环境进行了一次升级。将JDK1.7S升级为1.8,Resin替换为Tomcat。在升级替换的过程中遇到了一些问题。特记录再次,希望能帮助有同样需求的朋友。

Struts2 和 JDK8

项目中使用的Struts2版本是2.3.35。

<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.35</version>
</dependency>

Struts2里面依赖xwork-core

<dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<version>2.3.35</version>
</dependency>

xwork-core依赖asm-*

问题来了!

低版本的ASM不能在JDK1.8环境中使用。如果强行使用,会导致一些奇怪的问题。

例如:

只有一部分Action类可以正常被Struts2加载并处理http请求。某些在JDK1.7环境下可以正常工作的Action不能在JDK1.8下使用。原来可以访问的接口,现在是404。
具体问题出在:

private void readClassDef(String className) {
if (!className.endsWith(".class")) {
className = className.replace('.', '/') + ".class";
}
try {
URL resource = classLoaderInterface.getResource(className);
if (resource != null) {
InputStream in = resource.openStream();
try {
ClassReader classReader = new ClassReader(in);
classReader.accept(new InfoBuildingVisitor(this), ClassReader.SKIP_DEBUG);
} finally {
in.close();
}
} else {
throw new XWorkException("Could not load " + className);
}
} catch (IOException e) {
throw new XWorkException("Could not load " + className, e);
}
}

这部分代码就因为使用了低版本的ASM导致类解析失败(IndexOutOfBoundsException)。

解决办法一

最简单方便的解决版本就是升级Struts2的版本到2.5.x。新版本将xwork依赖直接合并到struts2-core中了。而且使用了ASM 5.X版本,支持JDK8。

解决办法二

使用Struts2官方提供的一个插件。具体用法如下:

在项目中加入依赖:

<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-java8-support-plugin</artifactId>
<version>2.3.35</version>
</dependency>

排除ASM依赖

<dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<exclusions>
<exclusion>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
</exclusion>
<exclusion>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
</exclusion>
</exclusions>
</dependency>

Struts2 版本升级问题

标签库不兼容

众所周知,Struts2框架的安全问题很多,建议升级到最新版本2.5.x。

但是2.5.x版本的Struts2提供的标签库和低版本的不兼容。这就会导致原有的JSP页面不能正常渲染。

当然了,如果你的项目里面没有使用Struts2替换的标签,这个问题可以忽略了。

核心类拦截器变化

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
之前的核心过滤器全类名会有个ng ,struts2.5核心过滤器没有这个
-->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

aspectjweaver

我们项目使用的版本是:

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>

升级JDK1.8以后,需要同时升级该jar的版本到1.8.13。

参考

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 关于java的九个预定义Class对象

    关于java的九个预定义Class对象

    这篇文章主要介绍了关于java的九个预定义Class对象,在Java中,没有类就无法做任何事情。然而,并不是所有的类都具有面向对象特征。如Math.random,并只需要知道方法名和参数,需要的朋友可以参考下
    2023-05-05
  • springboot访问请求404的原因及解决办法

    springboot访问请求404的原因及解决办法

    在使用Spring Boot开发应用程序时,有时可能会遇到访问请求出现404错误的情况,即请求的资源未找到,这篇文章主要给大家介绍了关于springboot访问请求404的原因及解决办法,需要的朋友可以参考下
    2023-09-09
  • SpringBoot实现读取YML,yaml,properties文件

    SpringBoot实现读取YML,yaml,properties文件

    yml,yaml,properties三种文件都是用来存放配置的文件,一些静态数据,配置的数据都会存放到里边。本文主要为大家整理了SpringBoot实现读取YML,yaml,properties文件的方法,需要的可以参考一下
    2023-04-04
  • 记一次在idea离线使用maven问题(推荐)

    记一次在idea离线使用maven问题(推荐)

    这篇文章主要介绍了记一次在idea离线使用maven问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • springboot打包实现项目JAR包和依赖JAR包分离

    springboot打包实现项目JAR包和依赖JAR包分离

    这篇文章主要介绍了springboot打包实现项目JAR包和依赖JAR包分离,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 说说字符串转 OffSetDateTime 你真的会用吗

    说说字符串转 OffSetDateTime 你真的会用吗

    这篇文章主要介绍了字符串转 OffSetDateTime 你真的会用吗?具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot配置数据库密码特殊字符报错的解决

    springboot配置数据库密码特殊字符报错的解决

    这篇文章主要介绍了springboot配置数据库密码特殊字符报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java中的this引用及对象构造初始化

    java中的this引用及对象构造初始化

    这篇文章主要介绍了java中的this引用及对象构造初始化,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • SpringBoot过滤器与拦截器深入分析实现方法

    SpringBoot过滤器与拦截器深入分析实现方法

    大家应该都晓得实现过滤器需要实现 javax.servlet.Filter 接口,而拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步,本文通过实例代码给大家介绍SpringBoot 过滤器和拦截器的相关知识,感兴趣的朋友一起看看吧
    2022-11-11
  • 使用springboot aop来实现读写分离和事物配置

    使用springboot aop来实现读写分离和事物配置

    这篇文章主要介绍了使用springboot aop来实现读写分离和事物配置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论