:上一次,已经讲了我们为什么要使用struts2的类型转换器,但是那个只是局部的。这里我们要介绍全局的
类型转换器的配置。之后便是介绍sturts2错误处理机制,利用struts2的错误处理机制,我们可以对客户端
提交的数据信息进行更加规范的验证,并且可以多方面的向客户端显示错误信息.
:这里我们主要介绍strus2的错误处理机制.
首先接着上一次的介绍:struts2的全局类型转换器,其实struts2的局部类型转换器与全局类型的转换器
不同的地方就是在配置文件的路径、名称和配置信息
-------------------------------------------------------------------------------------------------------------------------------
|类型 | 名称(后缀.properties)| 路径 | 配置信息
|------------------------------------------------------------------------------------------------------------------------------
|全局 | xwork-conversion | src的根目录下 |需要转换的对象的限定名=对该对象进行转换的转换器的限定名 |
|-----------------------------------------------------------------------------------------------------------------------------
|局部 | action对象名+(-conversion)| action类的同目录下 |action对象中需要进行转换的成员变量名=(如上)
|------------------------------------------------------------------------------------------------------------------------------
//全局的类型转换器:就是指明在项目的任何地方使用(此对象的时候)都会调用(对该对象进行转换的转换器)进行类型转换
当我们希望对客户端提交过来的数据信息进行验证的时候,我们可以在提交中指定的action 对象中调用
ActionSupport类的validate()方法进行数据的校验。
通过this.addFieldError(String fieldName,String errorMessage)方法将错误信息保存,并返回到客户端
addFieldError(String fieldName,String errorMessage)方法有两个参数
:String fieldName 指定是那一个成员变量出错了。
:String errorMessage 填写显示在客户端的错误信息。
如果客户端提交的某些信息类型不符合action对象中成员变量的类型,那么struts2会自动将该错误信息
添加在addFieldError中并返回到客户端进行显示,但是显示的信息非常的格式化,而且全部都是英文。
如果我们想对这些错误信息进行自定义,该怎么办了?这个问题就牵扯到struts2的错误处理机制上了,
(struts2的错误处理机制是用配置文件管理的)我们如何将struts2的错误处理机制的配置信息进行自定义了?
首先:我们要在struts.xml文件中配置如下信息:
<struts> <constant name="struts.custom.i18n.resources" value="message"></constant> /* <constant name="struts.custom.i18n.resources" value="message"></constant> 配置这段信息,是为了指定我们自定义的配置文件 name:关于contant标签中的属性的值是固定写法不要写错 "struts.custom.i18n.resources" 是在Strut2-core.jar default.properties中定义的,这里相当于重写 value:说明我们配置的xml文件的名称 (只用写名称不需要 .properties) */ //这里是struts2的action对象配置 <package name="struts2" extends="struts-default"> <action name="login" class="org.viancent.action.UserLoginAction"> <result name="success">/show.jsp</result> <result name="input">/login.jsp</result> </action> </package> </struts>
其次创建message.properties文件
:对于全局的配置文件 必须在src的根目录下创建 :填写的内容如下 key:xwork.default.invalid.fieldvalue //key的值是一个固定的写法 value:{0} error //{0}相当于一个占位符,给定struts2填写内容位置,在这里填写的内容便是jsp页面出错的表单元素的name值
-------------------------------------------------------------------------------------------------------------------------------
|类型 | 名称(后缀.properties) | 路径 | 配置信息
|------------------------------------------------------------------------------------------------------------------------------
|全局 | 在struts.xml<constant>的value值| src的根目录下 |xwork.default.invalid.fieldvalue={0} error
|-----------------------------------------------------------------------------------------------------------------------------
|局部 | action对象名+后缀| action类的同目录下|invalid.fieldvalue.+(action对象的成员变量名称)=(填写错误信息)
|------------------------------------------------------------------------------------------------------------------------------
//这里概述一下struts2类型转换和输入校验的流程
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误
信息放到addFieldError里面.
类型转换与输入校验的流程
具体实例如下://使用的是类型转换错误处理机制的局部配置 和struts2的全局类型转换器的配置
struts.xml:配置信息如上
web.xml: 配置信息不变
action对象信息:package org.viancent.action;
注意:如果类型转换不成功,也同样要进行输入校验
import java.util.Calendar; import java.util.Date; import org.viancent.domain.UserInfo; import com.opensymphony.xwork2.ActionSupport; public class UserLoginAction extends ActionSupport { private UserInfo userinfo; private Date birthday; private int age; public int getAge() { return age; } public UserInfo getUserinfo() { return userinfo; } public void setUserinfo(UserInfo userinfo) { this.userinfo = userinfo; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String execute() throws Exception {return SUCCESS; } @Override /*输入校验 程序运行到这里就已经通过了类型转换的过程 如果某个数据信息转换失败,struts2则会对 该数据对应的action对象成员变量进行初始化变量 */ public void validate() { if (this.getAge() < 0 || this.getAge() >= 150) { this.addFieldError("age", "年龄必须在0-150之间!"); //添加错误信息 } System.out.println(this.getBirthday()); if (null == this.getBirthday() || "".equals(this.getBirthday())) { this.addFieldError("birthday", "日期不能为空"); return; } Calendar ca = Calendar.getInstance(); //Claendar 的before()方法 判断是否在某时段之前 ca.setTime(new Date("3/13/2011")); Calendar cs = Calendar.getInstance(); cs.setTime(this.getBirthday()); if (!cs.before(ca)) { this.addFieldError("birthday", "birthday is error"); } } }
domain类: package org.viancent.domain; public class UserInfo { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
//局部类型转换错误的配置文件 action对象+.properties UserLoginAction.properties; invalid.fieldvalue.age/*age action对象的成员变量*/ =\u5E74\u9F84\u4E0D\u6B63\u786E invalid.fieldvalue.birthday=\u65E5\u671F\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01 //全局类型转换器的配置文件 xwork-conversion.properties: /*需要转换的对象*/ org.viancent.domain.UserInfo=org.viancent.converter.UserConverter /*类型转换器的对象*/
//类型转换器的信息 这里使用的是Struts2提供的 package org.viancent.converter; import java.util.Map; import java.util.StringTokenizer; import org.apache.struts2.util.StrutsTypeConverter; import org.viancent.domain.UserInfo; public class UserConverter extends StrutsTypeConverter { @Override //从客户端到服务器的转换 public Object convertFromString(Map arg0, String[] arg1, Class arg2) { String str = arg1[0]; StringTokenizer token = new StringTokenizer(str, ";"); UserInfo userinfo = new UserInfo(); userinfo.setUsername(token.nextToken()); userinfo.setPassword(token.nextToken()); return userinfo; } @Override//从服务器到客户端的转换 public String convertToString(Map arg0, Object arg1) { UserInfo info = (UserInfo) arg1; String str = "usernmae:" + info.getUsername() + ", password:"+ info.getPassword(); return str; } }
view 界面:
login.jsp: <s:form action="login"> <s:textfield name="userinfo" label="userinfo"></s:textfield> <s:textfield name="age" label="age" ></s:textfield> <s:textfield name="birthday" label="birthday"></s:textfield> <s:submit></s:submit> </s:form>
show.jsp: <body> <s:property value="userinfo"/> <s:property value="birthday"/> <s:property value="age"/> </body>