1

StringStruts2 で aを変換する方法をDate知りたいです。ユーザーがこの形式で日付を提供する単純なフォームがあります"yyyy-MM-dd"。Sturts2 マップ フォームを Bean に送信すると、日付変換でエラーが発生しました。私はそれをよくGoogleで検索し、これにはカスタムタイプコンバーターを使用する必要があると述べられています。日付変換用のカスタム型コンバーターを作成したくありません。データ変換は非常に一般的な機能であるため、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;
    }

}
4

1 に答える 1

8

Struts2 の型変換

組み込みの型変換サポート

型変換は XWork によって実装されます。

XWork は、最も一般的な型変換を自動的に処理します。これには、次のそれぞれの文字列との間の変換のサポートが含まれます。

String
boolean / Boolean
char / Character
int / Integer、float / Float、long / Long、double / Double
日付 - 現在のリクエスト配列に関連付けられた Locale に SHORT 形式を使用
- 個々の文字列を個々のアイテム
コレクションに変換できると仮定- オブジェクト タイプを判別できない場合は、文字列と見なされ、新しい ArrayList が作成されます

JAVA のSHORT 形式:

Style     U.S. Locale   French Locale

SHORT       6/30/09       30/06/09

これは、すでに機能していることを意味しますが、SHORT 形式のみであり、構成可能ではありません。それを試してみてください。

次に、送信する前にJavaScriptハックでクライアント側の値を変更するか、この小さなコンバーターをコピーして貼り付けるか、jQuery datetimepickerを使用します(推奨)。唯一の問題は、どのテーマが最もクールかということです:)


編集

いくつかの暗号コメントの後、試してみましたが、明らかにドキュメントの状態のようです。

  • Locale が (eg.)en_USの場合、文字列データを形式で送信する必要がありますMM/dd/yy
  • Locale が (eg.)it_ITの場合、文字列データを形式で送信する必要がありますdd/MM/yy
  • Locale で入力dd/MM/yyすると、検証エラーと INPUT 結果が返されます。en_US
  • -の代わりに使用しよう/とすると、同じように失敗します。
  • 日付を別の形式で入力した場合。dd/MM/yyyy(SHORT とは異なりますが、ロケールに適しています)、日付は同じように正しく設定されます。
  • アクションの日付をフォーマットせずに JSP で読み取ると、常に SHORT で表示されます。

次に、上記のように、ユーザーに手動で日付を入力させる必要がある場合は、ロケールの正しい形式を尊重するようにユーザーに伝えます (例:

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

または、挿入後に JavaScript で変更するか、カスタム コンバーターを使用します。

于 2013-12-17T18:04:33.557 に答える