1:struts2 的类型转换,对于8个原生的数据类型以及Date,String等常见的类型,struts2 可以使用内建的类型转化器
实现自动的转换;但是对于自己定义的对象类型来说,就需要我们自己制定类型转换方式了。
2:
对于自定义的类型转换器来说需要提供3个信息:action的名字,
action中要转换的属性的名以及该属性的类型转换器。其中
Action的名字是通过属性文件名来获得的,Action中待转换的
属性是通过文件中key来获得的,该属性对应的类型转换器是通过key所
对应的value来得到的。
代码:
package Bean;
public class User {
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;
}
}
package converter;
import java.util.Map;
import java.util.StringTokenizer;
import Bean.User;
import ognl.DefaultTypeConverter;
public class UserConverter extends DefaultTypeConverter{
/**
*
**/
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (User.class == toType) {//从页面向后台对象转换
String [] str = (String[])value;//可能页面上一个name对应多个值
System.out.println("ddd");
String firstValue = str[0];
StringTokenizer st = new StringTokenizer(firstValue,";");
String username = st.nextToken();
String password = st.nextToken();
User user = new User ();
user.setUsername(username);
user.setPassword(password);
return user;
}
return null;
}
}
package action;
import Bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println("username:"+user.getUsername()+"password:"+user.getPassword());
return SUCCESS;
}
}
配置文件如下:
名字:UserAct ion-conversion必须是类型+“-conversion”
user=converter.UserConverter
配置文件中的注释是#user=converter.UserConverter
3:可以使用Struts2框架自带的类型转化器strutsTypeConverter简化
类型转换代码的编写,StrutsTypeConverter继承与DefaultTypeConverter父类,
并且提供了二个抽象的方法:convertFromString与convertToString,
分别表示从页面的字符串转化为后台对象以及后台对象转化为页面的字符串,我们
只需要实现二个抽象方法即可实现类型转化。
package converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import bean.User;
public class UserConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map arg0, String[] values, Class type) {
User user = new User ();
String text[] = values[0].split(":");
user.setUsername(text[0]);
user.setPassword(text[1]);
return user;
}
@Override
public String convertToString(Map arg0, Object value) {
String returnString = null;
User user = (User)value;
returnString = user.getUsername()+":"+user.getPassword();
return returnString;
}
}
4:批量的转化:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>使用分号隔开用户名与密码</h1>
<form action = "UserAction2">
user info 1:<input type = "text" name = "users" /><br/>
user info 2:<input type = "text" name = "users" /><br/>
user info 3:<input type = "text" name = "users" /><br/>
user info 4:<input type = "text" name = "users" /><br/>
<input type = "submit" value = "submit"/>
</form>
</body>
</html>
package action;
import java.util.List;
import bean.User;
import com.opensymphony.xwork2.ActionSupport;
import freemarker.template.utility.Execute;
public class UserAction2 extends ActionSupport{
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String execute() throws Exception {
for (User u:users) {
System.out.println(u.getUsername()+":"+u.getPassword());
}
return SUCCESS;
}
}
package converter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import bean.User;
public class UserConverter2 extends StrutsTypeConverter{
@Override
public Object convertFromString(Map arg0, String[] values, Class arg2) {
List<User> users = new ArrayList<User> ();
for (String value:values) {
StringTokenizer st = new StringTokenizer(value,":");
User user = new User ();
user.setUsername(st.nextToken());
user.setPassword(st.nextToken());
users.add(user);
}
return users;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name = "sss" extends="struts-default" namespace="/">
<action name="UserAction2" class="action.UserAction2">
</action>
<action name = "login" class="action.LoginAction" method=" invoke">
</action>
</package>
</struts>
LoginAction:
package action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("xi");
this.username = username;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String invoke () {
System.out.println("hello");
return SUCCESS;
}
}
一般不推荐使用自定义方法:
struts也支持自定义方法,在action标签中加入method属性,属性值即为待执行的方法。
不推荐使用这种方式,因为它容易导致Action代码混乱l