- PR -

JSF web.xmlの書き方

投稿者投稿内容
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2006-08-23 00:06
こんにちは。
いつもこちらのサイトにはお世話になっていますが、
書き込みは初めてとなります。
(不備がございましたらお知らせください。。)

ただ今webサイトの登録部分を作成中ですが不明部がありましたの
質問させていただきました。

1.仮登録
ユーザーはメールアドレスを登録し、
こちらではDB登録するとともにUserIDを作成。

2.ユーザーにメールを送信し、ユーザーはメールに記載された
URL(http://website/faces/touroku?userID=XXX)
(※「XXX」部分は1.で作成したuserID)
をクリックする。

3.本登録画面(tourokuNext.jsp)へ遷移する。

●touroku.java--------------------------------------
public class touroku extends HttpServlet {

protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

//値の取得
request.setCharacterEncoding("Shift_JIS");
String userID = request.getParameter("userID");

//次ページへ遷移
request.getRequestDispatcher
("/faces/jsp/tourokuNext.jsp").
forward(request,response);
}
}
-----------------------------------------------------

●web.xml--------------------------------------------

<web-app>
<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>

<!-- 登録用 -->
<servlet>
<servlet-name>tourokuX</servlet-name>
<servlet-class>website.account_touroku.touroku</servlet-class>
</servlet>

<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>

<!-- 登録用 -->
<servlet-mapping>
<servlet-name>tourokuX</servlet-name>
<url-pattern>/faces/touroku</url-pattern>
</servlet-mapping>
</web-app>
-----------------------------------------------------

