Struts2框架中需要再动作类中使用execute返回字符串的方式与在struts.xml文件中注册的结果组件的name相对应的方式来进行页面的跳转。
execute中的返回字符串:
1. 返回字符串中的值必须与配置在声明性架构中期望的结果的名字匹配return "SUCCESS"
相应的:
<result name="SUCCESS">/helloworld.jsp</result>
2. struts2动作不必实现Action接口,任何对象都可以通过实现一个返回控制字符串的execute()方法来非正式地实现动作与框架之间的契约。
3.但是框架本身提供了Action接口,及其一个实现类,为什么要使用呢?先来看一下Action接口:(详见strtus2 api)
Action接口:
只有一个方法: execute()
和一些有用的String常量
e.g
<action name="Name">
<result>/NameCollector.jsp</result>
</action>
这里没有指定动作类,因为没有内容要处理。Struts2智能默认值会提供继承的默认动作实现。这个默认的动作有一个空的execute()方法,并自动返回Action接口的SUCCESS常量作为控制字符串,其他什么也不做。
注意,通常不直接实现Action接口,因为有了一个可以借用的实现——ActionSupport类
ActionSupport类
它实现了Action接口,并提供了诸如数据验证,错误消息本地化等功能。
1.基本验证
前提:包要扩展struts-default包,以继承默认拦截器栈
动作只要提供validate()方法,便可以检查JavaBean属性接收到的数据的合法性逻辑。若验证不通过,workflow拦截器会自动将其转到名字为“input”的结果页面。
ActionSupport实现了ValidationAware接口,从而提供了以下两个方法用来提供验证功能:
addFieldError(String fieldName, String errorMessage)
addActionError(String errorMessage)
通过这种方法,清楚的将验证逻辑和业务逻辑分离了。原因:workflow拦截器控制着验证逻辑的执行。
e.g
public class CheckDB extends ActionSupport{
execute(){
//business logic
return SUCCESS;
}
validate(){
//validate logic
}
}
struts.xml文件中的注册内容应有name为"input"的结果:
<action name="CheckDB" class="cn.myseu.action.CheckDB">
<result name="success">/dbresult.jsp</result>
<result name="input">/namequery.jsp</result>
</action>
2.使用资源包处理文本消息
addFieldError("name", "Name is required!");
传入字符串会给后期维护带来很大的不便,尤其是国际化。广为接受的事件是将这些消息集中放入外部可维护的资源包中,通常使用简单的属性文件实现。
ActionSupport实现了两个接口,它们写作提供了本地化消息文本的功能。
TextProvider 接口,提供了对这些消息的访问。
e.g unknown.properties
name.required=Username is required.
为了让实现TextProvider接口的ActionSupport能找到这个属性文件,我们只需要把它放在包含该动作类的相同java包中。并且文件名要与Action类同名。
属性文件就绪后,就可以使用TextProvider提供的某个getText()方法来取得我们的消息。
上面的代码可改为:
addFieldError("name", getText(name.required));
e.g
@Override
public void validate() {
if(getUsername().length()==0){
addFieldError("username", getText("username.required"));
}
if(getPassword().length()==0){
addFieldError("password", getText("password.required"));
}
}
这种分层使得消息文件更加可管理。改变消息意味着只编辑属性文件,源代码中有意义的关键字永远不需要改变。
LocaleProvider 接口,为本地化消息文本提供了一个基本的国际化解决方案
该接口只提供了一个方法 getLocale()
根据浏览器发送来的地域设置取得用户所在的地域。