今天看了一个struts2的例子程序,struts2是初学,并不是太懂,这个代码很短,但是我还是看了几个小时,主要是想搞清楚实现的原理,根据自己的理解做一点笔记,以后肯定有能够用到的地方,当然我的理解思路和理解的结果也不一定是对的,这里我写出来仅供自己参考用,如果以后学深入了,回头看过来发现有错会及时修改。
今天主要做的事情是理解代码是如何执行的,因此只记录我的理解过程,深入的扩展的底层的知识不涉及
首先是jsp代码
输入:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
用户在文本框中输入值,使用分号;隔开
输出:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
Insert title here
/out.jsp
bean:
package com.oracle.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 com.oracle.converter;
import java.lang.reflect.Member;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringTokenizer;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import com.oracle.bean.User;
public class UserConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Map context, Object target, Member member, String propertyName,
Object value, Class toType) {
//处理前台输入的值
if(User.class == toType){
String[] str = (String[]) value;
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;
}
//向前台输出值
else if(String.class == toType){
User user = (User) value;
String userInfo = "username:" + user.getUsername() + " password:" + user.getPassword();
return userInfo;
}
return null;
}
}
package com.oracle.action;
import com.opensymphony.xwork2.ActionSupport;
import com.oracle.bean.User;
public class UserAction extends ActionSupport{
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(user.getUsername() + ":" + user.getPassword());
return SUCCESS;
}
}
user=com.oracle.converter.UserConverter
接下来给出我的理解和笔记:
1.在index.jsp中text文本框中输入值,点击提交
2.form表单通过action找到struts.xml中对应的action,这里是UserAction
3.找到与类UserAction对应名称的-conversion.properties文件
4.进入.properties文件,格式为 属性名=类型转换器类名(包括包名)
5.在这里属性名会和UserAction类中的set方法进行匹配,找到对应的方法后,会进入类型转换器类执行覆盖的方法convertValue(),否则匹配失败,相当于不进行类型转换,直接执行execute()方法
6.这里需要转换成User类型,class==User,在类型转换器中转换的value的值是字符串数组,如果只有一个text文本框,那么就是value[0]
7.返回值到UserAction中的set方法,作为参数
8.执行execute()方法,返回SUCCESS到struts.xml
9.跳转到out.jsp页面
10.
11.通过UserAction中的get方法得到user对象,进行类型转换,这个属性的类型是String
12.在convertValue()方法中返回字符串到前台
ps:这里我并不知道两次class参数类型的缘由,只有自己的想法,也许不对,我想这两次class类型不同的原因大概是第一次set得知类型是User第二次get不需要改变原来的String
今天的笔记就是这么多了,毕竟初学,如果有错,恳请指出
2016/8/22修改:
接下来是对类型转换器类的改进
可以使用Struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编写,StrutsTypeConverter继承于DefaultTypeConverter父类,并且提供了两个抽象方法:convertFromString与convertToString,分别表示从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换。
package com.oracle.converter;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import com.oracle.bean.User;
public class UserConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map arg0, String[] value, Class toType) {
User user = new User();
StringTokenizer st = new StringTokenizer(value[0], ";");
user.setUsername(st.nextToken());
user.setPassword(st.nextToken());
return user;
}
@Override
public String convertToString(Map arg0, Object obj) {
User user = (User) obj;
String userInfo = "username:" + user.getUsername() + " password:" + user.getPassword();
return userInfo;
}
}