このようにしたところ、userIDを取得し、tourokuNext.jsp画面の表示
もできました。
ですが、tourokuNext.jspではtouroku.javaでsetした他の値を
表示することができず、
また、画像の表示などもできません。。
HTML表記のものなどは問題なく、JSF独自の"{XXX.XXX}"形式のもの
に反応しないことから、
おそらくweb.xmlの書き方に問題があると思ったのですが。。
 <url-pattern>/faces/*</url-pattern>
 に<url-pattern>/faces/touroku</url-pattern>
 のtourokuが入れてもらってないのでしょうか??
 (/faces/の下に入れて書いてはありますが。。)

何かアドバイスをくださいます方がおりましたら、是非ご教授をお願い致します。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-08-23 09:08
引用:

しま太郎さんの書き込み (2006-08-23 00:06) より:
●touroku.java--------------------------------------
public class touroku extends HttpServlet {

protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

//値の取得
request.setCharacterEncoding("Shift_JIS");
String userID = request.getParameter("userID");

//次ページへ遷移
request.getRequestDispatcher
("/faces/jsp/tourokuNext.jsp").
forward(request,response);
}
}



setしている箇所がないように見受けられますが…。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-08-23 10:03
引用:
このようにしたところ、userIDを取得し、tourokuNext.jsp画面の表示
もできました。


ということは、touroku.javaも呼ばれているし、FacesServletもちゃんと呼ばれているように思いますので、web.xmlの問題ではないのでは?
(FacesServletが呼べていないと、tourokuNext.jspのf:viewのところでヌルポがおきるはずです)

引用:
ですが、tourokuNext.jspではtouroku.javaでsetした他の値を
表示することができず、
また、画像の表示などもできません。。
HTML表記のものなどは問題なく、JSF独自の"{XXX.XXX}"形式のもの
に反応しないことから、


このあたりの状況をもう少し説明して下さい。
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2006-08-23 10:04
スミマセン!!分かりづらく書いてしまいました。。
上記の記載部分には全文を載せてはおりません。
該当箇所のみを載せてあります。

touroku.javaには入力表示テスト用に
private String message;
(message のget-set)

this.setMessage("テスト");

を入れてあります。
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2006-08-23 10:27
ご返答、ありがとうございます!

引用:

touroku.javaも呼ばれているし、FacesServletもちゃんと呼ばれているように思いますので、web.xmlの問題ではないのでは?
(FacesServletが呼べていないと、tourokuNext.jspのf:viewのところでヌルポがおきるはずです)


そうなのですか!…見当違いでした。。
訓えてくださって、ありがとうございます!

引用:

引用:

tourokuNext.jspではtouroku.javaでsetした他の値を
表示することができず、また、画像の表示などもできません。。
HTML表記のものなどは問題なく、JSF独自の"{XXX.XXX}"形式のもの
に反応しないことから、


このあたりの状況をもう少し説明して下さい。


ページ自体は表示されます。
ですが、下記のものが表示されません。
 ・画像 <h:graphicImage url="image/rogo.gif" />
 ・touroku.java にセットした値の出力
   <h:outputText value="#{touroku.message}" />
  (touroku.javaで
     System.out.println("●message="+this.getMessage());
   をした所、[テスト]と値が入っていましたが、JSPではそれは表示
   されませんでした。)

直接書き込まれた文字・表などは普通に表示されます。

また、画像に関しては
 http://website/faces/jsp/tourokuNext.jsp
と、直接アドレスバーに打ち込むときちんと表示されます。

値の出力は、
 JSPに、
 <h:outputText value="#{touroku.message}" />
 <h:inputText value="#{touroku.message}" />
 を書き、空白になっていたInputの方へ[aaa]とインプットしたところ、
 Outputの方に[aaa]と出ました。
 "{XXX.YYY}"の入力ミスではなさそうです。

JSPの方の書き方は問題ないと思うのですが。。
サーブレットが間違っているのでしょうか。。

web.xmlが違うと分かったのでまた色々と調べてみます。
ご丁寧なアドバイスをいただき、ありがとうございます!

[ メッセージ編集済み 編集者: しま太郎 編集日時 2006-08-23 10:43 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-08-23 11:08
えーと、touroku.javaは独立したサーブレットとして登録されているために、JSFとは
無関係に動いているように思います。したがってそのサーブレットからフォワード
されてもJSFのタグを使っている部分がちゃんと動いていないのではないでしょうか。

もし、JSFとして動作しているとすると、touroku.javaがManaged Beanとして登録されて
いる、ということでしょうか。JSP側の書き方を見るとそのように期待しているように
見えます。そうだとすると、doGetは実行されないのではないでしょうか。

よしださんは両方動いている、と書かれていますが、そんなことが可能なのでしょうか?
少なくともサーブレットとしては、どちらかしか動かないと思いますが。
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2006-08-23 11:37
書き込み、ありがとうございます!
引用:

えーと、touroku.javaは独立したサーブレットとして登録されているために、JSFとは
無関係に動いているように思います。したがってそのサーブレットからフォワード
されてもJSFのタグを使っている部分がちゃんと動いていないのではないでしょうか。


そうなのでしょうか…
はじめはそのように思っていたのですが、…やはりそうなのでしょうか。。

URL(http://website/faces/touroku?userID=XXX)
から値をgetしたいのですが、そうするとtouroku.javaのようになり、
web.xmlであのような記述をしてしまいました。
他にURLから値をgetしてJSFで動かす方法はあるのでしょうか。。
もし丁度良い方法をご存知の方がいらっしゃいましたらご教授ください。
よろしくお願いします。。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-08-23 13:19
まず、現象は以下の通りだと思います。
<servlet>
<servlet-name>tourokuX</servlet-name>
<servlet-class>website.account_touroku.touroku</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>tourokuX</servlet-name>
<url-pattern>/faces/touroku</url-pattern>
</servlet-mapping>
の定義があるので、http://website/faces/touroku?userID=XXXはwebsite.account_touroku.tourokuによって処理されます。
このときのコンテキストは/facesになっています。

次にtouroko.doGetの中で"/faces/jsp/tourokuNext.jsp"にdispatchしています。
これは/faces/faces/jsp/tourokuNext.jspへのdispachになるのではないかと思います。

これは
<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>
という定義にしたがってjavax.faces.webapp.FacesServletによって処理されます。
このときコンテキストパスは"/faces/faces"になっているのではないかと思います。
だからurl="image/rogo.gif"が見つからないのでは?
現在のコンテキストパスを見るには以下のタグを入れてみると良いでしょう。
<h:outputText value="#{facesContext.externalContext.requestContextPath}"/>

#{touroko.message}が取れないのは、tourokuをマネージドビーンにしていないからです。
マネージドビーンはHttpServletではなくてJavaBeansです。そのあたりはもう少し勉強して下さい。

現象の説明は以上。

さて、パラメタをJSFのバリューバインディング式の中で使いたいのであれば、
#{param.userID}で取れます。

また、マネージドビーンのメソッドの中で使いたいのであれば、
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userID")
のように取り出すことができます

#今、手元に動作環境がないので、上記の例は未確認です。タイポがあったら勘弁!

スキルアップ/キャリアアップ(JOB@IT)