`
CshBBrain
  • 浏览: 650060 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:144900
Group-logo
HTML5移动开发
浏览量:137843
社区版块
存档分类
最新评论

Struts2零配置的实现

阅读更多

                             Struts2零配置的实现
  作者:Jason S.H.Chen
  对于做J2EE应用系统的朋友来说,没有不知道struts的。对于struts相关的资料我就不再啰嗦。Google一把,一大堆资料。
用过struts的朋友都知道struts的配置文件;struts1需要配置文件,struts2也需要配置文件。对于使用struts的系统来说配置文件相当于就相当于一个人的灵魂。Struts 控制器通过读取struts配置文件的信息,完成将用户的请求转换为调用对应的处理类的处理方法,并完成页面导航的工作。
下面看看struts的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans> <!—formbean的配置  -- >
    <form-bean name="UserForm"  type="com.amigo.struts.form.user.UserForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
<action  <!—action的配置  -- >
                path="/userAction"   type="com.amigo.struts.action.UserAction"
                name="UserForm" scope="request"  validate = "false"  parameter="method" >
             <forward name="error" path="/user/error.jsp" />
                  <forward name="success" path="/user/success.jsp"/>
                   <forward name="add" path="/user/addUser.jsp"/>
                   <forward name="update" path="/user/updateUser.jsp"/>
                   <forward name="list" path="/user/userList.jsp"/>
</action>
</action-mappings>
<message-resources parameter="com.amigo.struts. ApplicationResources " />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false" />
</plug-in>
</struts-config>

上面一段内容是struts1配置文件的样例;红色标示的formbean和action配置,则每个功能都有对应的这些内容。

下面我们在看看struts2配置文件的样例:
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

    <include file="struts-default.xml"></include>
   

    <package name="com.kay.struts2" extends="struts-default" namespace="/test">
        <interceptors>
            <interceptor name="timer" class="com.kay.timer"></interceptor>
            <interceptor name="logger" class="com.kay.logger"></interceptor>
            <!-- 定义拦截器栈 -->
            <interceptor-stack name="mystack">
                <interceptor-ref name="timer"></interceptor-ref>
                <interceptor-ref name="logger"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
       
        <default-interceptor-ref name="mystack"></default-interceptor-ref>
        <!-- 全局results配置 -->
        <global-results>
            <result name="input">/error.jsp</result>
        </global-results>
       

        <action name="hello" class="com.kay.struts2.Action.LoginAction">
            <interceptor-ref name="timer"></interceptor-ref>       
         <result name="success" type="dispatcher">/talk.jsp</result>

         <param name="url">http://www.sina.com</param>
        </action>

    </package>
</struts>
红色标注的action配置,对于每个action都有对应的配置。对于大型应用系统而言,struts的配置文件的内容将非常臃肿,感觉就是被淹没在了配置文件中。配置内容太多,不好维护是其一缺点,而根据struts的导航机制来看,配置内容太多对其性能也应该是有影响的(配置文件的内容在系统启动时加载到映射表中,struts在导航的时候到映射表中查找;内容越多,其性能肯定也好不了)。
好,说了这么多。那咱们来谈谈到底怎样来实现struts2的零配置方案呢。
1. 添加自己的struts.properties文件,在文件中添加如下内容:
struts.action.extension = action :表示请求添加action后缀,此项不是必须项

struts.enable.SlashesInActionNames = true : 允许在Action名中使用斜线

2. 封装一个基类,系统所有action都继承于这个基类;根据笔者多年做架构的经验,你还可以将更多通用处理的东西封装在基类中,以减少具体类的重复代码。基类可如下:
public class MyAction extends ActionSupport implements ApplicationContextAware{   
protected final static String JSPPAGE = "jsppage";
protected String target;
/**
*
* <li>方法名:renderJSPPage
* <li>@param _target 系统返回的JSP文件名。
* <li>@return 导航到jsp页面,返回JSPPAGE
* <li>返回类型:String
* <li>说明:参数为要返回的JSP页面名,系统自动导航到指定的页面。
* <li>创建人:Jason S.H.Chen
* <li>创建日期:2008-10-14
* <li>修改人:
* <li>修改日期:
*/
    public String renderJSPPage(String _target){  
        setTarget(_target);  
        return JSPPAGE;  
    }
   
    /**
     *
     * <li>方法名:getTarget
     * <li>@return 返回要导航到的页面。
     * <li>返回类型:String
     * <li>说明:这个函数一般不会手工调用到,框架中在配置文件中获取要导航
     * <li>到的文件名时,自动调用这个方法。
     * <li>创建人:Jason S.H.Chen
     * <li>创建日期:2008-10-14
     * <li>修改人:
     * <li>修改日期:
     */
    public String getTarget() {  
        return target;  
    }
    /**
     *
     * <li>方法名:setTarget
     * <li>@param target 需要导航到的页面名称。
     * <li>返回类型:void
     * <li>说明:程序要明确导航到某个页面,必须在代码中调用此函数进行设置要导航到的页面名称。
     * <li>创建人:Jason S.H.Chen
     * <li>创建日期:2008-10-14
     * <li>修改人:
     * <li>修改日期:
     */
    public void setTarget(String target) {  
        this.target = target;  
    }
}

所有继承于此类的子类,在他们的处理方法中调用renderJSPPage这个函数即实现了导航到指定的页面。
3. 配置文件的设置,说到这里有朋友可能要问了,你不是说零配置吗,为什么还提配置文件。我说的零配置不等于没有配置文件,我们这里对配置文件当中的内容设置一次,系统后面添加的action都不需要在配置文件中写配置了。
<?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>
<package name="struts2" extends="struts-default">
   
    <interceptors>
   
      <interceptor-stack name="myStack"> <!--- 我自定义了我的拦截器堆栈,你也可以使用他本身默认的-- >
    <interceptor-ref name="alias"/>

    <interceptor-ref name="servlet-config"/>

    <interceptor-ref name="prepare"/>

    <interceptor-ref name="i18n"/>

    <interceptor-ref name="chain"/>

    <interceptor-ref name="debugging"/>

    <interceptor-ref name="profiling"/>

    <interceptor-ref name="scoped-model-driven"/>

    <interceptor-ref name="model-driven"/>

    <interceptor-ref name="fileUpload"/>

    <interceptor-ref name="checkbox"/>

    <interceptor-ref name="static-params"/>

    <interceptor-ref name="params">

      <param name="excludeParams">dojo\..*</param>

    </interceptor-ref>

    <interceptor-ref name="conversionError"/>
   
    <interceptor-ref name="exceptionInterceptor"/>
    <interceptor-ref name="accessInterceptor"/>   
      </interceptor-stack>     
     
    </interceptors>
    <default-interceptor-ref name="myStack"/>   

<global-results> 
<result name="jsppage">${target}</result>

<result name="login">/index.jsp</result>
</global-results>
    </package>
   
    <constant name="struts.configuration.classpath.defaultParentPackage" value="struts2" />
</struts>
配置内容的关键:
<result name="jsppage">${target}</result> ,此处的name值必须为 jsppage,和我们封装基类的renderJSPPage函数中的返回值相同。${target} 的值为 renderJSPPage 方法中设置进来的jsp路径。
4. 将系统中的action的包路径设置在struts过滤器中
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param> 
    <param-name>actionPackages</param-name> 
    <param-value>
    com.company.systemname1.action,
    com.company.systemname2.action

    </param-value> 
   </init-param> 
</filter>
 
其中 actionPackages 参数中的值为系统所有action的包路径。系统启动时,struts会去扫描这些包下面的所有action.
写到这里基本上算是大功告成,你可以试试看。笔者在此有个建议,系统的基类其实还可以进一步封装,将到新增页面,编辑页面,查看页面和查询页面的方法进行抽象,进行默认导航。导航的规则和你系统开发时所定的命名规则以及文件的存放规则有关系,我想任何一个系统的开发都会对这些进行约束。那我们为什么不将这些命名规范写到基类里面,到达对程序员进行编码时进行约束呢,基类提供的这种规则审查,如果你用了,你将发现你可以节省很多代码审查的工作量量量。

参考资料:
struts2 配置的XML 详解:
http://blog.csdn.net/li285913050/archive/2008/04/02/2243321.aspx
struts2属性配置文件详解:
http://blog.csdn.net/xuchaofu/archive/2009/06/22/4287680.aspx

 

分享到:
评论

相关推荐

    Struts2零配置

    Struts2零配置是Struts2框架的一种简化配置方式,旨在减少XML配置文件的使用,提高开发效率。在传统的Struts2应用中,开发者需要在多个XML文件中配置Action、结果页面、拦截器等,而“零配置”则是对这种繁琐配置的...

    struts2 零配置

    接下来,我们将深入探讨Struts2的零配置实现方式: **1. 使用注解配置Action** 在Action类中,我们可以使用`@Action`注解来指定Action的名称和执行方法。例如: ```java @Action(value = "helloWorld") public ...

    Struts2零配置+FreeMarker用户管理系统(UMS)

    这个名为"Struts2零配置+FreeMarker用户管理系统(UMS)"的项目,旨在通过注解的方式展示如何在不编写XML配置文件的情况下,利用Struts2和FreeMarker创建一个用户管理系统。 首先,我们来了解一下Struts2框架。Struts...

    简述STRUTS2_Convention零配置

    STRUTS2 Convention 零配置是Struts2框架中的一种高级特性,旨在简化应用程序的配置,让开发者能够更快地构建MVC应用。从Struts2.1版本开始,推荐使用Convention插件替代Codebehind插件,因为它更加自动化,几乎无需...

    struts2零配置

    "Struts2零配置"是Struts2框架中的一个重要特性,旨在提高开发效率,减少繁琐的XML配置工作。这个特性允许开发者在不编写大量XML配置文件的情况下,依然能实现应用的正常运行。 在传统的Struts2应用中,开发者需要...

    Struts2配置精要之常量constant配置详解(包括零配置Convention 的常量)

    了解了常量配置后,我们来看看`Struts2零配置实现.docx`文档可能包含的内容。这份文档可能详细解释了如何利用Convention实现Struts2应用,包括如何避免编写大量的XML配置,以及如何通过常量调整Convention的行为。它...

    “零配置”案例:注册登录系统

    2. **Struts2配置**:尽管名为"零配置",但实际应用中仍然需要一些基础配置,例如在struts.xml文件中配置Action类及其对应的URL路径,以及结果页面的跳转。 3. **Spring Bean管理**:Spring容器会自动扫描并管理...

    struts2零配置入门代码

    总的来说,“struts2零配置入门代码”是一个很好的起点,帮助开发者理解Struts2框架如何通过注解实现无XML配置的应用程序。这种方式不仅降低了学习曲线,还提高了开发效率,使得开发者能够更专注于业务逻辑的实现,...

    struts2采用convention-plugin实现零配置

    然而,随着版本的更新,Struts2引入了一个名为Convention Plugin的新特性,旨在简化配置过程,实现所谓的“零配置”开发。 **什么是Struts2 Convention Plugin?** Convention Plugin是Struts2的一个插件,它基于...

    STRUTS2:零配置插件CodeBehind

    ### STRUTS2:零配置插件CodeBehind详解 #### 一、概述 Struts2框架作为Java Web开发中的一款重要工具,在简化Web应用程序开发方面提供了丰富的功能与灵活性。随着框架的发展,Struts2社区不断推出新的插件和技术...

    struts2231零配置

    在Struts2的版本2.3.1中,引入了一种称为“零配置”的特性,它极大地简化了应用程序的配置过程,使得开发者可以更快地进行开发而无需编写大量的XML配置文件。 "Struts2231零配置"意味着开发者可以不再需要像以前...

    struts2.1.6零配置DEMO

    Struts2支持资源文件来实现国际化,即使在零配置下,我们仍然可以使用`@Text`注解来获取资源文件中的文本。 7. **错误和异常处理**: 可以通过`@ExceptionHandler`和`@ActionError`注解来处理Action中的异常和...

    struts2 零配置所需的包及示例

    下面我们将深入探讨Struts2的零配置实现及其所需的包和示例。 首先,Struts2的零配置主要依赖于以下核心包: 1. **struts2-core**:这是Struts2的核心库,包含了所有必要的组件,如Action、Result、Interceptor等...

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件,可以直接跑

    在Struts2中,注解的引入使得开发者可以摆脱繁琐的`struts.xml`配置文件,实现“零配置”运行。 首先,让我们了解什么是注解(Annotation)。注解是Java提供的一种元数据机制,允许在源代码中嵌入信息,这些信息...

    STRUTS2零配置.doc

    Struts2是一款流行的Java web开发框架,其零配置特性始于版本2.1,主要通过引入Convention插件实现。Convention插件旨在简化应用配置,避免过度依赖XML或注解,通过预定义的规则自动配置Action、结果视图以及Action...

    struts2零配置[总结].pdf

    LightURL插件是Struts2社区提供的一种实现零配置的方法,它吸收了其他优秀插件的优点,比如CodeBehind和SmartUrls,旨在创建更简洁、更易维护的URL映射。以下是LightURL插件的使用步骤: 1. **添加依赖**:将`...

    MyFramework - struts2 零配置:convention

    "MyFramework - Struts2 零配置:convention" 主题着重于介绍如何使用Struts2的Convention插件实现“零配置”开发,极大地简化了传统XML配置的繁琐过程。在传统的Struts2应用中,开发者需要为每个Action类和结果页面...

Global site tag (gtag.js) - Google Analytics