一、struts2自己内建的类型转换器
对于struts2而言从页面获取的都是字符串形式的,而在Action处理中我们可以针对不同的字段有不同的类型进行接收,
struts2能够为我们内建的的类型转换有:8中原始数据类型、String、Date(yyyy-mm-dd)。
二、对于其他的类型(包括自定义类型)需要我们为其进行类型转换操作
案例:(用户登录)
1、登录界面login.jsp
<form action = "login" method = "post">
<h4>使用分号进行用户名与密码的解析</h4>
user info:<input type = "text" name = "user"/><br/>
<input type = "submit" value = "submit"/>
</form>
对应的User对象
public class User{
private String username;
privste String password;
//....setter/getter...
}
2、对应的LoginAction,在流程流转到该Action时,此时的User可以直接使用,这样就可以将主要的业务逻辑
与次要的业务逻辑进行分离。
public class LoginAction extends ActionSupport{
private User user;
public String execute()throws Exception{
return SUCCESS;
}
//....属性setter/getter...
}
3、配置struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="LoginAction">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
接下来就是来对自定义的类型进行类型转换了。
4、类型转换(第一种方式)
/**
* 类型转换器(ognl)
*/
public class UserConverter extends DefaultTypeConverter
{
/**
* 首先将从页面中获取的字符串转黄成对象,然后在将对象转换成字符串
*/
@SuppressWarnings("unchecked")
@Override
public Object convertValue(Map context, Object value, Class toType)
{
//如果要转换的类型是User类型的
if(User.class == toType)
{
//因为从表单中获取的组件不一定只有一个,他是将一个控件中获取的值作为
//数组的第一个元素
String[] str = (String[])value;
String first = str[0];
StringTokenizer st = new StringTokenizer(first,";");
User user = new User();
user.setUsername(st.nextToken());
user.setPassword(st.nextToken());
return user;
}else if(String.class == toType)
{
User user = (User)value;
return "username:"+user.getUsername()+" ;password:"+user.getPassword();
}
return null;
}
}
类型转换(第二种方式)
/**
* 类型转换,由struts2提供
*/
public class UserConverter2 extends StrutsTypeConverter
{
@SuppressWarnings("unchecked")
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2)
{
String str = arg1[0];
StringTokenizer st = new StringTokenizer(str,";");
User user = new User();
user.setUsername(st.nextToken());
user.setPassword(st.nextToken());
return user;
}
@SuppressWarnings("unchecked")
@Override
public String convertToString(Map arg0, Object arg1)
{
User user = (User)arg1;
return "username1:"+user.getUsername()+"? password1:"+user.getPassword();
}
}
编写好类型转换器之后,那么如何让其起作用呢?
在含有类型转换的Action类所在包下建立一个属性文件,其该文件的命名规则为:对应的Action-conversion.properties
在此处该文件的名称为:LoginAction-conversion.properties
其文件内容为:
#键值为要进行类型转换的属性,值为对应的处理类
user = com.liusheng.converter.UserConverter2
如上的配置只能针对某个Action中的某些属性进行类型转换处理,如果想对某个对象,不管位于哪里都做相同的处理
此时就需要配置全局类型转换了。
全局类型转换:在SRC目录下新建xwork-conversion.properties,该文件的内容是带转换的类=转换器类名, 即 com.liusheng.bean.User = com.liusheng.converter.UserConverter