博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2自定义类型转换器、自定义拦截器和用户输入数据的验证
阅读量:6795 次
发布时间:2019-06-26

本文共 3314 字,大约阅读时间需要 11 分钟。

一、自定义类型转换器
1、编写一个类,继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter
2、覆盖掉其中的public Object convertValue(Map<String, Object> context, Object value,Class toType)
context:OGNL表达式的上下文
value:实际的值。用户输入的都是字符串,但他是一个String数组。
toType:目标类型
public class DateConvertor extends DefaultTypeConverter {
/*
context:ognl表达式的上下文
value:用户输入的值( 保存数据时)或者模型中的属性。用户输入的值是String数组
toType:目标类型
*/
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
if(toType==Date.class){
//2013/05/31----->java.util.Date 保存数据时
String strValue = ((String[])value)[0];
try {
return df.parse(strValue);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}else{
//java.util.Date----->2013/05/31 获取数据时
Date dValue = (Date)value;
return df.format(dValue);
}
}
}
3、注册类型转换器
3.1局部类型转换器:只对当前的Action有效
具体做法:在动作类相同的包中,建立一个名称是“动作类名-conversion.properties”的配置文件,
文件中增加以下内容:要验证的字段=验证器的类全名
birthday=cn.itcast.convertor.DateConvertor
3.2全局类型转换器:对所有的Action都有效
具体做法:在WEB-INF/classes目录下,建立一个名称为"xwork-conversion.properties"的配置文件,
文件中增加以下内容:目标类型全名=验证器的类全名
java.util.Date=cn.itcast.convertor.DateConvertor
注意:如果转换失败,Struts2框架会寻找name=input的结果页面
二、自定义拦截器
1、编写一个类,实现com.opensymphony.xwork2.interceptor.Interceptor
2、主要实现 public String intercept(ActionInvocation invocation) throws Exception{}方法
该方法的返回值就相当于动作的返回值
如果调用了String result = invocation.invoke();得到了动作类的返回的值。
public String intercept(ActionInvocation invocation) throws Exception {
//判断用户是否登录
HttpSession session = ServletActionContext.getRequest().getSession();
Object obj = session.getAttribute("user");
if(obj==null){
return "login";
}else{
return invocation.invoke();//调用动作方法
}
}
3、拦截器定义好后,一定要在配置文件中进行注册:
<interceptors> 只是定义拦截器,并没有起作用 
<interceptor name="permissionInterceptor" class="cn.itcast.interceptor.PermissionInterceptor">        </interceptor>
</interceptors>
4、配置文件中的动作,要通过
<interceptor-ref name="permissionInterceptor"></interceptor-ref>使用该拦截器
注意:一旦动作中使用了自定义的拦截器,那么默认的就不起作用了。一般应该采用如下的做法:
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="permissionInterceptor"></interceptor-ref>
多个动作类都要使用的话,可以通过package来进行组合。
三、用户输入数据的验证
1、手工编程验证,针对该动作类中的所有的动作方法
步骤:
a、动作类继承ActionSupport
b、覆盖调用public void validate()方法
c、在validate方法中,编写不符合要求的代码判断,并调用父类的addFieldError(String fieldName,String errorMessage)
如果fieldError(存放错误信息的Map)有任何的元素,就是验证不通过,动作方法不会执行。
Struts2框架会返回到name=input的result
d、在name=input指定的页面上使用struts2的标签显示错误信息。<s:fielderror/>
实例演示代码:
public class UserAction extends ActionSupport implements Serializable { private String username;//用户名不能为空,还要去掉首尾空格 private String password;//3~6位的数字 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; } public String add(){ System.out.println("执行了user的add方法"); return SUCCESS; } public String update(){ System.out.println("执行了user的update方法"); return SUCCESS; } @Override public void validate() {//验证方法。只考虑不符合条件的 if(username==null||"".equals(username.trim())){ addFieldError("username", "用户名不能为空"); } if(password==null||!password.matches("\\d{3,6}")){ addFieldError("password", "密码不能为空且必须是3~6位的数字"); } } }

转载于:https://www.cnblogs.com/toge/p/6114721.html

你可能感兴趣的文章
Gluster管理命令的总结与归纳
查看>>
我的友情链接
查看>>
linux内核的编译与安装
查看>>
FusionCharts free(图形报表)中文开发指南
查看>>
使用 Screen 创建并管理多个 shell
查看>>
adobe acrobat professional9.0中的PDF/A模式是什么意思
查看>>
【码云周刊第 30 期】打造场景化的图片特效处理工具
查看>>
fedora的官方镜像地址列表
查看>>
about socket
查看>>
我的友情链接
查看>>
本地YUM源配置与简单用法
查看>>
Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版
查看>>
not 与整数
查看>>
学习使用资源文件[3] - 用 Image 显示资源中的图片
查看>>
机器突然重启导致Mantis错误
查看>>
mysql基础(二) 常用SQL语句
查看>>
redhat 6.5 php 升级到5.6
查看>>
oracle数据库清理和回收system和sysaux表空间
查看>>
STL实例
查看>>
CCNP sla,route-map结合应用实现负载均衡和冗余
查看>>