1

さまざまなタイプのフィールドを持つ Struts2 のフォームがあります。フォームにデータを入力して送信すると、入力されたデータは評価されず、ActionSupportクラスではnull. 私の問題のサンプルの下

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="false" />
    <constant name="struts.action.extension" value="do" />
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.objectFactory.spring.autoWire" value="name" />
    <constant name="struts.i18n.encoding" value="ISO-8859-1" />
    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.configuration.xml.reload" value="false" />
    <constant name="struts.locale" value="fr" />
    <constant name="struts.multipart.maxSize" value="100000000000" />
    
    <package name="default" extends="tiles-default" namespace="/">

        <interceptors>
        
            <interceptor name="params-filter"
                class="com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor" />
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception" />
                <interceptor-ref name="alias" />
                <interceptor-ref name="servlet-config" />
                <interceptor-ref name="i18n" />
                <interceptor-ref name="chain" />
                <interceptor-ref name="model-driven" />
                <interceptor-ref name="fileUpload">
                    <param name="maximumSize">11204928</param>
                </interceptor-ref>
                <interceptor-ref name="static-params" />
                <interceptor-ref name="conversionError" />
                <interceptor-ref name="params" />
                <interceptor-ref name="prepare" />
                <interceptor-ref name="validation" />
                <interceptor-ref name="workflow" />
                <interceptor-ref name="userAware" />
            </interceptor-stack>
                    
        </interceptors>
        
        <default-interceptor-ref name="defaultStack" />

        <global-results>
            <result name="technicalError" type="chain">
                errorAction
            </result>
            <result name="sessionInvalidError" type="tiles">
                sessionInvalid
            </result>
            <result name="blank" type="tiles">blank</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception"
                result="technicalError" />
            <exception-mapping
                exception="com.omb.service.exception.UserSessionInvalidException"
                result="sessionInvalidError" />

        </global-exception-mappings>
        
        <package name="omb" extends="default" namespace="/omb">
            <action name="*OMBAction" class="com.omb.MyAction" method="doMyAction">
            <result name="ok" type="tiles">maPage</result>
        </action>
    </package>
</struts>

JSP ファイル:

<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib uri="http://displaytag.sf.net/el" prefix="display"%>
<link rel="stylesheet" href="<s:url value="/windowfiles/dhtmlwindow.css"/>" type="text/css" />



<script language="javascript"><!--
mes scripts
--></script>
<s:form action="valoriseHiddenOMBAction.do" theme="simple" id="hiddenForm">
    <s:hidden name="champ1" value="%{champ1}"></s:hidden>
    <s:hidden name="champ2" value="%{champ2}"></s:hidden>
</s:form>

<table height="100%" width="100%" border="0">
    <s:form action="doOMBAction.do" name="ombForm" id="idOmbForm" theme="simple">
        
        <s:hidden name="user.userId" value="%{user.userId}"></s:hidden>
        <s:hidden name="period.periodId" value="%{period.periodId}"></s:hidden>
        
        <tr>
            <td>
                <input  type="button"  value="download" onclick = "javascript:location.href='afficheOMBReport.do';"/>
            </td>
        </tr>
        <tr>
            <td width="10%"><label ><s:text name="champ1.label"></s:text></label></td>
            <td width="4%">&nbsp;</td>
            <td width="10%"><label ><s:text name="champ2.label"></s:text></label></td>
        </tr>
        <tr>
            <td>
                <s:select cssStyle="width:200" list="listChamp1" id="idChamp1"
                    value="champ1.identifiant" listKey="identifiant" listValue="label"/>
            </td>
            <td>&nbsp;</td>
            <td>
                <s:select cssStyle="width:200" list="listChamp2" id="idChamp2"
                    value="champ2.identifiant" listKey="identifiant" listValue="label"/>
            </td>
        </tr>
        <tr>
            <td>
                <input  type="button"  value="Afficher les valeurs" onclick = "javascript:location.href='afficheValuesOMBAction.do';"/>
            </td>
        </tr>
    </s:form>
