📜  Struts 2-类型转换(1)

📅  最后修改于: 2023-12-03 15:35:10.405000             🧑  作者: Mango

Struts2-类型转换

在Struts2中,类型转换器负责将表单提交的字符串转换成Action类中对应的属性类型,使得系统能够正确的将请求参数注入到Action类中。本文将对Struts2中的类型转换器进行详细介绍。

Struts2类型转换器的使用

在Action类中,需要使用@com.opensymphony.xwork2.ActionSupport支持注解,同时定义一个与表单中参数名称相同的属性。

public class DemoAction extends ActionSupport {
    private int age;
    // getter and setter methods
}

在表单中需要提交一个名为age的字符串,Struts2中的类型转换器会将其转换成整型数据。

<s:form action="demo.action" method="post">
  <s:textfield name="age" label="Age" />
  <s:submit value="Submit" />
</s:form>
Struts2类型转换器的配置

Struts2中的类型转换器有两种配置方式,一种是在struts.xml文件中进行配置,另一种是自定义类型转换器。

Struts2类型转换器的默认配置

在struts.xml中默认已经配置好了常用的类型转换器,包括:

| 类型 | 配置关键字 | | ------------ | -------- | | 字符串(String) | string | | 整形(int) | integer | | 长整形(long) | long | | 短整型(short) | short | | 布尔型(boolean) | boolean | | 双浮点型(double) | double | | 单浮点型(float) | float | | 日期格式(Date) | date |

自定义类型转换器

在Action类中添加set方法,使用自定义的类型转换器类。例如:

public class DemoAction extends ActionSupport {
    private Date dateOfBirth;

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    // getter method
}

在struts.xml中定义转换器类:

<bean type="org.apache.struts2.util.StrutsTypeConverter" name="dateTypeConverter" class="com.example.DateTypeConverter" />

<constant name="struts.conversion.properties"  value="conversion.properties" />

其中,conversion.properties文件用来定义自定义类型转换器,例如:

java.util.Date=com.example.DateTypeConverter
Struts2类型转换器的继承

在Struts2中,类型转换器支持继承关系,当无法找到指定类型的转换器时,Struts2会在转换器继承链上寻找相关转换器。例如:

public class DemoAction extends ActionSupport {
    private List<Goods> goodsList;

    public void setGoodsList(List<Goods> goodsList) {
        this.goodsList = goodsList;
    }

    // getter method
}

在struts.xml中定义Goods转换器,并继承PropertyEditorBridge类:

<bean type="org.apache.struts2.util.StrutsTypeConverter" name="goodsTypeConverter" class="com.example.GoodsTypeConverter" extends="com.opensymphony.xwork2.util.reflection.StrutsTypeConverter" />

<constant name="struts.conversion.properties"  value="conversion.properties" />

在conversion.properties中定义Goods类型的转换器:

com.example.Goods=com.example.GoodsTypeConverter
Struts2类型转换器的使用示例

下面是一个完整的示例,包括Action类、配置文件及JSP页面。

DemoAction.java

public class DemoAction extends ActionSupport {
    private Date dateOfBirth;

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    // getter method
}

DateTypeConverter.java

public class DateTypeConverter extends StrutsTypeConverter {
    private DateFormat dateFormat;

    public DateTypeConverter() {
        this.dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    }

    @Override
    public Object convertFromString(Map context, String[] values, Class toType) {
        String dateString = values[0];
        try {
            return this.dateFormat.parse(dateString);
        } catch (ParseException e) {
            throw new TypeConversionException(e);
        }
    }

    @Override
    public String convertToString(Map context, Object object) {
        Date dateValue = (Date) object;
        return this.dateFormat.format(dateValue);
    }
}

struts.xml

<package name="demo" namespace="/" extends="struts-default">
  <action name="demo" class="com.example.DemoAction" method="execute">
    <result name="success">/WEB-INF/views/demo/success.jsp</result>
  </action>
  
  <bean type="org.apache.struts2.util.StrutsTypeConverter" name="dateTypeConverter" class="com.example.DateTypeConverter" />
  
  <constant name="struts.conversion.properties" value="conversion.properties" />
</package>

conversion.properties

java.util.Date=com.example.DateTypeConverter

success.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
  <title>示例</title>
</head>
<body>
  <s:form action="demo" method="post">
    <s:textfield name="dateOfBirth" label="Date of Birth" value="%{#request.dateOfBirth}" />
    <s:submit value="Submit" />
  </s:form>
</body>
</html>

在浏览器中访问http://localhost:8080/demo,输入"1990-01-01",提交成功后,将重定向到success.jsp页面,并显示输入的日期。