Struts2之类型转换一
类型转换让值的传递变的更加方便灵活,下面以一个学习的例子来说明
请求端jsp代码
user.jsp
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<form action="userAction">
username: <input type="text" name="user"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
注意:
1、当action的值没有带任何扩展名时,默认会加上.action作为扩展名,所以这里写成userAction.action也是可以的。
2、这里定义的name属性值一定要跟服务端的action里面的set方法保持关联,也就是说在action中必须有一个setUser的方法才能够正常取得到文本框中的内容(由底层反射实现所决定)。
响应jsp
output.jsp
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<%
User user = (User) request.getAttribute("user");
if (user != null) {
%>
username: <%=user.getUsername()%><br>
password: <%=user.getPassword()%>
<%
} else {
System.out.println(user);
}
%>
</body>
</html>
服务端action
UserAction .java
public class UserAction extends ActionSupport {
private User user;
private static final long serialVersionUID = 1L;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
注意:
定义私有属性的时候确保属性名与请求端的parameter名保持一致,这样自动生成的get、set方法在被struts利用反射解析的时候很容易就找到。
请求信息对应的bean
User.java
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;
}
}
类型转换
UserConverter.java
public class UserConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (User.class == toType) {//从页面向后台对象转换
String[] str = (String[]) value;
String firstStr = str[0];
StringTokenizer st = new StringTokenizer(firstStr, ";");//分割字符串
String username = st.nextToken();//取得用户名
String password = st.nextToken();//取得密码
User user = new User();
user.setUsername(username);
user.setPassword(password);
return user;
}
return null;
}
}
注意:
自定义的类型转换类都要继承于DefaultTypeConverter 类,该类属于ognl.jar包,通过重写的形式来实现自定义的类型转换方法。
至此,服务端的控制层和模型层基本完成,但是,需要一个配置文件来连接action和converter,这个配置文件的编写有两种:
1、①配置文件名:UserAction-conversion.properties(定必须这么写);②配置文件路径:与UserAction.java同包。③配置文件内容:user=com.struts.converter.UserConverter
。
2、配置文件名:xwork-conversion.properties(固定必须这么写);②配置文件路径:即classpath同路径(src下面);③配置文件内容:com.struts.bean.User=com.struts.converter.UserConverter
它们的区别在于,如果时跟action同包,那么,每个action都必须有自己的-conversion.properites配置文件,而第二种情况下,则可以将所有的action配置在同一个配置文件中。
接下来是struts和webapp的配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
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="struts" extends="struts-default">
<action name="userAction" class="com.xf.struts.UserAction">
<result name="success">/output.jsp</result>
</action>
</package>
</struts>
注意:
1、package属性name可以自定义,只要有意义就行
2、action属性name与请求jsp中的action保持一致,class值对应的就是action的java类路径。
3、result属性name对应action中的excute方法返回的值,标签的内容则是要响应的jsp。
将项目部署到tomcat中进行测试。
页面中输入:
点击submit,显示下面的结果。
届时,一个简单的struts类型转换实例全部完成。下面来分析下项目运转起来的流程:
首先,启动服务器,在请求页面输入相关信息,点击提交按钮。接着,由web.xml接管请求,发现配置了相关的strtus-filter(过滤器),将请求转到struts.xml。在sturts中,请求被链接到了后台的action对象中进行处理,而与此同时,-conversion.properties配置文件获取到了消息,对传递到action中的user对象进行类型转换处理,处理完毕后返回object给action,action执行execute方法,将响应操作提交给struts,根据sturts.xml配置的响应页面进行跳转,得到最终的结果。
最后,以张龙老师的名言结尾: no reflection, no most frameworks.