类型转换:将jsp页面的请求参数进行类型的转换后再赋值给action的属性
Struts2已经内建了对于String和基本类型的类型转换,比如String<-->int 、String<-->boolean等;
Action属性一定要有getter和setter方法!
Struts2提供了强大的类型转换支持,不仅提供了内置的类型转换器,还可以自定义类型转换器,以满足自定义需求;
Struts2类型转换是通过 params拦截器进行转换;如果转换失败,则 conversionError拦截器拦截该异常,并封装到fieldError中,放入ActionContext中;
Struts2类型转换还支持OGNL表达式,只需要在表单控件的name属性使用ognl表达式即可,比如表单控件的name属性为user.name,则此控件的数据将进入赋值给Action的user属性中的name属性;
一、struts2自带的类型转换
1、普通的string->int类型的转换
参数请求页面:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: yangcs
Date: 2017/2/6
Time: 14:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
类型转换器
使用struts2自带的类型转换器对jsp数据类型进行转换(注意使用了OGNL表达式和struts标签)
后面要对这样的带有非String类型的数据输入进行校验操作
具体效果可以看后台
接受参数的action:
package test002;
import Dao.Person;
import com.opensymphony.xwork2.ActionSupport;
/**
* Created by yangcs on 2017/2/6.
* 使用struts2自带类型转换器转换类型示例action
*/
public class TypeExchangeAction extends ActionSupport{
private String name;
private int password;
private Person p;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}
public String execute(){
System.out.println(name);
System.out.println(password);
System.out.println(p.getAge());
System.out.println(p.getSalary());
return SUCCESS;
}
}
结果展示页面:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: yangcs
Date: 2017/2/6
Time: 14:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
类型转换器
使用struts2自带的类型转换器对jsp数据类型进行转换(注意使用了OGNL表达式和struts标签)
后面要对这样的带有非String类型的数据输入进行校验操作
具体效果可以看后台
2、当输入集合类型的参数时的转换
如果Action的属性为List类型,List
如果Action的属性为Map类型,Map
参数请求页面:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: yangcs
Date: 2017/2/6
Time: 16:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
类型转换
后台接受参数的action:
package test002;
import Dao.Person;
import Dao.User;
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.Map;
/**
* Created by yangcs on 2017/2/6.
* 这个action是使用类型转换成list和map类型的数据的示例
*/
public class TypeExchangeAction02 extends ActionSupport{
//public List lists; //这个地方不能定义为private???
public List lists; //定义为private还是不行啊!
private Map map;
public List getLists() {
return lists;
}
public void setList(List lists) {
this.lists = lists;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public String execute() throws Exception{
System.out.println(lists.get(0).getName());
System.out.println(lists.get(0).getPassword());
System.out.println(map.get("first").getAge());
System.out.println(map.get("first").getSalary());
return SUCCESS;
}
}
结果展示页面:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: yangcs
Date: 2017/2/6
Time: 16:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
类型转换结果
姓名:
密码:
年龄:
薪水:
二、自定义类型转换器
1.继承DefaultTypeConverter
如果我们自定义一个类型转换器,第一种方法是继承DefaultTypeConverter,并重写 public Object convertValue(ActionContext context,Object value,Class toType);
这个函数的功能是完成双向转换,即从String数组转到Action属性及Action属性转到String;需要注意的是从String数组转到Action属性,而不是String转到Action属性;如果只有一个字符串,则取params[0] 即可;
因此一般此函数的模板代码如下:
public Object convertValue(Map context, Object value,
Class toType) {
if(toType==String.class){
......
return String;
}
else if(toType==Action属性.class){
String params[] = (String[])value;//必须是字符串数组
.......
return Action属性;
}
return null;
}
完成自定义类型转换器编写后,如果需要使用此转换器,就需要配置,通常有两种配置方法:
1.局部类型转换文件中配置,仅对特定的Action的特定属性有效,比如在Action1中有aa属性,则仅对Action1的aa属性有效;
2.全局类型转换文件中配置,对某个类型都有效;比如对Person注册了类型转换器,则对任何Person和String的转换都有效;
全局类型转换文件命名为: xwork-conversion.properties,通常放在WEB-INF\classes下;
文件内容如:attributeName=ConvertClass ,比如org.person.Person = org.convert.Converter2
attributeName表示属性名称, convertClass表示转换器的实现类;
局部类型转换文件命名为:ActionName-conversion.properties,放在特定Action的目录下;
文件内容如: typeName=ConvertClass,比如aa=org.convert.Converter1
注意:typeName表示转换类型,convertClass表示转换器的实现类;
代码示例:
Conversion03Action.java
package org.conversion.action;
import org.person.Person;
import com.opensymphony.xwork2.ActionSupport;
public class Conversion03Action extends ActionSupport {
private Person p ;
public String execute()throws Exception{
System.out.println(p.getGender());
System.out.println(p.getSalary());
return SUCCESS;
}
public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}
}
Converter01.java
package org.converter;
import java.util.Map;
import org.person.Person;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class Converter01 extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value,
Class toType) {
if(toType==String.class){
Person p = (Person)value;
return p.getSalary()+","+p.getGender();
}
else if(toType==Person.class){
String params[] = (String[])value;
String[]values = params[0].split("\\,");
Person p = new Person();
p.setGender(values[1]);
p.setSalary(Double.parseDouble(values[0]));
return p;
}
return null;
}
}
3.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
Insert title here
Conversion03Action-conversion.properties
p=org.convert.Converter01
2.继承StrutsTypeConverter
StrutsTypeConverter是DefaultTypeConverter的子类,DefaultTypeConverter的类型转换器是在一个函数中进行双向转换,而继承StrutsTypeConverter的类型转换器则是将两个方向分别用两个函数实现:
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
}
@Override
public String convertToString(Map context, Object o) {
}
将DefaultTypeConverter中的Converter01换成如下代码就可以完成StrutsTypeConverter的类型转换器;
package org.converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import org.person.Person;
public class Converter02 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] value, Class toClass) {
String params[] = (String[])value;
String[]values = params[0].split("\\,");
Person p = new Person();
p.setGender(values[1]);
p.setSalary(Double.parseDouble(values[0]));
return p;
}
@Override
public String convertToString(Map context, Object o) {
Person p = (Person)o;
return p.getSalary()+","+p.getGender();
}
}
xwork-conversion.properties
org.person.Person=org.converter.Converter02
三、错误处理机制
客户输入错误信息是很正常的事,因此需要对此种行为进行处理,Struts2提供了很好的错误处理机制,是由conversionError拦截器自动完成,我们只需要配置输出什么错误信息即可;
当发生类型转换错误时,conversionError拦截器拦截此错误,并封装成fieldError,将此错误信息放入ActionContext中,并返回input逻辑视图;当然在
而为了显示错误信息,则在jsp页面中使用
注意:类型转换的Action在struts.xml中配置所在包需要extends="struts-default",因此在此文件中包含conversionError拦截器;
这时我们需要配置显示的错误信息,错误信息配置方式有两种:
1.配置默认提示信息
在国际化资源文件中配置形如:
xwork.default.invalid.fieldvalue={0},错误;
{0}代表类型转换错误的属性名称;
2.配置Action特定属性错误信息
在Action范围的国际化资源文件中配置形如:
invalid.fieldvalue.attributeName= 内容
attributeName是Action中的属性名称;
我们在上面的程序中添加类型转换错误的消息:
在Conversion04Action_zh_CN.properties中添加:
invalid.fieldvalue.p=person类型转换错误;
意思是对p属性配置了特定的错误提示信息,当p属性类型转换错误后就会显示此信息;