继承actionsupport的三大主要功能

一、实现Action接口

package com.opensymphony.xwork2;

public abstract interface Action
{
  public static final String SUCCESS = "success";
  public static final String NONE = "none";
  public static final String ERROR = "error";
  public static final String INPUT = "input";
  public static final String LOGIN = "login";

  public abstract String execute()
    throws Exception;
}

二、实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化Struts 2的Action开发。

在Validatable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。
为了让Struts 2增加输入数据校验的功能,改写程序中的LoginAction,增加重写validate方法。修改后的LoginAction类代码如下:

//Struts 2的Action类就是一个普通的Java类
public class LoginAction
{
//下面是Action内用于封装用户请求参数的两个属性
 private String username;
private String password;
//username属性对应的getter方法
 public String getUsername()
{
 return username;
 }
//username属性对应的setter方法
 public void setUsername(String username)
{
 this.username = username;
}
//password属性对应的getter方法
 public String getPassword()
{
 return password;
 }
//password属性对应的setter方法
 public void setPassword(String password)
{
 this.password = password;
 }
//处理用户请求的execute方法
public String execute() throws Exception
{
//当用户请求参数的username等于scott,密码请求参数为tiger时,返回success
字符串
//否则返回error的字符串
 if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
 return "success";
 }
else
{
 return "error";
 }
 }
//完成输入校验需要重写的validate方法
public void validate()
{
//如果用户名为空,或者用户名为空字符串
if (getUsername() == null || getUsername().trim().equals(""))
{
//添加表单校验错误
addFieldError("username", "user.required");
}
//当密码为空,或者密码为空字符串时,添加表单校验错误
if (getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password", "pass.required");
}
}
}   

上面的Action类重写了validate方法,该方法会在执行系统的execute方法之前执行,如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误,请求将被转发到input逻辑视图处。
为了在校验失败后,系统能将视图转入input处,必须在配置该Action时配置input属性。下面是修改后login Action的配置片段:

<!-- 定义login的Action -->
<action name="Login" class="lee.LoginAction">
<!-- 定义input的逻辑视图名,对应login.jsp页面 -->
<result name="input">/login.jsp</result>
<!-- 定义error的逻辑视图名,对应error.jsp页面 -->
 <result name=" success ">/error.jsp</result>
<!-- 定义welcome的逻辑视图名,对应welcome.jsp页面 -->
 <result name="success">/welcome.jsp</result>        
</action>  

对比上面的Action配置与前面的Action配置,我们发现该Action配置片段中增加了input逻辑视图的配置,该逻辑视图映射到login.jsp页面。
前面已经提到:当用户提交请求时,请求得到execute方法处理之前,先会被validate方法处理,如果该方法处理结束后,Action的fieldErrors里的校验错误不为空,请求将被转发给input逻辑视图。如果我们不输入用户名、密码而直接提交表单,将看到如图2.13所示的界面。

图2.13  输入校验的界面

看到这里也许读者觉得非常神奇:我们仅仅在Action添加了数据校验错误,并未在输入页面输出这些校验错误信息,但图2.13所示的页面,却可以看到页面已经输出了这些校验信息——这是因为Struts 2的标签,上面的JSP页面中表单使用的并不是HTML表单,而是用了<s:form .../>标签,Struts 2的<s:form ... />标签已经具备了输出校验错误的能力。
提示  Struts 2的<s:form .../>默认已经提供了输出校验错误的能力。


三、通过getText()实现国际化

1、资源文件介绍

 

国际化资源文件都是通过Xxx_language_Country.properties 形式;

比如: message_zh_CN.properties、message_en_US.properties;

如果浏览器支持中文,则会加载第一个资源文件;

注意:在资源文件中不支持中文,因此需要通过JDK\bin中的native2ascii.exe进行转换;

在资源文件中内容是以key=value的形式存放的,比如name=xiazdong;

 

2、Struts2国际化

 

 

在Struts2中,在JSP页面和Action类中都可以使用国际化;

国际化文件分为:

1.全局国际化资源文件:对于所有Action、JSP都有效,放在WEB-INF\classes下;

2.包范围国际化资源文件:对于在此包中的Action都有效,放在包路径下;

3.Action范围国际化资源文件:对于特定的Action有效,放在Action类的同目录下;

4.临时指定国际化资源文件:需要特定语法进行指定才有效,放在WEB-INF\classes下; 

2.1.全局国际化资源文件

此文件适用于Action和JSP;

如果需要使用全局资源文件,则需要在struts.xml中添加常量:

<constant name="struts.custom.i18n.resources" value="basename" />

basename是指资源文件的基础名,比如message_zh_CN.properties的basename是message;

message_zh_CN.properties

  1. title=\u9875\u9762\u6807\u9898  
  2. body=\u9875\u9762\u5934  
  3. button=\u70b9\u51fb  
  4. name=\u590f\u6b63\u51ac  

message_en_US.properties

  1. title=Page title  
  2. body=Page body  
  3. button=click  
  4. name=xiazdong  

2.1在JSP中使用国际化

2.1.1一般文本国际化

通过<s:text name="title"/> 可以根据浏览器支持的语言取出全局国际化文件的key为title对应的value;

2.1.2表单控件的国际化

对于表单中的控件,比如按钮中的文字、textfield前的描述文字,通过指定key属性进行国际化;

比如<s:textfield key="username"/> 可以在文本域前面的描述中填入username对应的value;

示例代码:

  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    <%@taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  8. <title><s:text name="title"/></title>  
  9. </head>  
  10. <body>  
  11.     <s:text name="body"/>  
  12.     <s:form action="aaaa">  
  13.         <s:textfield name="name" key="name"></s:textfield>  
  14.     </s:form>  
  15. </body>  
  16. </html>  

