2010-11-24 19 views
3

クライアントから送信されたパラメータを使用してサイトのコンテキストを変更する必要があります。JSF - URLパラメータを取得し、ページ - サーブレットを選択しますか?

たとえば、私がhttp://localhost:8084/JSF/と呼んだ場合、テンプレートの「ホームページ」ページ(デフォルト)を使用して、通常のindex.xhtmlをロードします。 http://localhost:8084/JSF/index.xhtml?page=profileと呼んだ場合、index.xhtmlにある種類のスイッチが必要で、contentエリアにプロファイルテンプレート(またはプロファイルを定義するページ)を挿入/挿入してください。

サーブレットを管理する必要があると思います。なぜなら、私はindex.xhtmlに一種のswithを作成できるとは思わないからです。だから私は別のテンプレートの代わりにいくつかのテンプレートを読み込む必要があると思う。

どのサーブレットを使用する必要がありますか?または、これを行うために私自身のサーブレットを作成する必要がありますか?

乾杯

(BalusCの提案後に添加)UPDATE

package Beans; 

import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(name="selector") 
@ManagedProperty(value="#{param.page}") 
public class Selector { 
    private String page; 

    public String getPage() { 
     return page; 
    } 

    public void setPage(String page) { 
     this.page = page; 
    } 

} 

template.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html"> 

    <h:head> 
     <title><ui:insert name="title">Facelets Template</ui:insert></title> 
    </h:head> 

    <h:body> 
     <ui:insert name="login_homepage">Box Content Here</ui:insert> 

     <ui:insert name="content_homepage">Box Content Here</ui:insert> 
    </h:body> 
</html> 

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<ui:composition template="./template.xhtml" 
       xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core"> 
    <ui:define name="title"> 
     // title 
    </ui:define> 

    <ui:define name="login_homepage"> 
     // login 
    </ui:define> 

    <ui:include src="#{selector.page}.xhtml" /> 

    <ui:define name="content_homepage"> 
     // content 
    </ui:define> 
</ui:composition> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

profile.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h2>PROFILE</h2> 
</ui:composition> 
+0

'jsf-2.0'と' facelets'をタグとして追加しました。これはあなたが以前使っていた質問に基づいています。将来的には、Faceletsの代わりに古いJSF 1.xやJSPを使用していたときの答えが全く異なるため、該当する場合はいつでも自分自身を追加してください。 – BalusC

+0

ああ!申し訳ありません、病気: – markzzz

答えて

9

リクエストパラメータは@ManagedPropertyによってJSFビーンに設定可能です。

@ManagedProperty(value="#{param.page}") 
private String page; 

(これは基本的にBeanの建設後、直接bean.setPage(request.getParameter("page"))を行います)

あなたはFaceletsの<ui:include>でELを使用することができます。

<ui:include src="#{bean.page}.xhtml" /> 

bean.getPage()戻りprofile場合、値はprofile.xhtmlとして終わるし、それに応じて含まれます)

レガシーサーブレットの必要がありません:)


更新:あなたは」アノテーションを間違った場所に設定してください。それはまさに私のオリジナルの答えのように、次のようになります。デフォルト値はすでに(手動で指定したとまったく同じである)小文字1文字とクラス名であるので、私は@ManagedBean名を省略

package beans; 

import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

@ManagedBean 
@RequestScoped 
public class Selector { 

    @ManagedProperty(value="#{param.page}") 
    private String page; 

    public String getPage() { 
     return page; 
    } 

    public void setPage(String page) { 
     this.page = page; 
    } 

} 

注意を。また、@RequestScoped注釈を追加して、Beanスコープを指定しました。パッケージ名の大文字は標準Java Naming Conventionsで禁止されているため、パッケージ名も小文字にしました。

<managed-bean>faces-config.xmlは、新しいJSF 2.0アノテーションを使用したentirely superfluousです。あなたは基本的にそれを複製しています。それを除く。


アップデート2index.xhtmlこの

<!DOCTYPE html> 
<html lang="en" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 
    <h:head> 
     <title>Include demo</title> 
    </h:head> 
    <h:body> 
     <h1>This is the index page</h1> 
     <c:catch> 
      <ui:include src="#{selector.page}.xhtml" /> 
     </c:catch> 
    </h:body> 
</html> 

のようになります(<c:catch>は、そのようなファイルがありませんたびFileNotFoundExceptionを抑制することがあります)

include.xhtmlはなっているはずですこのように:

<!DOCTYPE html> 
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h2>Include page content</h2> 
</ui:composition> 

FacesServlet*.xhtmlurl-patternに聴いていると、両方のファイルが同じフォルダにあると仮定すると、index.xhtml?page=includeことによってそれを開きます。更新問題の

+0

一部のパラメータ値でページを読み込もうとしましたが、まだ動作しません。 web.xmlにいくつかの問題があると思われます... – markzzz

+0

beanスコープも設定しましたか?それは '@ RequestScoped'でなければなりません。あなたは質問の更新でそれを省略しました、私は私の答えの更新でそれを追加しました。 'web.xml'に関しては、最小限のエントリは' FacesServlet'でなければなりませんが、他のJSFページがうまくいけばOKです。あなたが '404リソースが見つかりません'または 'RuntimeException:FacesContextを見つけることができません 'を取得した場合にのみ問題になります。 – BalusC

+0

あなたはiveがそれを追加しました。しかし、今私のプロジェクトでは何も働かないようです。私はあなたの提案(はい、私のfalut)と今は何も働かないようにパッケージの名前を変更しました。私はいくつかのテストをしようとします... arghh – markzzz

0

、次の行が順不同である:

@ManagedBean(name="selector") 
@ManagedProperty(value="#{param.page}") 
public class Selector { 
    private String page; 

それはこのようになります。

@ManagedBean(name="selector") 
public class Selector { 
    @ManagedProperty(value="#{param.page}") 
    private String page; 
+0

それはすでに他の答えによってカバーされていた:) – BalusC

0

の問題は、あなたが動的にインクルードされるファイル内のコマンドボタンを持っている場合、 commandButtonは機能しません。アクションルーチンは呼び出されません。私はまだ を試していますが、これはMojarra 2.1でも解決策が見つかりません。