首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Struts2、Spring、Hibernate 高效开发的最佳实践(2)

Struts2、Spring、Hibernate 高效开发的最佳实践(2)

Struts2 的不动配置该框架中,我们建议只定义少量的类继承于 ActionSupport,这样可以使得 struts.xml 的配置尽量减少,甚至只进行少量配置,而不用随着业务的增加而修改配置。清单 1 是笔者为一个教师考勤系统定义的 Action 配置。
清单 1. Struts2 的配置清单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<action name="*" method="{1}" class="Main">
    <interceptor-ref name="fileUpload">
        <param name="maximumSize">4073741824</param>
    </interceptor-ref>
    <interceptor-ref name="myInterceptorStack"></interceptor-ref>
    <result name="input">/noDir/error.jsp</result>
    <result type="json" name="success"></result>
    <result name="errorJson" type="json"></result>
    <result type="json" name="error"></result>
    <result type="stream" name="stream">
        <param name="contentType">${contentType}</param>
        <param name="contentDisposition">fileName="${inputFileName}"</param>
        <param name="inputName">inputStream</param>  
    </result>
    <result name="dynamic">/${url}</result>
    <result name="otherAction" type="redirectAction">/${url}</result>
    <result name="red" type="redirect">/${url}</result>
</action>




清单 1 定义了很多规则。首先,该配置使用了动态方法调用技术,这可以使得许多的 Action 方法可以声明到一个类里,不用重复定义 Action 类,同时对业务的增加和删除可以简约到对 Action 类里方法增加和删除,增加的 Action 方法不需进行其他配置,如果业务被删除,则只需要将方法注释或者删除,非常方便。第二,配置的 package 继承于 json-default,也就是说这个包里的 action 是支持 Ajax 调用的,默认的,如果返回 ERROR、SUCCESS,则会将 Action 序列化为 JSON 返回到客户端。我们定义了各种的跳转类型,包括重定向到页面(具体的页面由 Action 里的 url 指定)、重定向到 Action、重定向到错误页面、流类型的返回等等,这为我们动态的选择返回结果数据提供了方便。那么使用上述的配置,对我们开发有什么好处呢?假设有一个新的业务,我们只需要在 Action 添加新的方法,如清单 2 所示。
清单 2. 添加新业务方法
1
2
3
4
5
6
7
8
9
10
11
12
public String business() throws Exception
    {
        …business process…

        if (has error)
        {
            addFieldError(“error message”) return INPUT;
        } else {
            //url是action中定义的一个String变量,指定跳转地址
            url = “business.jsp”; return “dynamic”;
        }
    }




调用这个新的业务方法,只需要调用这个链接:http://{host}:{port}/{webapp}/business.action。正如我们看到的,定义了新的业务逻辑方法,我们没有修改或添加任何配置,因为我们的配置是完整的,考虑到了各种跳转、错误情况,同时动态方法调用特性,让我们可以动态的指定业务方法。如果我们对清单 2 中的跳转代码进行抽取,清单 2 会更加简单。如清单 3 所示。
清单 3. 抽取基础方法后的业务方法
1
2
3
4
5
6
7
8
9
10
11
public String business() throws Exception
{
        …business process…

        if (has error)
        {
            return redirectToErrorPage("error message")
        } else {
            return redirectToPage("business.jsp");
        }
}




上面的清单中,我们抽取了 redirectToErrorPage 和 redirectToPage 方法,这样就可以使得其他的业务方法可以重用这些跳转方法,整个业务过程变得清晰易懂。类似的我们还可以抽取出 redirectToAction(跳转到另一个业务方法)、redirectStream(流类型的跳转)、redirectToAnotherPage(用于重定向的跳转)、redirectToJson(Ajax 的跳转)等等。这样这些公共方法就可以让其他的开发人员一起使用。程序员可以从跳转、错误提示、重复配置 Action 的痛苦中解救出来,专注于编写业务逻辑。
返回列表