在Struts中,向jsp传递的信息有三种
- Action错误;
addActionError(aMessage);
- Action信息;
addActionMessage(aMessage);
字段错误 ;
字段错误常用于后台输入效验
this.addFieldError(fieldName, errorMessage);
参考后台输入效验
Action信息和Action错误,是用于信息传递,要用到session容器来防止信息.
store拦截器
用于将三种信息存入session.只存于一次响应.
需要配合workflow拦截器:检测是否有信息,并跳转到规定的页面.
workflow的@InputConfig注解:
- 标记在Action方法之上,表示调用该方法前,检测是否有Action错误和字段错误,若有,就跳转到规定的页面
- methodName,跳转到执行另外一个action
- resultName,跳转到另外一个逻辑视图
案例:
保存编辑的信息
- 编辑失败,跳转到编辑页面,并且弹窗编辑失败.
- 编辑成功,跳转到列表界面,并弹窗编辑成功.
ps:在在此情况下,编辑保存后,会重定向到显示list的Action.
1.Action类的部署
//保存编辑内容Action
public String save() {
try {
保存对象的代码片;
this.addActionMessage("编辑成功");
} catch (Exception e) {
this.addActionError("编辑失败"+e.getMessage());
e.printStackTrace();
}
return SUCCESS;
}
//显示列表的Action
@InputConfig(methodName="input")
public String execute() throws Exception {
显示列表的代码片;
return super.LIST;
}
2.拦截器的部署
- store拦截器,需要配置在workflow拦截器之前,
- 配置拦截器类的属性
<param name="operationMode">AUTOMATIC</param>
表示方法执行前,提取异常,方法执行后,保存异常
<interceptor-stack name="myStack">
<interceptor-ref name="自定义拦截器"/>
<interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack"/>
</interceptor-stack>
3.js代码的部署
将struts标签写入js代码中.
在ActionSupport类中,有两个方法 ;
- hasActionMessages();Action信息中是否有值
- hasActionErrors(); Action错误中是否有值
在列表界面中:
<script type="text/javascript">
<s:if test="hasActionMessages()">
var m='<s:property value="actionMessages[0]" />';
alert(m);
</s:if>
</script>
在编辑界面中
<script type="text/javascript">
<s:if test="hasActionErrors()">
var m='<s:property value="actionErrors[0]" />'
alert(m);
</s:if>
</script>
补充:在struts2的param拦截器中,如果请求过来的参数,在Action类中,找不到对应名称的字段,会将该信息存入ActionMessage中,造成ActionMessage很多信息.
可以通过重写Param拦截器,来改变.