对于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