2012-03-10 14 views
2

私は書き直しています。 jspからJSTL/ELまで、私は問題に直面しています。それはおそらく非常にシンプルですが、私はELに少し慣れています。ELを使って重複を避ける方法は?

final List<Person> l = new ArrayList<Person>(); 
personList.add(...); 
. 
. 
request.setAttribute("personList", l); 

そして、私の中では:

は、ここで私は、サーブレット/コントローラで

...やってんですよ。 JSP

<c:forEach var="person" items="${personList}"> 
    ${person.name} 
</c:forEach> 

しかし、私はのsetAttributeにし、のforEachで両方を使用していますので、私は "personList" を複製しています。この複製をどのように取り除くことができますか?

理想的には私は、サーブレットとの.jsp(ELを使用して、ないスクリプトレット)両方から参照できることを、パブリック静的最終列ように、定数を有するたい。

もちろん、私はこの重複を排除したい理由は、私が(「S」で)、たとえば、にpersonListの名前を変更することにした場合、私は現在、2つの事を変更する必要があるということであり、これはエラー - です易しい。私が定数を持っていれば、その変更を行う必要がある場所は1つだけです。

EDIT誰かが、定数を使用すると、定数の名前を変更した場合でも変更する場所が2つ必要であるとコメントしました。しかし、これを行うことができるかどうかには大きな違いがあります。

request.setAttribute(Constants.PERSON_LIST、l);

* PERSON_LIST *の名前を変更して、コンパイル時に改行する誤植をしました。

私が間違えた場合に中:

request.setAttribute("persnList", l); // forgetting an 'o' here 

の.jspは「personList」と入力ミスではない「persnList」を使用している場合、これはlamelyコンパイルし、実行時に失敗します。

答えて

0

本当に重複はありませんか?変数を宣言して、単一のスコープで変数にアクセスするだけです。それは完璧です。あなたがプログラムを書いて変数を宣言すると、その変数にアクセスした後、同じ問題が発生します。宣言された変数の名前を変更すると、すべての用途を見つけて変更する必要があります。

この例では、スコープは要求スコープです。したがって、要求スコープで変数名を変更する場合は、スコープ全体を調べて、同じ変数へのすべての参照を変更する必要があります。宣言とアクセスが2つの異なるファイルで行われるという事実は大きな問題ではないはずです。それは解決を必要とする問題ではなく、おそらくコードを読むのが難しくなるでしょう。

+0

私はあなたの "答え"に同意しません。間違いなく重複しているので、なぜ私の質問の終わりに説明します。 2つの場所で何かを変更する必要がありますが、スクリプトレットを使用すると、この重複を持たないことは全く些細なことです。それは変数と同じではありません。 –

+0

* "プログラムを書いて、ある行に変数を宣言した場合、後で..." * ...ある文字列を持つメソッドの1行の変数を片手で比較する、サーブレットでは、一方で、* .jsp *ではそれはありません!もう一度、スクリプトレットを使用すると、このような重複がないことは自明です。 –

+0

定数を宣言すると、どのように違うのですか?あなたは定数の名前を変更することを決めた場合でも、それを修正する必要がありますか? – Kevin

0

多分私は間違っていますが、jspsの標準的な問題は、ページが読み込まれるまでエラーが表示されないと思います。たとえ定数がこれを何とか修正したとしても、重複ではなく一般的にEL変数の欠落(すなわち実行時に動的に参照される)です。

+0

しかし、その塩の価値があるIDEは、スクリプトレットから、存在しない定数を参照しようとすると、あなたに警告しようとしています...そして、EL 3.0からは定数を参照できます:((悲しいことに私は ' Java EE 7ではまだありません) –

1

これは、従来の/基本JSP /サーブレットで作業するときに得られるものです。すべてのフロントコントローラー作業を手動で行っています。

実際のMVCフレームワークに移行します。 JSF、Spring MVC、Wicketなどのフレームワークには、単一のサーブレット(またはフィルタ)があります。フロント・コントローラは、Beanを作成して必要なスコープに入れるなどの前処理を行います。モデルとしてのjavabeansだけで作業を終了し、ビューとしてJSP/Faceletsファイルを終了します。たとえばJSFすべてのためにあなたが必要としている、その後(「自動的に」JSF自身でリクエストスコープに設定されます)、次のJavaBean:

@ManagedBean 
@RequestScoped 
public class Persons { 

    private List<Person> list; 

    @EJB 
    private PersonService service; 

    @PostConstruct 
    public void init() { 
     list = service.list(); 
    } 

    public List<Person> getList() { 
     return list; 
    } 

} 

そして、これにfaceletビュー:

<ui:repeat value="#{persons.list}" var="person"> 
    #{person.name} 
</ui:repeat> 

ない重複やまともなIDEツール(JBoss ToolsのEclipseなど)を使用する場合は、ソース>リファクタリング>名前変更を実行しても問題はありません。

+0

+1 ...この回答に感謝します。 –

関連する問題