2016-12-15 9 views
0

jspを使用してselectを生成しましたが、うまく動作します。私が使用しているコードは次のとおりです。jspを使用してoptgroupで選択する

<select class="heading4Black" name="DailyTasks" onchange="showreport(this)"> 
<% 
for (int i = 0; i < links.size(); i++) { 
    elem = (Element) links.get(i); 
%> 

    <option title='<%=elem.attributeValue("tooltip") %>' value='<%= elem.attributeValue("url")%>' <%= (i == 0) ? "selected" : "" %> ><%=elem.attributeValue("name")%></option> 
<% 
} 
%> 
    </select> 

これは私に必要な出力を与えます。今、私は選択のいずれかのオプションにOPTGROUPを追加する必要があり、その代わりに、このようなオプションを選択したの:

option1 
option2 
option3 

私は私の選択になりますように、HTMLのOPTGROUP OPTION2ようにする必要があり

option1 
option2 
    subopt1 
    subopt2 
option3 

私はjstlとc:chooseを使用しようとしていましたが、これに多くの問題があります。ここで私は(およびそのバリエーション)を使用して試したコードは次のとおりです。誰かがするといくつかのガイダンスを提供することができます

Some String 
    subopt1 
    subopt2 
Option1 
Some String 
    subopt1 
    subopt2 
Option2 
Some String 
    subopt1 
    subopt2 

:私が代わりに何を得る

<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)"> 
<% 
for (int i = 0; i < links.size(); i++) { 
    elem = (Element) links.get(i); 
%> 

<c:choose> 
<c:when test="'${elem[i].attributeValue("name")}'=='Facility Ticket'"> 
<optgroup label="Some String"> 
     <option>One</option> 
     <option>Two</option> 
    </optgroup>  
</c:when>  
<c:otherwise> 
    <option title='<%=elem.attributeValue("tooltip") %>' value='<%= elem.attributeValue("url")%>' <%= (i == 0) ? "selected" : "" %> ><%=elem.attributeValue("name")%></option> 
</c:otherwise> 
</c:choose>   
<% 
    } 
    %> 
</select> 

は次のようになりますオプションで選択していますこの作品を作る方法は?私は本当にjavascriptの男だということに留意してください。私はこのjspプロジェクトを投げたことがあります。なぜなら、私は約10年前にそれに曝されていたからです。 おかげ

+0

私が探している解決策です。はいの場合は、回答を受け入れてupvoteすることができます。そうでない場合は、さらに情報を提供してください。 –

答えて

1

問題1:

あなたの出力は無視されてきたJSTLは(、そうでない場合は、選択した)ことを示唆しています。
コードは、繰り返しごとにwhenotherwiseになります。 これはおそらく、JSPの前で、この行を追加するのを忘れているためである。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

上記の行を追加することで、あなたはJSP標準タグライブラリのコアの評価を活性化させます。したがって、<c:tags>のようなタグが処理されます。それ以外の場合は、ブラウザにそのまま送信されます。
(あなたがCTRL+Uを押すことで、ブラウザ(クローム&のFirefox)でHTMLコードを見ることができます)

問題2:

あなたはおそらくコンパイルエラーが発生します、という固定した後。あなたはを通してelemにアクセスしよう

  • <c:when test="'${elem[i].attributeValue("name")}'=='Facility Ticket'"> 
    

    私が見ることができる複数の問題:インデックス[i]の必要は、すでに要素にアクセスしませんでした

    • links.get(i)によって c:whenラインはバグがあります式言語${elem...}ですが、このスクリプトレット変数が属性に割り当てられている場合のみ、これが機能します。

    スクリプトレットとソリューション:

    あなたはc:when testでスクリプトレットを使用している場合、それは次のようになります。スクリプトレットなし

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)"> 
    <% 
    for (int i = 0; i < links.size(); i++) { 
        // added Element type in front 
        Element elem = (Element) links.get(i); 
    %> 
    
    <c:choose> 
    <c:when test="<%=elem.attributeValue("name").equals("Facility Ticket")%>"> 
    <optgroup label="Some String"> 
         <option>One</option> 
         <option>Two</option> 
        </optgroup>  
    </c:when>  
    <c:otherwise> 
        <option title='<%=elem.attributeValue("tooltip") %>' 
          value='<%= elem.attributeValue("url")%>' 
          <%= (i == 0) ? "selected" : "" %> 
        > 
         <%=elem.attributeValue("name")%> 
        </option> 
    </c:otherwise> 
    </c:choose>   
    <% 
        } 
        %> 
    </select> 
    

    ソリューション。 JSTLとJSP-ELのみ:

    スクリプトレットELとJSTLを混合しています。統一されているかもしれない。

    スクリプトレットのforは、<c:forEach>に置き換えることができます。
    そして、すべてのJSP式(<%= ... %>)をEL(式言語)に置き換えることができます。
    しかしlinksが用意されている場合、まず、次のように属性を要求するように設定:アクセスする

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)"> 
        <c:forEach var="elem" items="${links}" varStatus="varStatus"> 
         <c:choose> 
          <c:when test="${elem.attributeValue('name')=='Facility Ticket'}"> 
           <optgroup label="Some String"> 
            <option>One</option> 
            <option>Two</option> 
           </optgroup> 
          </c:when> 
          <c:otherwise> 
           <option title="${elem.attributeValue('tooltip')}" 
             value="${elem.attributeValue('url')}" 
            <c:if test="${varStatus.index == 0}"> selected</c:if> 
           > 
            ${elem.attributeValue('name')} 
           </option> 
          </c:otherwise> 
         </c:choose> 
        </c:forEach> 
    </select> 
    

    お知らせvarStatus.indexの使用:JSPのように見えることができた後

    request.setAttribute("links", links); 
    

    繰り返しインデックス。

  • +0

    #1は私がすでに持っていたものに近いので、私は#1を選択しました。大きな問題は、文字列の比較でした。 '=='はjavascriptでは有効ですが、文字列はスカラーではなくオブジェクトであるため、javaでは有効ではありません。その問題をちょうど完全に見落としました。ありがとう – Lazloman

    関連する問題