由于本人的浏览器默认为中文,因此显示的是中文的资源文件;

2.2在Action中使用国际化

在Action中可以使用 getText(String key);这个函数返回国际化文件中key对应的value;

示例代码:

  1. package org.locale.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class Demo01Action extends ActionSupport{  
  6.     public String execute()throws Exception{  
  7.         System.out.println(getText("title"));  
  8.         System.out.println(getText("body"));  
  9.         System.out.println(getText("button"));  
  10.         return SUCCESS;  
  11.     }  
  12. }  


2.3 占位符

 

 

在资源文件中可以使用占位符,占位符是指在资源文件中留出一个位置,在使用时动态插入一个任意值;比如在登陆界面时,如果登陆的用户名是xiazdong,则欢迎界面就会出现xiazdong,欢迎你! 在资源文件中通过 {0},欢迎你!!! 实现;

message_zh_CN.properties

  1. title=\u9875\u9762\u6807\u9898  
  2. body={0}\u9875\u9762\u5934{1}  
  3. button=\u70b9\u51fb  
  4. name=\u590f\u6b63\u51ac  
 
2.3.1在JSP中填充占位符

 

在JSP中通过在<s:text>中添加<s:param>进行填充;

  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    <%@taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  8. <title><s:text name="title"/></title>  
  9. </head>  
  10. <body>  
  11.     <s:text name="body">  
  12.         <s:param>xiazdong</s:param>  
  13.         <s:param>xiazdong</s:param>  
  14.     </s:text>  
  15. </body>  
  16. </html>  

 
2.3.2在Action中填充占位符

 

在Action中通过 getText(String key, String[] params); 第二个参数进行填充;

  1. package org.locale.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class Demo02Action extends ActionSupport{  
  6.     public String execute()throws Exception{  
  7.         System.out.println(getText("body",new String[]{"xiazdong","xiazdong"}));  
  8.         return SUCCESS;  
  9.     }  
  10. }  


3.包范围资源文件

 

如果一个工程全部的资源文件都在全局国际化资源文件中配置,会很凌乱,因此我们需要进行模块化,包范围的资源文件是在包下平进行配置,对于包中所有Action都有效;

包范围的资源文件只对Action有效,而JSP不能突显;

包范围的资源文件的名称形式为: package_language_country.properties, 注意 package是常量,比如 package_zh_CN.properties, package_en_US.properties;

如果在包下放置 包范围资源文件,并且配置全局资源文件,在Action类代码不变的情况下,则Action类优先加载包范围的资源文件;

比如目录结构如图所示:

则在 org.locale.action包下的Action都优先加载package_****.properties;

 

4.Action范围资源文件

 

 

Action范围的资源文件是针对某个特定的Action的,

Action范围的资源文件的形式: ActionName_language_country.properties; 比如 LoginAction类的资源文件为:LoginAction_zh_CN.properties;

Action范围的资源文件优先级比包范围的资源文件优先级高。

比如目录结构如图所示:

则Demo04Action优先加载Demo04Action_****.properties;

 

 

5.利用标签指定资源文件

 

 

此种方式针对JSP加载指定的资源文件,即可以加载任意范围的资源文件;

<s:i18n>是指定资源文件的标签;

在<s:text>等加载资源文件的外面加上<s:i18n name="filename">标签; filename指定加载的资源文件的名称;

比如:

  1. <s:i18n name="message">  
  2. <s:text name="body"/>  
  3.   
  4. <s:form action="aaaa">  
  5.     <s:textfield name="name" key="name"></s:textfield>  
  6. </s:form>  
  7. </s:i18n>  


就可以加载message_**_**.properties 全局资源文件;

目录结构如下:

接下去将分别在JSP中加载全局范围、包范围、Action范围的资源文件;

5.1 加载全局范围的资源文件

  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    <%@taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  8. <title><s:text name="title"/></title>  
  9. </head>  
  10. <body>  
  11.     <s:i18n name="message">  
  12.     <s:text name="body"/>  
  13.       
  14.     <s:form action="aaaa">  
  15.         <s:textfield name="name" key="name"></s:textfield>  
  16.     </s:form>  
  17.     </s:i18n>  
  18. </body>  
  19. </html>  


5.2 加载包范围的资源文件

加载包范围的资源文件是,<s:i18n>的name属性的值为 包1/包2/package的形式,比如上图包层次为 org.locale.action,则为 org/locale/action/package ;

  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    <%@taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  8. <title><s:text name="title"/></title>  
  9. </head>  
  10. <body>  
  11.     <s:i18n name="org/locale/action/package">  
  12.     <s:text name="body"/>  
  13.       
  14.     <s:form action="aaaa">  
  15.         <s:textfield name="name" key="name"></s:textfield>  
  16.     </s:form>  
  17.     </s:i18n>  
  18. </body>  
  19. </html>  


5.3加载action范围的资源文件

加载Action范围的资源文件时,<s:i18n>的name属性值的形式为: 包层次/ActionName,比如 org/locale/action/Demo04Action 则加载Demo04Action的资源文件;

  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    <%@taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  8. <title><s:text name="title"/></title>  
  9. </head>  
  10. <body>  
  11.     <s:i18n name="org/locale/action/Demo04Action">  
  12.     <s:text name="body"/>  
  13.       
  14.     <s:form action="aaaa">  
  15.         <s:textfield name="name" key="name"></s:textfield>  
  16.     </s:form>  
  17.     </s:i18n>  
  18. </body>  
  19. </html>  




  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值