29

Java とそのフレームワーク (Spring 3.1.1) を使用して Web アプリケーションに取り組んでいます。そして、スクリプトレットの使用をできるだけ避けようとしていますが、これ以外に配列を定義する方法が見つかりません。

<%
    String[] alphabet = {"A", "B", "C", ... , "Z"};
    pageContext.setAttribute("alphabet", alphabet);      
%> 

pageContext 属性を設定したら、 で使用できます${alphabet}。しかし知りたいのですが、プレーンな JSTL/EL を使用して配列を作成することは可能ですか?

更新:この配列を使用してリンクを作成しています。たとえば、ユーザーが「S」をクリックすると、名前が「S」で始まる従業員のリストが表示されます。そのため、リンクを 1 つずつ作成する代わりに、反復しています${alphabet}

4

6 に答える 6

53

コレクションオブジェクトの新しい操作をサポートするEL3.0(Tomcat 8以降、WildFly 8以降、GlassFish 4以降、Payara 4以降、TomEE 7以降など)を既に使用している場合は、${[...]}構文を使用してリストを作成できます。${{...}}セットを構築するための構文。

<c:set var="alphabet" value="${['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']}" scope="application" />

EL 3.0をまだ使用していない場合は、${fn:split()}コンマなどの一般的な区切り文字で個々の文字を区切る単一の文字列に対して関数トリックを使用してください。

<c:set var="alphabet" value="${fn:split('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z', ',')}" scope="application" />

ただし、これには通常のJavaコードを使用する方がよいことに同意します。明らかに静的なデータであるため、次のリスナークラスを作成するだけです。

@WebListener
public class ApplicationData implements ServletContextListener {

    private static final String[] ALPHABET = { "A", "B", "C", ..., "Z" };

    @Override
    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("alphabet", ALPHABET);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP.
    }

}

Webアプリの起動時に透過的に自動登録され、必要なデータがアプリケーションスコープに配置されます。

于 2013-01-22T15:08:41.407 に答える
27

文字列内のトークンを反復処理する場合は、次を使用しますforTokens

<c:set var="alphabet">A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z</c:set>

<c:forTokens items="${alphabet}" delims="," var="letter">
    ${letter}
</c:forTokens>
于 2013-08-12T10:32:13.933 に答える
3

JSP は、この種のものを対象としていません。それらは作成するのではなく、消費することを意図しています。配列を作成する場合は、おそらくServlethere が必要です。

サーブレットに配列作成 (またはリスト作成) のロジックを追加し、それを使用して JSP ページへのリクエストを前処理します。次に、ページListで に設定された属性を使用できservletますJSP

于 2013-01-22T09:23:12.343 に答える
3

純粋な EL ではありませんが、それでもかなりクリーンなソリューションです。

<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
于 2015-03-27T09:03:36.967 に答える
2

使用しているフレームワークがわからない場合、スクリプトレットを使用せずにJSPを操作する最善の方法は、すべてのJSP(ビュー)をJava Bean(オブジェクト)でバックアップすることです。

バッキングビーン:

public class MyBackingBean {

   private List<String> alphabet;

   public List<String> getAlphabet() {
      if (alphabet == null) {
         // Using lazy initialization here, this could be replaced by a
         // database lookup or anything similar
         alphabet= Arrays.asList(new String[]{ "A", "B", "C", ... });
      }
      return alphabet;
   }

}

次に、JSPでBeanを次のようにインスタンス化します。

<jsp:useBean id="backingBean" scope="page" class="com.example.MyBackingBean" />

その後、EL${backingBean.alphabet}を使用してそのリストにアクセスできます。

:より複雑な処理が必要な場合は、サーブレットまたは任意のフレームワークによって提供される機能のいずれかを使用する必要があります。

于 2013-01-22T10:07:39.223 に答える