本文主要介绍struts2.3中的变量类型转换,同时也涉及到一些通配符的设置操作。我们知道,从页面上传到后台的数据都是以字符串的形式,不管是什么样的类型,例如日期、点坐标的数据,有时某些数据是要转换成一个对象的形式,所以这就涉及到类型问题。
在这之前,我首先要讲一下struts2的一些简单配置问题,第一步就是要引入相关资源文件。具体文件如下:
注意struts.xml应该放在类路径下。
接下来,我们要在web.xml中配置该struts的过滤器,这个过滤器就是整个struts应用的入口,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>teststruts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
过滤器配置好后,我们还要配置一个action,这个就是负责接收表单数据,页面跳转,调用后台的业务逻辑和数据逻辑,就是一个连接model层和view层的桥梁。以坐标点的类型转换为例说明。它的处理类如下 :
package com.ev.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.ev.point.Point;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{
private String username="aaa";
private String password;
private Point point;
public String showPoint(){
System.out.println(point.getX());
System.out.println(point.getY());
return "point";
}
public String form(){
ActionContext ac = ActionContext.getContext();
Map<String, Object> map = ac.getSession();
map.put("name",username);
return "home";
}
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;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
}
其配置内容在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>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!-- Add packages here -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="jsp_*_*" class="com.ev.action.MyAction" method="{2}">
<result name="{1}">
/WEB-INF/{1}.jsp
</result>
</action>
</package>
</struts>
接下来,还要配置一下转换器代码如下 :
package com.ev.conversion;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.ev.point.Point;
public class MyConversion extends StrutsTypeConverter {
@Override
public Object convertFromString(Map arg0, String[] obj, Class type) {
String[] arr = obj[0].split(",");
int x = Integer.parseInt(arr[0]);
int y = Integer.parseInt(arr[1]);
Point point = new Point();
point.setX(x);
point.setY(y);
return point;
}
@Override
public String convertToString(Map arg0, Object obj) {
Point point = (Point)obj;
String temp = "["+point.getX()+","+point.getY()+"]";
return temp;
}
}
该转换器中的convertFromString方法就是将页面中传过来的字符参数转换成相关对象形式本例以坐标点对象为例。其中第二个参数String[] obj就是从页面上传过来的。函数convertToString就是将相关对象转成字符串形式,以便将对象的内容显示在页面中。在这个转换器写完后,我们还要在一个.properties配置文件中,指定action中哪个 属性引用该转换器。这个配置文件应该放在和相关action的同一个位置中。文件的命名规则为:ActionName-conversion.properties,ActionName对应了action的名称,但后面部是固定不变的。这样才能被找到。文件内容为:point=com.ev.conversion.MyConversion;point就是对应action中的point属性,其值com.ev.conversion.MyConversion指定了引用的转换器。
最后我们就可以运行一下该应用了。过程如下 :
首先模拟一下登陆操作如下图:
点击提交登陆成功后跳转到下面的页面
在该页面中我们输入2,3点击提交后我们就可以看到结果了