2012-02-16 39 views
5

フォーム変数を奇妙に扱っています。とにかく私はいくつかのデータベースのものを行うことができるように、要求から変数を取得することができました。今私は元に戻って投稿したいので、選択ボックスには元の選択肢が取り込まれます。ここでname="filterCriteria('CONDITION_CODE').valuesデフォルトの名前空間が指定されていない場合は、接頭辞とともに関数 ""を使用する必要があります。

フォームされています:形式の関数であるあなたが名前を見ることができるように

Condition Code:  
<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
    <option value="">&nbsp;</option> 
    <c:forEach var="bean" items="${conditions}"> 
    <option value="'${bean.code}'"<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
    </c:forEach> 
</select> 
<input type="hidden" name="filterCriteria('CONDITION_CODE').fieldName" value="CONDITION_CODE"/> 
<input type="hidden" name="filterCriteria('CONDITION_CODE').operation" value="="/> 

JSP:ここ

は、選択フィールドの一例である

private String[] fieldNames; 

private Map<String, FilterCriteriaForm> filters = 
    new HashMap<String, FilterCriteriaForm>(); 




public String[] getFieldNames() { return this.fieldNames; } 
    public Map<String, FilterCriteriaForm> getFilters() { return this.filters; } 



    public FilterCriteriaForm getFilterCriteria(String fieldName) 
    throws ServletException 
{ 
    FilterCriteriaForm filter = (FilterCriteriaForm)filters.get(fieldName); 

    if (filter == null) 
    { 
     filter = new DetFilterCriteriaForm(requestAction); 
     filters.put(fieldName, filter); 
    } 

    return filter; 
} 


    public void setFilters(Map<String, FilterCriteriaForm> val) { this.filters = val; } 
    } 

とにかく通常はフィールドを設定するためにjspでこれを行いますバックの形であるものに:私はこれを行うと"<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>

...私はこのエラーを取得する:

The function filterCriteria must be used with a prefix when a default namespace is not specified

編集:

Condition Code:&nbsp;<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
       <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
         <option value="">&nbsp;</option> 
         <c:forEach var="bean" items="${conditions}"> 
         <option value="'${bean.code}'" <c:if test="${bean.code == param[condition]}">selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
         </c:forEach> 
         </select> 
         <input type="hidden" name="filterCriteria('CONDITION_CODE').fieldName" value="CONDITION_CODE"/> 
         <input type="hidden" name="filterCriteria('CONDITION_CODE').operation" value="="/> 
         <br/></br> 

これは....私を働いWHAT ISフォームをもう一度見てみましょう...単一引用符を取り出してgetFilters()を使用しました:

<select size="1" name="filterCriteria(CONDITION_CODE).values"> 
      <option value="">&nbsp;</option> 
       <c:forEach var="bean" items="${conditions}">  
       <c:set var="code" value="'${bean.code}'" />  
       <option value="${code}" <c:if test='${code == form.filters["CONDITION_CODE"].values[0]}'>selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
       </c:forEach> 
       </select> 

答えて

5

rmと入力要素のような無効な名前ですか?

とにかく、あなたの具体的なの問題は、プレーンな文字列ではなくELオブジェクトと比較しているということです。今のように、のメソッドfilterCriteria(String)を持つbeanが、getValues()というメソッドを持つオブジェクトを返すことを期待しています。それはあなたが望むものではありません。あなたは普通の文字列にしたい。

は、次のようにあなたがそれを引用する必要があり、それを修正:

<c:if test="${bean.code == 'form.filterCriteria(\'CONDITION_CODE\').values'}"> 

しかし、これはあなたが機能要件を実現させません。 Java/JSPとJavaScriptを混同して、それらが同期して動作することを期待しているようです。これは当てはまりませんが、Java/JSPはWebサーバーで実行され、HTMLを生成します。 JavaScriptはHTMLの一部であり、Webブラウザでのみ動作します。 form変数は、JSTLタグではなく、JavaScriptでのみ使用できます。

実際にはは、提出された値をリクエストパラメータとして${param}で取得する必要があります。すべての入力要素の値は、要求パラメータマップの名前によって使用できます。それは次のようになり、次のとおりです。

<c:if test="${bean.code == param['filterCriteria(\'CONDITION_CODE\').values']}"> 

をそれがうまくいくならば、私は唯一の私は、無効な文字を含む名前を使用したことがない、あなたはおそらく奇妙な文字をエンコードURLする必要が、保証するものではありません。あなたのフォームと入力要素にHTML specificationの規則に合致する有効な名前を入力すれば、はるかに簡単です。

<select name="condition"> 
    <option value="">&nbsp;</option> 
    <c:forEach items="${conditions}" var="condition"> 
    <option value="${condition.code}" ${condition.code == param.condition ? 'selected' : ''}>${condition.code}:&nbsp;${condition.description}</option> 
    </c:forEach> 
</select> 

(あなたが<option value>で無効な値を持っていた、それらのsinglequotesが属していないことに注意してください、私はそれらを削除した)


更新:コメントのとおり、 ELの不正なパラメータ名にアクセスするときに、EL構文エラーの問題があるようです。エスケープ文字\は、ELパーサーによって完全に飲み込まれたようです。あなたの最善の策は<c:set>でそれをエイリアスし、おそらくです:

<c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
... 
<c:if test="${bean.code == param[condition]}"> 

アップデート2:オプション値の周りの人々singlequotesは絶対に必要であるように見えます。その場合、別のエイリアスを追加する必要があります。完全なコードは次のようになります:

<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
    <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
    <option value="">&nbsp;</option> 
    <c:forEach var="bean" items="${conditions}"> 
    <c:set var="code" value="'${bean.code}'" /> 
    <option value="${code}" <c:if test="${code == param[condition]}">selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
    </c:forEach> 
</select> 
関連する問題