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

基于 Struts 2 开发 Web 应用 -3

基于 Struts 2 开发 Web 应用 -3

开发页面在开发 Struts 2 应用时,不可避免会使用大量的 Struts 2 标签,默认 Struts 2 解释这些标签生成 HTML 代码时会加上一些额外的代码,例如可能把 <tr><td> 自动加上,如果我们选择自己灵活控制代码格式,可以参考本示例在 struts.properties 里设置 struts.ui.theme=simple, struts.properties 同样位于类根路径下:
图 9.Struts 标签及配置文件下面我们通过 user.jsp 来展示 Struts 2 框架是如何关联 Jsp, Action 以及表单字段的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ taglib prefix="s2" uri="/struts-tags"%>
........
<s2:form action="submitUser" name="submitUser" namespace="/admin">
         
        <table>
            <tr>
                <td><s2:text name="User.Name"/></td>
                <td><s2:textfield name="user.userName"/></td>
            </tr>
            <tr>
                <td><s2:text name="User.Password"/></td>
                <td><s2:password name="user.password"/></td>
            </tr>
            <tr>
                <td><s2:text name="User.Email"/></td>
                <td><s2:textfield name="user.email"/></td>
            </tr>
            ……………
        </table>
</s2:form>




S2:form 标签的 action 属性指定了 form 要提交到的 action, 该 action 名已经在 struts-user.xml 中定义。Namespace 属性和 struts-user.xml 中保持了一致,根据 struts-user.xml 的配置信息,该 form 就会被提交到 UserAction 的 submitUser 方法,但是表单各个字段值是如何被 Action 识别的呢?这是由代表 HTML 各种控件的 Struts 2 标签 name 属性指定的,例如 <s2:textfield name="user.userName"/> 就将该字段的值直接映射到 UserAction 的 user 实例变量的 userName 属性,注意,这里要求 user 对象对应的 User 类必须有一个空的构造函数,另外这里的 user 应该是一个标准的 JavaBean, 所有属性应该有 get,set 方法。
我们看一下表单提交后,action 是如何处理的:
1
2
3
4
public String submitUser() {
    userService.addUser(user);
    return "userList";
}




在调用该方法前,Struts 2 框架已经将所有表单参数自动组装到 user 对象中,所以该方法可以直接访问 user 对象,并对其做相应处理 , 该示例中的 userService 是负责 user 对象的增,删,改操作。
添加完 user 对象,该 action 返回了一个字符串”userList”, 该字符串是 struts-user.xml 中 submitUser action 设置的一个返回结果,该返回结果其实是调用另一个 action 来显示现有 user 列表。
表单校验Struts 2 提供了很多种校验方式,一种是配置方式,可以用来校验基本数据信息,另一种是编程校验,可以用来校验较为复杂的业务逻辑。
如果是通过配置来校验,需要在 Action 类的同目录下建一个 xml 文件,命名规则是 action 类名 -action 别名 -validation.xml。例如,本示例中:UserAction-submitUser-validation.xml, 当 submitUser action 被调用的时候,会先通过该 xml 配置进行校验。下面代码片段是本示例中配置的校验参数,它指定了对哪些表单字段做哪些校验:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<validators>
    <field name="user.userName">
        <field-validator type="requiredstring">
            <param name="trim">true</param>         
            <message key="User.UserName.Required"/>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">1</param>
            <param name="maxLength">20</param>
            <message key="User.UserName.Length"></message>
       </field-validator>
    </field>
     
    <field name="user.email">
      <field-validator type="requiredstring">
          <message key="User.Email.Required"></message>
      </field-validator>
      <field-validator type="email">
          <message key="User.Email.Format"></message>
      </field-validator>
    </field>  
     
</validators>




Struts 2 定义了一些默认类型,例如 ,email, 可以校验 email 格式,在上例中 user.email 指定了校验表单的 email 字段,type=”requiredstring”表明该字段是必须的,type=”email”表明要检验 email 格式。所有的错误信息可以通过 key 来国际化。
另一种是通过编程校验,在 UserAction 中有一个方法:
1
2
3
4
5
6
public void validateSubmitUser(){
    if (user.getPassword().length() < 6){
        this.addFieldError("user.password", getText("User.Password.Length"));
    }
         
}




注意该方法的命名,validate+Action 方法名,也就是说该方法会在调用 submitUser Action 时自动被 Struts 2 框架调用。
国际化Struts 2 中提供了各种机制对日期格式,数字格式做相应的国际化。例如通过 Action 同目录下的 package.properties, 具体可以参照附件,示例代码。
对于普通文本的国际化,需要做以下步骤:
  • 设置国际化加载文件路径 struts.properties 中的 struts.custom.i18n.resources 设置了 struts 2 需要自动加载的国际化文件
  • 访问国际化资源 任何继承自 ActionSupport 的 Action 类都可以直接使用 getText 方法根据当前 locale 获取相应键的值
在 JSP 中可以使用 OGNL 表达式 %{getText('key')} 或者 <s2:text name="key"/> 来访问国际化资源。
最后,如果以上方式都不适用,可以使用 com.opensymphony.xwork2.util.LocalizedTextUtil 工具类来访问国际化资源。
3.5 异常处理一般来说,web 应用都会设置一些统一错误页面,用来显示那些未被 try catch 捕捉到的异常信息,该示例在 struts-user.xml 中加入了这样的配置信息:
1
2
3
4
5
6
7
<global-results>         
    <result name="Exception">/WEB-INF/page/error.jsp</result>           
</global-results>

<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="Exception"/>
</global-exception-mappings>




该配置表示在当前 package 下的所有 action, 一旦有 java.lang.Exception 抛出,并且没有被相应 action 捕获的话,系统将显示错误页面,error.jsp
另外,struts 2 也支持在某个 action 内部定义异常处理,例如:
1
2
3
4
5
6
<action name=”xxx” class=”xxx” method=”xxx”>
    …….
    <exception-mapping exception="java.lang.Exception" result="custom_error"/>
    <result name="custom_error">/WEB-INF/page/common/error.jsp</result>
    …….
</action>




在错误页面中可以通过 <s2:property value="%{exception.message}" /> 显示异常信息。
总结通过该示例开发,我们对 Struts 2 开发平台以及 Struts 2 框架有了一个基本认识,不过要熟练应用 Struts 2,还需要了解它的各类标签,OGNL 表达式。另外 Struts 2 还提供了一些高级特性,如 Interceptor 机制,IOC 机制。充分利用这些新特性会帮助我们更快,更方便地实现一些 Web 应用。
返回列表