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

深入 Struts 1.1(5)Action

深入 Struts 1.1(5)Action

Action我们通过继承 Action 类来实现具体的执行类。具体 Action 类的功能一般都在 execute(以前是 perform 方法)方法中完成,其中主要涉及到以下几个方面:      
  • 辅助 ActionForm 进行一些表单数据的检查。
  • 执行必要的业务逻辑,比如存取数据库,调用实体 bean 等。
  • 更新服务器端的 bean 数据,后续对象中可能会用到这些数据,比如在 JSP 中利用 bean:write 来获得这些数据。
  • 根据处理结果决定程序的去处,并以 ActionForward 对象的形式返回给 ActionServlet。
提示:由于在 Action 和 ActionForm 中都可以实现验证方法,那么如何来安排它们之间的分工呢?一般来说,我们秉着 MVC 分离的原则,也就是视图级的验证工作放在 ActionForm 来完成,比如输入不能为空,email 格式是否正确,利用 ValidatorForm 可以很轻松地完成这些工作。而与具体业务相关的验证则放入 Action 中,这样就可以获得最大 ActionForm 重用性的可能。      
前面我们提到过,我们主张将业务逻辑执行分离到单独的 JavaBean 中,而 Action 只负责错误处理和流程控制。而且考虑到重用性的原因,在执行业务逻辑的 JavaBean 中不要引用任何与 Web 应用相关的对象,比如 HttpServletRequest,HttpServletResponse 等对象,而应该将其转化为普通的 Java 对象。关于这一点,可以参考 Petstore 中 WAF 框架的实现思路。
此外,你可能还注意到 execute 与 perform 的一个区别:execute 方法简单地掷出 Exception 异常,而 perform 方法则掷出 ServletException 和 IOException 异常。这不是说 Struts 1.1 在异常处理功能方面弱化了,而是为了配合 Struts 1.1 中一个很好的功能 -- 宣称式异常处理机制。
宣称式异常处理和 EJB 中的宣称式事务处理概念类似,宣称式异常处理其实就是可配置的异常处理,你可以在配置文件中指定由谁来处理 Action 类中掷出的某种异常。你可以按照以下步骤来完成该功能:      
  • 实现 org.apache.struts.action.ExceptionHandler 的子类,覆盖 execute 方法,在该方法中处理异常并且返回一个 ActionForward 对象
  • 在配置文件中配置异常处理对象,你可以配置一个全局的处理类或者单独为每个 Action 配置处理类
下表就定义了一个全局的处理类 CustomizedExceptionHandler,它被用来处理所有的异常。
1
2
3
4
5
6
7
8
<global-exceptions>
<exception
    handler="com.yourcorp.CustomizedExceptionHandler"
    key="global.error.message"
    path="/error.jsp"
    scope="request"
    type="java.lang.Exception"/>
</global-exceptions>




其中具体的参数含义,可以参考 ExceptionHandler.java 源文件。
taglib讲完了模型和控制器,接下来我们要涉及的是视图。视图的角色主要是由 JSP 来完成,从 JSP 的规范中可以看出,在视图层可以"折腾"的技术不是很多,主要的就是自定义标记库的应用。Struts 1.1 在原有的四个标记库的基础上新增了两个标记库 --Tiles 和 Nested。
其中 Tiles 除了替代 Template 的基本模板功能外,还增加了布局定义、虚拟页面定义和动态页面生成等功能。Tiles 强大的模板功能能够使页面获得最大的重用性和灵活性,此外可以结合 Tiles 配置文件中的页面定义和 Action 的转发逻辑,即你可以将一个 Action 转发到一个在 Tiles 配置文件中定义的虚拟页面,从而减少页面的数量。比如,下表中的 Action 定义了一个转发路径,它的终点是 tile.userMain,而后者是你在 Tiles 配置文件中定义的一个页面。
1
2
3
4
5
6
7
8
9
10
11
12
<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings>
<!-- Action mapping for profile form -->
    <action path="/login"
        type="com.ncu.test.LoginAction"
        name="loginForm"
        scope="request"
        input="tile.userLogin"
        validate="true">
        <forward name="success" path="tile.userMain"/>
    </action>
</action-mappings>




Tiles 配置文件:tiles-defs.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config.dtd">
<tiles-definitions>
<!-- =======================================================  -->
<!-- Master definitions                                       -->
<!-- =======================================================  -->
<!-- Page layout used as root for all pages. -->
<definition name="rootLayout" path="/tiles-layouts/rootLayout.jsp">
    <put name="titleString" value="CHANGE-ME"/>
    <put name="topMenu" value="/tiles-components/topMenu.jsp"/>
    <put name="leftMenu" value="/tiles-components/panel1.jsp"/>
    <put name="body" value="CHANGE-ME"/>
    <put name="footer" value="/tiles-components/footer.jsp"/>
</definition>
<!-- =======================================================  -->
<!-- Page definitions                      -->
<!-- =======================================================  -->
<!-- User Login page -->
<definition name="tile.userLogin" extends="rootLayout">
    <put name="titleString" value="User Login"/>
    <put name="body" value="/src/userLogin.jsp"/>
</definition>
<!-- User Main page -->
<definition name="tile.userMain" extends="rootLayout">
    <put name="titleString" value="User Main"/>
    <put name="body" value="/src/userMain.jsp"/>
</definition>
</tiles-definitions>




而 Nested 标记库的作用是让以上这些基本标记库能够嵌套使用,发挥更大的作用。
返回列表