web-dev-qa-db-ja.com

JSTLまたはELを使用した配列の作成

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

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

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

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

22
Alpha Carinae

新しい コレクションオブジェクトの操作 をサポートするEL 3.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.
    }

}
_

Webappの起動時にそれ自体を透過的に自動登録し、目的のデータをアプリケーションスコープに入れます。

44
BalusC

文字列内のトークンを反復処理する場合は、単に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>
22

Java EE 7/Expression Language 3.0を使用する場合、Listリテラルを作成できます。

<c:set var="alphabet" value="${['A', 'B', 'C', ... , 'Z']}" />

Arrayのように繰り返し処理できます。

5
mxxk

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

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

3
Rohit Jain

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

<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
2
wvdz

どのframeworkを使用しているかわからない場合、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}を使用してそのリストにアクセスできます。

:より複雑な処理が必要な場合は、サーブレットまたはフレームワークが提供する機能を使用する必要があります。

0