• Convention插件


    考虑使用COnvention插件可以进行零配置而且插件进行很多规范的约定也可以对开发合作当中按着它相应的规律开发..感觉也挺方便管理的.下面简单介绍它的使用. 
    首先我们需要使用到的jar包: 
    Java代码  
    struts2-convention-plugin-2.1.8.jar   
    struts2-core-2.1.8.jar   
    xwork-core-2.1.6.jar   
    commons-fileupload-1.2.1.jar   
    freemarker2.3.16.jar  
    
    struts2-convention-plugin-2.1.8.jar
    struts2-core-2.1.8.jar
    xwork-core-2.1.6.jar
    commons-fileupload-1.2.1.jar
    freemarker2.3.16.jar
    
    web.xml的配置 
    Xml代码  
     <!-- Struts2过滤器 -->  
        <filter>  
            <filter-name>struts</filter-name>  
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
        </filter>  
           
        <filter-mapping>  
            <filter-name>struts</filter-name>  
            <url-pattern>*.action</url-pattern>  
    </filter-mapping>  
    
     <!-- Struts2过滤器 -->
        <filter>
            <filter-name>struts</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        
        <filter-mapping>
            <filter-name>struts</filter-name>
            <url-pattern>*.action</url-pattern>
    </filter-mapping>
    
    
    struts.xml的配置 
    Xml代码  
    <?xml version="1.0" encoding="UTF-8"?>  
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">  
    <struts>  
     <!--++++++++++++++++++++++++++++++++++++++++++++++++开发状态 -->    
        <!-- 是否显示详细错误信息 -->  
        <constant name="struts.devMode" value="true" />  
        <!-- 国际化资源文件名称 -->  
        <constant name="struts.custom.i18n.resources" value="i18n" />  
        <!-- 是否自动加载国际化资源文件  -->  
        <constant name="struts.i18n.reload" value="false" />  
        <!-- convention类重新加载 -->  
        <constant name="struts.convention.classes.reload" value="true" />  
     <!--++++++++++++++++++++++++++++++++++++++++++++++++开发状态 -->    
        <!-- 浏览器是否缓存静态内容 -->  
        <constant name="struts.serve.static.browserCache" value="true" />  
      
        <!-- 上传文件大小限制设置 -->  
        <constant name="struts.multipart.maxSize" value="-1" />  
      
        <!-- 主题 -->  
        <constant name="struts.ui.theme" value="simple" />  
        <!-- 编码 -->  
        <constant name="struts.i18n.encoding" value="UTF-8" />  
        <!-- 后缀 -->  
        <constant name="struts.action.extension" value="action" />  
      
        <!-- 结果资源的路径 -->  
        <constant name="struts.convention.result.path" value="/WEB-INF/template/" />  
        <!-- URL资源分隔符 -->  
        <constant name="struts.convention.action.name.separator" value="_" />  
           
        <package name="basePackage" extends="struts-default">  
            <interceptors>  
                <interceptor-stack name="baseStack">  
                    <interceptor-ref name="exception" />  
                    <interceptor-ref name="alias" />  
                    <interceptor-ref name="servletConfig" />  
                    <interceptor-ref name="i18n" />  
                    <interceptor-ref name="prepare" />  
                    <interceptor-ref name="chain" />  
                    <interceptor-ref name="debugging" />  
                    <interceptor-ref name="scopedModelDriven" />  
                    <interceptor-ref name="modelDriven" />  
                    <interceptor-ref name="fileUpload" />  
                    <interceptor-ref name="checkbox" />  
                    <interceptor-ref name="multiselect" />  
                    <interceptor-ref name="staticParams" />  
                    <interceptor-ref name="actionMappingParams" />  
                    <interceptor-ref name="params">  
                        <param name="excludeParams">dojo..*,^struts..*</param>  
                    </interceptor-ref>  
                    <interceptor-ref name="conversionError"/>  
                    <!-- 配置方法级别的校验 -->  
                    <interceptor-ref name="validation">  
                        <param name="excludeMethods">input,back,cancel,browse</param>  
                        <param name="validateAnnotatedMethodOnly">true</param>  
                    </interceptor-ref>  
                    <interceptor-ref name="workflow">  
                        <param name="excludeMethods">input,back,cancel,browse</param>  
                    </interceptor-ref>  
                </interceptor-stack>  
            </interceptors>  
      
            <!-- 配置默认拦截器栈 -->  
            <default-interceptor-ref name="baseStack" />  
      
            <!-- 未到找Action指向页面 -->  
            <default-action-ref name="errorPage" />  
      
            <action name="errorPage">  
                <result type="redirect">/html/error_page_404.html</result>  
            </action>  
      
        </package>  
      
      
      
        <package name="shop" extends="basePackage" namespace="/shop/">  
      
            <global-results>  
                <result name="error" type="freemarker">/WEB-INF/template/shop/error.ftl</result>  
            </global-results>  
      
        </package>  
           
    </struts>  
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
     <!--++++++++++++++++++++++++++++++++++++++++++++++++开发状态 --> 
        <!-- 是否显示详细错误信息 -->
        <constant name="struts.devMode" value="true" />
        <!-- 国际化资源文件名称 -->
        <constant name="struts.custom.i18n.resources" value="i18n" />
        <!-- 是否自动加载国际化资源文件  -->
        <constant name="struts.i18n.reload" value="false" />
        <!-- convention类重新加载 -->
        <constant name="struts.convention.classes.reload" value="true" />
     <!--++++++++++++++++++++++++++++++++++++++++++++++++开发状态 --> 
        <!-- 浏览器是否缓存静态内容 -->
        <constant name="struts.serve.static.browserCache" value="true" />
    
        <!-- 上传文件大小限制设置 -->
        <constant name="struts.multipart.maxSize" value="-1" />
    
        <!-- 主题 -->
        <constant name="struts.ui.theme" value="simple" />
        <!-- 编码 -->
        <constant name="struts.i18n.encoding" value="UTF-8" />
        <!-- 后缀 -->
        <constant name="struts.action.extension" value="action" />
    
        <!-- 结果资源的路径 -->
        <constant name="struts.convention.result.path" value="/WEB-INF/template/" />
        <!-- URL资源分隔符 -->
        <constant name="struts.convention.action.name.separator" value="_" />
        
        <package name="basePackage" extends="struts-default">
            <interceptors>
                <interceptor-stack name="baseStack">
                    <interceptor-ref name="exception" />
                    <interceptor-ref name="alias" />
                    <interceptor-ref name="servletConfig" />
                    <interceptor-ref name="i18n" />
                    <interceptor-ref name="prepare" />
                    <interceptor-ref name="chain" />
                    <interceptor-ref name="debugging" />
                    <interceptor-ref name="scopedModelDriven" />
                    <interceptor-ref name="modelDriven" />
                    <interceptor-ref name="fileUpload" />
                    <interceptor-ref name="checkbox" />
                    <interceptor-ref name="multiselect" />
                    <interceptor-ref name="staticParams" />
                    <interceptor-ref name="actionMappingParams" />
                    <interceptor-ref name="params">
                        <param name="excludeParams">dojo..*,^struts..*</param>
                    </interceptor-ref>
                    <interceptor-ref name="conversionError"/>
                    <!-- 配置方法级别的校验 -->
                    <interceptor-ref name="validation">
                        <param name="excludeMethods">input,back,cancel,browse</param>
                        <param name="validateAnnotatedMethodOnly">true</param>
                    </interceptor-ref>
                    <interceptor-ref name="workflow">
                        <param name="excludeMethods">input,back,cancel,browse</param>
                    </interceptor-ref>
                </interceptor-stack>
            </interceptors>
    
            <!-- 配置默认拦截器栈 -->
            <default-interceptor-ref name="baseStack" />
    
            <!-- 未到找Action指向页面 -->
            <default-action-ref name="errorPage" />
    
            <action name="errorPage">
                <result type="redirect">/html/error_page_404.html</result>
            </action>
    
        </package>
    
    
    
        <package name="shop" extends="basePackage" namespace="/shop/">
    
            <global-results>
                <result name="error" type="freemarker">/WEB-INF/template/shop/error.ftl</result>
            </global-results>
    
        </package>
        
    </struts>
    
    
    action的代码 
    我在Myeclipse新建的web项目中建立action.shop.HelloAction 
    Java代码  
    public class HelloAction  extends ActionSupport {   
        public String execute() {    
            return "test";    
        }    
    public String mysql() {   
            return "test";    
        }   
    }  
    
    public class HelloAction  extends ActionSupport {
        public String execute() { 
            return "test"; 
        } 
    public String mysql() {
            return "test"; 
        }
    }
    
    
    然后你在WEB-INF/template新建文件夹shop(这里新建的文件夹名字要和你建立的Action对应的存放文件夹名字符合) 
    然后建立文件一个jsp或者tld或者jsf文件名字为hello_test使用http://localhost:8080/web/shop/hello.action时将会直接跳到该页面进行显示 
    加了方法的名的话访问就使用http://localhost:8080/web/shop/hello!mysql.action 
    
    下面详细解析下struts.xml中Convention配置 
    1.1. 设置结果页面路径 
    默认所有的结果页面都存储在WEB-INF/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。如: 
    
    Xml代码  
    <constant name="struts.convention.result.path" value="="/WEB-INF/template/" />  
    
    <constant name="struts.convention.result.path" value="="/WEB-INF/template/" />
    
    这样你在就必须将你需要跳转的页面放在template下面 
    struts2支持.jsp .html .htm .vm格式的文件。 
    
    下面是actiong和结果模版的映射关系: 
    
    
    URL  Result  File that could match  Result Type 
    /hello  success /WEB-INF/content/hello.jsp Dispatcher 
    /hello  success /WEB-INF/content/hello-success.htm Dispatcher 
    /hello  success /WEB-INF/content/hello.ftl FreeMarker 
    /hello  input /WEB-INF/content/hello-world-input.vm Velocity 
    /hello  error /WEB-INF/content/test/test2/hello-error.html Dispatcher 
    
    
    
    以上的内容来自struts2的文档 
    [url]http://struts.apache.org/2.1.6/docs/convention-plugin.html [/url] 
    
    当然,简单的通过默认的方式来进行配置不能完全满足实际项目的需要。所幸,convention的零配置是非常灵活的。 
    
    1.2. 设置Convention搜索包 
    默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。如: 
    
    Xml代码  
    <constant name="struts.convention.package.locators" value="web,action" />   
    
    <constant name="struts.convention.package.locators" value="web,action" /> 
    
    
    则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。 
    
    Com.ustb.web.*/com.ustb.action.*都将被视为含有Action的包路径而被搜索。 
    
    接着,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类: 
    
    com.example.actions.MainAction 
    
    com.example.actions.products.Display (implements com.opensymphony.xwork2.Action) 
    
    com.example.struts.company.details.ShowCompanyDetailsAction 
    
    1.3. 命名空间 
    命名空间。从定义的.package.locators标示开始到包结束的部分,就是命名空间。举个例子: 
    
    xxx.xxx.action.shop.helloAction的命名空间是:”/shop”。 
    
    xxx.xxx.action.shop.detail.UserAction的命名空间是:”/shop/detail” 
    
    
    
    
    1.4. Actin类名路径分割 
    Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。然后将将每个分部的首字母转为小写,用’-’分割,你可以设置struts.convention.action.name.separator 如 
    
    Xml代码  
    <contant name="struts.convention.action.name.separator" value="_" />  
  • 相关阅读:
    启动ABP项目异常 :could not instantiate Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider
    日志体系
    高并发架构
    分布式接口幂等性、分布式限流:Guava 、nginx和lua限流
    MQ实现分布式事物处理说明比较
    循环依赖
    Redis 6 中的多线程
    BigDecimal
    paper
    什么是自旋锁
  • 原文地址:https://www.cnblogs.com/shaoshao/p/3633043.html
Copyright © 2020-2023  润新知