分享

Struts2 继承ActionSupport的用处

 我是书迷705 2015-04-22

 Struts2 继承ActionSupport的用处

Action Actionsupport 的区别
    
当我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢?

Action
接口有:
public static final java.lang.String SUCCESS = "success";
public static final java.lang.String NONE = "none";
public static final java.lang.String ERROR = "error";
public static final java.lang.String INPUT = "input";
public static final java.lang.String LOGIN = "login";

public abstract java.lang.String execute() throws java.lang.Exception;

Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该方法,它会在execute()方法之前执行,如校验失败,会转入input处,必须在配置该Action时配置input属性。

另外,Actionsupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息.

这样在自定义标签时可以定义一个变量为new actionsupport对象实现国际化。 


    ActionSupport
类的作用
    struts2
不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
    Struts2
中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的gettersetter方法。

 

 

2.8  增加数据校验
在上面应用中,即使浏览者输入任何用户名、密码,系统也会处理用户请求。在我们整个HelloWorld应用中,这种空用户名、空密码的情况不会引起太大的问题。但如果数据需要保存到数据库,或者需要根据用户输入的用户名、密码查询数据,这些空输入可能引起异常。
为了避免用户的输入引起底层异常,通常我们会在进行业务逻辑操作之前,先执行基本的数据校验。
2.8.1  
继承ActionSupport
ActionSupport
类是一个工具类,它已经实现了Action接口。除此之外,它还实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化Struts 2Action开发。
Validatable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。
为了让Struts 2增加输入数据校验的功能,改写程序中的LoginAction,增加重写validate方法。修改后的LoginAction类代码如下:

//Struts 2Action类就是一个普通的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的配置片段:

<!-- 定义loginAction -->

<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方法处理,如果该方法处理结束后,ActionfieldErrors里的校验错误不为空,请求将被转发给input逻辑视图。如果我们不输入用户名、密码而直接提交表单,将看到如图2.13所示的界面。

说明: http://control.blog.sina.com.cn/files/uploadimg/20070824/170552748.jpg

2.13  输入校验的界面

看到这里也许读者觉得非常神奇:我们仅仅在Action添加了数据校验错误,并未在输入页面输出这些校验错误信息,但图2.13所示的页面,却可以看到页面已经输出了这些校验信息——这是因为Struts 2的标签,上面的JSP页面中表单使用的并不是HTML表单,而是用了<s:form .../>标签,Struts 2<s:form ... />标签已经具备了输出校验错误的能力。
提示  Struts 2<s:form .../>默认已经提供了输出校验错误的能力。
但上面的程序还存在一个问题:校验信息的国际化。查看上面的Action类代码发现:重写validate方法时,如果发生校验失败的问题,校验错误的提示信息是以硬编码方式写死了——这就失去了国际化的能力。
实际上,ActionSupport类已经提供了国际化信息的能力,它提供了一个getTextString key)方法,该方法用于从资源文件中获取国际化信息。为了让校验信息支持国际化,再次改写Action里的validate方法,改写后的validate方法代码如下:

//执行数据校验的validate方法

public void validate()

{

//如果用户名为空,或者为空字符串

if (getUsername() == null || getUsername().trim().equals(""))

{

//添加校验错误提示,使用getText方法来使提示信息国际化

addFieldError("username", getText("user.required"));

}

if (getPassword() == null || getPassword().trim().equals(""))

{

addFieldError("password", getText("pass.required"));

}

}

在上面的validate方法中,添加校验错误提示时,并不是直接给出了错误提示的字符串,而是调用了getText方法来获取错误提示。因为在Action中,使用getText方法来获取了两个国际化提示:user.requiredpass.required,因此应该在国际化资源文件中添加这两条提示信息。
提示  ActionSupport增加了让提示信息国际化的能力,ActionSupport提供的getText方法可以根据资源文件加载获得国际化提示信息。


 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多