</table>

Java ファイル:

Champ.java:

/**
 * 
 */
package com.omb;

public class Champ {

    private Integer identifiant;

    private String label;

    public Champ(Integer identifiant, String label) {
        super();
        this.identifiant = identifiant;
        this.label = label;
    }

    /**
     * @return the identifiant
     */
    public Integer getIdentifiant() {
        return identifiant;
    }

    /**
     * @param identifiant the identifiant to set
     */
    public void setIdentifiant(Integer identifiant) {
        this.identifiant = identifiant;
    }

    /**
     * @return the label
     */
    public String getLabel() {
        return label;
    }

    /**
     * @param label the label to set
     */
    public void setLabel(String label) {
        this.label = label;
    }

}

MyActionクラス:

/**
 * 
 */
package com.omb;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @author ombinte
 * 
 */
public class MyAction extends ActionSupport {

    private Champ champ1;

    private Champ champ2;

    private List<Champ> listChamp1;

    private List<Champ> listChamp2;

    public String execute() throws Exception {

        listChamp1 = new ArrayList<Champ>();
        listChamp1.add(new Champ(1, "valeur1"));
        listChamp1.add(new Champ(2, "valeur2"));

        listChamp2 = new ArrayList<Champ>();
        listChamp2.add(new Champ(3, "valeur3"));
        listChamp2.add(new Champ(4, "valeur4"));

        return SUCCESS;
    }

    public String doMyAction() {

        System.out.println("ID Champ 1 = " + champ1.getIdentifiant());
        System.out.println("Label Champ 1 = " + champ1.getLabel());
        System.out.println("ID Champ 2 = " + champ2.getIdentifiant());
        System.out.println("Label Champ 2 = " + champ2.getLabel());

        return "ok";
    }

    /**
     * @return the champ1
     */
    public Champ getChamp1() {
        return champ1;
    }

    /**
     * @param champ1 the champ1 to set
     */
    public void setChamp1(Champ champ1) {
        this.champ1 = champ1;
    }

    /**
     * @return the champ2
     */
    public Champ getChamp2() {
        return champ2;
    }

    /**
     * @param champ2 the champ2 to set
     */
    public void setChamp2(Champ champ2) {
        this.champ2 = champ2;
    }

    /**
     * @return the listChamp1
     */
    public List<Champ> getListChamp1() {
        return listChamp1;
    }

    /**
     * @param listChamp1 the listChamp1 to set
     */
    public void setListChamp1(List<Champ> listChamp1) {
        this.listChamp1 = listChamp1;
    }

    /**
     * @return the listChamp2
     */
    public List<Champ> getListChamp2() {
        return listChamp2;
    }

    /**
     * @param listChamp2 the listChamp2 to set
     */
    public void setListChamp2(List<Champ> listChamp2) {
        this.listChamp2 = listChamp2;
    }

}
4

1 に答える 1

0

を実装していないため、モデルはActionあなたのケースではクラスですModelDriven

フォームを送信するときnameは、アクション クラスの Bean のプロパティ名の値を含む属性を指定する必要があります。Bean は、OGNL を使用してparamsインターセプターを介してデータを取り込み、Bean プロパティにアクセスします。

アクション Bean にそのようなプロパティがないため、コードの非表示フィールドにはデータが取り込まれません。

name他の入力フィールドには属性がないため、入力されません。

この問題を解決するには、プロパティとアクセサーを作成して初期化する必要があります。そうすると、OGNL はそれらにアクセスしようとする NPE をキャッチできなくなります。

JSPでタグにname属性を追加します。s:select例えば

<s:select cssStyle="width:200" list="listChamp1" id="idChamp1"
  name="champ1.identifiant" listKey="identifiant" listValue="label"/>
于 2013-10-02T12:36:34.863 に答える