zoukankan      html  css  js  c++  java
  • Struts2不扫描jar包中的action

      

      今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action。struts是基于注解使用 struts。于是我找struts.xml,最后发现被放在jar包里面了。一开始我的解决办法是将struts的相关代码解开jar包(也就是编译后的文件)放在WEB-INFclasses目录下,功能可以正常使用。

      后来查阅资料发现,struts注解使用可以指定struts扫描action的jar文件位置,我们项目也正是限制了struts的扫描的包的名称,

    最主要的就是struts.convention.action.includeJars 这个属性,值可以是多个,用逗号隔开,但是一定要加.*?/common*.*?jar(!/)?正则表达式,我试过直接写jar包的命名也不行,不加正则表达式,会报错说

    The includeJars pattern [common.jar] did not match any jars in the classpath.

    研究struts-conventionxxx.jar的中struts-plugin.xml配置如下:

    <struts order="20">
      <bean type="com.opensymphony.xwork2.UnknownHandler" name="convention" class="org.apache.struts2.convention.ConventionUnknownHandler"/>
    
      <bean type="org.apache.struts2.convention.ActionConfigBuilder" name="convention" class="org.apache.struts2.convention.PackageBasedActionConfigBuilder"/>
      <bean type="org.apache.struts2.convention.ActionNameBuilder" name="convention" class="org.apache.struts2.convention.SEOActionNameBuilder"/>
      <bean type="org.apache.struts2.convention.ResultMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultResultMapBuilder"/>
      <bean type="org.apache.struts2.convention.InterceptorMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultInterceptorMapBuilder"/>
      <bean type="org.apache.struts2.convention.ConventionsService" name="convention" class="org.apache.struts2.convention.ConventionsServiceImpl"/>
    
      <bean type="com.opensymphony.xwork2.config.PackageProvider" name="convention.packageProvider" class="org.apache.struts2.convention.ClasspathPackageProvider"/>
      <bean type="com.opensymphony.xwork2.config.PackageProvider" name="convention.containerProvider" class="org.apache.struts2.convention.ClasspathConfigurationProvider"/>
    
      <constant name="struts.convention.actionConfigBuilder" value="convention"/>
      <constant name="struts.convention.actionNameBuilder" value="convention"/>
      <constant name="struts.convention.resultMapBuilder" value="convention"/>
      <constant name="struts.convention.interceptorMapBuilder" value="convention"/>
      <constant name="struts.convention.conventionsService" value="convention"/>
    
      <constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
      <constant name="struts.convention.result.flatLayout" value="true"/>
      <constant name="struts.convention.action.suffix" value="Action"/>
      <constant name="struts.convention.action.disableScanning" value="false"/>
      <constant name="struts.convention.action.mapAllMatches" value="false"/>
      <constant name="struts.convention.action.checkImplementsAction" value="true"/>
      <constant name="struts.convention.default.parent.package" value="convention-default"/>
      <constant name="struts.convention.action.name.lowercase" value="true"/>
      <constant name="struts.convention.action.name.separator" value="-"/>
      <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>
      <constant name="struts.convention.package.locators.disable" value="false"/>
      <constant name="struts.convention.package.locators.basePackage" value=""/>
      <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/>
      <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker"/>
      <constant name="struts.convention.redirect.to.slash" value="true"/>
      <constant name="struts.convention.action.alwaysMapExecute" value="true"/>
      <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
      <!-- <constant name="struts.convention.action.includeJars"  /> -->
      <constant name="struts.convention.action.fileProtocols" value="jar" />
    
      <constant name="struts.convention.classes.reload" value="false" />
    
      <constant name="struts.convention.exclude.parentClassLoader" value="true" />
    
      <package name="convention-default" extends="struts-default">
      </package>
    </struts>

    解决上面问题:

    设置Convention插件文件协议类型

         (1) 设置Convention插件需要搜索的jar包
          <constant name="struts.convention.action.includeJars" value=".*?/struts2-action*.*?jar(!/)?" />
           该常量指定包作为根包来搜索Action类。
          Convention插件除了扫描默认的action,actions,struts,struts2,还会扫描该常量指定的一个或多个包,
          Convention会试图从指定包中发现Action类。

          <constant name="struts.convention.action.packages" value="com.home.prog" />

        (2)将编译后的文件放在WEB-INFclasses目录下

     (3) 将我们打成的jar包命名为struts.convention.action.includeJars  允许的名称

      需要注意的是,打成的jar包一般会包含META-INF目录,一般我们使用JDK自带的jar就可以打包,注意打包的时候不要将源码打到包里,eclipse一般也会将我们的代码编译到build目录,所以我们直接在编译后的目录打jar包即可,打包的时候注意路径问题。

      参考:     http://www.cnblogs.com/qlqwjy/p/7289391.html

    参数解释如下:

      <!--设置Convention插件定位视图资源的根路径,默认为/WEB-INFO/content -->
          <constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
          <!--如果设置为false,则可以将视图页面放置Action对应的目录(无需放入WEB-INFO/content) -->
          <constant name="struts.convention.result.flatLayout" value="true"/>
          <!--Convention搜索Action类的类名后缀,默认为Action -->
          <constant name="struts.convention.action.suffix" value="Action"/>
          <!--是否禁止通过包扫描Action,默认是false -->
          <constant name="struts.convention.action.disableScanning" value="false"/>
          <!--设置即使没有@Action注释,是否依然创建Action映射。默认值为false -->Create action mappings, even if no @Action is found
          <constant name="struts.convention.action.mapAllMatches" value="false"/>
          <!--设置是否所有实现com.opensymphony.xwork2.Action的Action都创建Action映射,默认是true -->
          <constant name="struts.convention.action.checkImplementsAction" value="true"/>
          <!--设置Convention映射的Action所在包的默认父包。默认值是convention-default -->
          <constant name="struts.convention.default.parent.package" value="convention-default"/>
          <!--设置映射Action时,是否将Action的name属性值转换为所有字母小写,默认值是true -->
          <constant name="struts.convention.action.name.lowercase" value="true"/>
          <!--设置映射Action时指定name属性值各单词之间的分隔符。默认值为中画线(“-”) -->
          <constant name="struts.convention.action.name.separator" value="-"/>
          <!--默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索 -->
          <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>
          <!--指定禁止从Action的根包里搜索Action。默认值为false -->
          <constant name="struts.convention.package.locators.disable" value="false"/>
          <!--如果指定了该常量,Convention只会以该常量值开始的包中搜索Action类 -->
          <constant name="struts.convention.package.locators.basePackage" value=""/>
          <!--指定排除在搜索Action之外的包。默认值为org.hibernate.* ... -->
          <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/>
          <!--指定Convention映射的Result时默认支持的结果类型。默认值为dispatcher,velocity,freemarker -->
          <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker"/>
          <!--设置是否重定向到斜线(/)。例如用户请求/foo,但/foo不存在时,如果设置该常量为可重定向到/foo/。默认值是true -->
          <constant name="struts.convention.redirect.to.slash" value="true"/>
  • 相关阅读:
    查看自己的笔记本是否支持64位系统
    关闭445端口
    与postgis相关的一些常用的sql
    postgis 赋予postgresql空间数据库的能力
    ThreadLocal
    获取跨域请求的自定义的response headers
    java Bean的映射工具
    Java多线程学习
    (14)Spring Boot定时任务的使用【从零开始学Spring Boot】
    (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/9451535.html
Copyright © 2011-2022 走看看