Struts2系列笔记--输入校验

在校验之前,首先进行类型转换,如果类型转换失败,则直接报错
Action类中,复写validate()方法

public void validate() {
if (null == this.getUsername() || "".equals(this.getUsername().trim())) {
this.addFieldError("username", "username required");
}
if (null == this.getPassword() || "".equals(this.getPassword().trim())) {
this.addFieldError("password", "password required");
}
}

addFieldError()方法含义为,指定参数1控件的错误信息为参数2,错误信息会显示在参数1控件的上方剧中位置,但这个前提是使用struts标签。如果没有使用struts标签,则需要在页面内添加:<s:fieldError></s:fieldError>错误信息反馈在此标签的位置

配置struts.xml文件
需要为你的action配置一个input result,因为struts验证机制是:一旦验证没有通过,则自动定向到input结果
<action name="register" class="com.test.action.RegisterAction">
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>


[color=red]注意:input结果必须为dispatcher方式,
调用顺序为:setXxx();validate();execute()[/color]

1. 通过转换器将请求参数转换成相应的Bean属性;
2. 判断转换过程是否出现异常。如果有,则将其保存到ActionContext中,conversionError拦截器再封装为fieldError;如果没有,进行下一步;
3. 通过反射(Reflection)来调用validateXxx()方法(其中,Xxx表示Action的方法名);
4. 调用validate()方法;
5. 如果经过上述步骤没有出现fieldError,则调用Action方法;如果有,则会跳过Action方法,通过国际化将fieldError输出到页面。
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面

类型转换与输入校验的流程

1. 首先Struts2对客户端传来的数据进行类型转换

2. 类型转换完毕后再进行输入校验

3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)


注意:如果类型转换不成功,也同样要进行输入校验

类型转换出错,自动将错误信息添加到addFieldError中。

这样的机制反馈不够友好, 那么我们采用一种方式来替代struts2自动生成的错误信息:

[color=red]全局资源转化文件:[/color]
在struts.xml文件struts根标签内,加入:
<constant name=”struts.custom.i18n.resources” value=”message” > </constant>

name值 为struts2内置的 要用message来替换他


配置message.properties 在WEB-INFO\classes下
[img]/upload/attachment/136646/e30aa6c0-e005-370e-88ed-0295f51e11b8.jpg[/img]
含义为:只要类型转化有错误, 就赋予其默认值0,然后反馈错误信息“error”

[color=red]局部资源转化文件:[/color]
配置与action类同名的properties文件(同一目录下)

文件内容:

含义为:当你关联的action类中的age属性转化错误时, 反馈信息为”age conversion error”


[size=medium]native2ascii.exe使用

[img]/upload/attachment/136648/86278aea-affe-34ff-b089-3f61c34e0b18.jpg[/img]

第一种方式:输入,然后输出为unicode

[img]/upload/attachment/136650/d17ae044-cbc4-36d7-a2e8-55ac94f02500.jpg[/img]


第二种方式:文件转化为文件

[img]/upload/attachment/136652/c26a9a17-c65d-3d56-b114-096f8d3ca24b.jpg[/img]

源文件,目标文件
default.properties[/size]



struts2错误有两种
一种是field级别的;另一种是action级别的
addActionError()

struts2表单标签内置提示错误机制, 但仅限于fieldError
addFieldError()将错误信息添加到Map中;addActionError()添加到Collection中

显示ActionError需要在视图中加入<s:actionerror />Struts2标签

[img]/upload/attachment/136654/733af215-8cc9-387f-ad7b-be3241bbfe0e.jpg[/img]

theme=””属性 主题;simple表示不使用表格,并且显示fielderror机制失效。 使用theme=simple 则使struts标签封装的额外功能失效。如label失效, 等等

[img]/upload/attachment/136656/56501368-5917-3d2d-8898-cdc8b51ed4e3.jpg[/img]


如果action 具有method属性, 则执行method指定的方法, 跳过execute方法
public String execute() throws Exception{}

public String Abc() throws Exception{}




void abc() 方法于execute除了名字不同 其他全部相同, 包括执行机制

[img]/upload/attachment/136658/ed0dc689-9d80-31fa-87b9-5e9793e89b35.jpg[/img]


配置多个逻辑的action

[img]/upload/attachment/136660/d8cc25c3-1fce-3b3b-9f3e-f19fcdfb3854.jpg[/img]


既然有多个处理业务逻辑的方法, 则需要多个验证类 , 下面是解决方案
方法名为abc() 则 abc 的验证方法为 validateAbc()

对于一个action来说, 如果你有自定义的方法,以及验证方法,
首先执行validateAbc()方法;然后无论validateAbc()是否通过都去执行validate()方法. 也就是说validate()是必须执行的; 如果这其中没有任何转化错误和验证错误, 才去执行相应的业务逻辑方法.
但是这种机制不合理, 因为自定义方法已经有自己的验证方法, 无需调用validate()方法。 解决方式有两个:1、将validate() 内容写为空。2、将validate()方法改名为validateExecute()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值