Struts2中的日期转换

时间:2013-12-17 17:32:25

标签: java date struts2 type-conversion struts2-interceptors

我想知道如何在Struts2中将String转换为Date。我有一个简单的表单,用户以此格式"yyyy-MM-dd"提供日期。将Sturts2地图表格提交给bean。我在日期转换中遇到错误。我谷歌它很多,并声明我们必须使用自定义类型转换器。我不想为日期转换编写自定义类型转换器。我认为Struts2中应该有一个简单的数据转换机制,因为数据转换是非常常见的功能。

JSP

<s:form action="AddDomain">
    <s:push value="idp">
        <s:textfield name="domainName"         label="Domain Name" />
        <s:textfield name="url"                label="Domain URL" />
        <s:textfield name="noOfLicense"        label="License Purchased" />

        <s:textfield name="licenseExpireDate"  label="License Expire Date" 
                                               title="YYYY-MM-DD like 2013-01-21" />

        <s:textfield name="userActiveDuration" label="Active User Duration"
                                               title="please mention in days" />

        <s:textarea  name="notes"              label="Note" cols="30" rows="5" ></s:textarea>

        <s:submit value="Add" />
    </s:push>
</s:form>

这是用户输入输入的JSP。

模型类

@Entity
@Table(name = "Domain")
public class IdentityProvider implements Serializable {

    @Id
    @Basic(optional = false)
    private String url;
    private String domainName;
    private int noOfLicense;
    private int userActiveDuration;
    private int activeUsers;
    private Date licenseExpireDate;
    private String notes;

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String domainIdCode;

    public IdentityProvider(String name, String url, int nol, int time,Date d,String notes) {
        this.setDomainName(name);
        this.setUrl(url);
        this.setNoOfLicense(nol);
        this.setUserActiveDuration(time);
        this.setLicenseExpireDate(d);
        this.setNotes(notes);
    }

    public IdentityProvider() {

    }

    // Getter Setter
}

行动类

public class DomainManagementAction extends ActionSupport 
                                 implements ModelDriven<IdentityProvider> {

    private IdentityProvider idp = new IdentityProvider();

    public IdentityProvider getIdp() {
        return idp;
    }

    public void setIdp(IdentityProvider idp) {
        this.idp = idp;
    }

    public String saveDomain() {
        IDPBroker broker = new IDPBroker();
        broker.saveDomain(idp);
        return ActionSupport.SUCCESS;
    }


    @Override
    public IdentityProvider getModel() {
        // TODO Auto-generated method stub
        return idp;
    }

}

1 个答案:

答案 0 :(得分:7)

Struts2 Type Conversion

  

内置类型转换支持

     

类型转换由XWork实现。

     

XWork将自动处理最常见的类型转换   您。这包括支持每个字符串转换为字符串   以下内容:

     

的字符串
     布尔/布尔
     字符/字符
     int / Integer,float / Float,long / Long,double / Double
     日期 - 使用与当前请求关联的区域设置的SHORT格式
     数组 - 假设各个字符串可以转换为单个项目
     集合 - 如果不是对象类型可以确定,则假定它是一个String并且创建一个新的ArrayList

JAVA中的

SHORT format

Style     U.S. Locale   French Locale

SHORT       6/30/09       30/06/09

这意味着它已经可以使用,但只能使用SHORT格式,并且不可配置。试试吧。

然后你可以在发送之前用一些javascript hack改变客户端的值,或者复制并粘贴this small converter,或者使用jQuery datetimepicker(推荐),你唯一的问题是哪个主题是最酷的:)


修改

经过一些加密评论,我已经尝试过了,显然它就像文件所说的那样。

  • 如果您的区域设置是(例如)en_US,则需要以MM/dd/yy格式发送字符串数据。
  • 如果您的区域设置是(例如)it_IT,则需要以dd/MM/yy格式发送字符串数据。
  • 如果您使用dd/MM/yy区域设置输入en_US,则会收到验证错误和输入结果。
  • 如果您尝试使用-代替/,则会失败。
  • 如果您输入其他格式的日期,例如。 dd/MM/yyyy(与SHORT不同但适用于您的区域设置),您的日期将正确设置相同。
  • 如果您在JSP中读取了Action日期而没有对其进行格式化,则它将始终显示在SHORT。

然后,如上所述,如果您需要让用户手动输入日期,请​​告诉用户尊重您的语言环境的正确格式(例如

<label>Input a date (dd/mm/yyyy):</label> 
<s:textfield name="aDate" />
<s:fielderror fieldName="aDate" />

或者在插入后通过javascript更改它,或者使用自定义转换器。