- PR -

?を用いないURLでパラメータを渡す方法

投稿者投稿内容
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2004-11-11 23:56
amazon.co.jp を見ていて思ったのですが、
アマゾンでは本のリンク等のURLに?が含まれていません。

これまでリンクでパラメータを渡すには、url?id=xxx といった形式しかない
と思っていたのですが、それ以外の方法もあったんですねぇ・・・。

servlet や JSP にも ? を用いないでパラメータを渡す方法があるのでしょうか?
知っている方がおられましたら、ご教授頂ければ幸いです。

よろしくお願い致します。<(_ _*)>
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-12 00:45
getParameter() メソッドでは ? で渡されたクエリやポストされたフォームデータしか受け取れません。
ただし、どのようなURLでリクエストされたかどうかは取得できますので自分でURLを分解することで同様のことは実現できます。
servlet-mappingで /somecontext/* といった形でサーブレットにマッピングすればあらゆる形式の URL でリクエストを受け取ることが出来ますので。
どんなメソッドを使う必要があるかは API リファレンスを見ましょう。
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2004-11-12 02:06
インギ様、ありがとうございます。

なるほど。自分でURLを解析すれば出来たのですね。
早速試してみた所、Servletでは思い通りに出来ました。

ところが、StrutsのActionで試してみるとうまくいきません・・・。
Strutsではやっぱり無理なんですかね〜。。。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-12 09:06
>ところが、StrutsのActionで試してみるとうまくいきません・・・。
どううまくいかないんでしょう? Servletで試したときとmappingが違うからでは?
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2004-11-12 11:48
普通の Servlet では、下記のようにすることで出来ました。
コード:

  <servlet>
     <servlet-name>test</servlet-name>
     <servlet-class>jp.hoge.TestServlet</servlet-class>
  </servlet>

  <servlet-mapping>
     <servlet-name>test</servlet-name>
     <url-pattern>/somecontext/*</url-pattern>
  </servlet-mapping>


ところが、StrutsのActionに渡すために下記のように書き換えて、
コード:

  <servlet>
     <servlet-name>action</servlet-name>
     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
     <servlet-name>action</servlet-name>
     <url-pattern>/somecontext/*</url-pattern>
  </servlet-mapping>


struts-config にも test アクションを追加しましたが、
コード:

  <action
     ……(略)
     path="/test"
     type="jp.hoge.TestAction">
     ……(略)
  </action>


http://localhost:8080/hoge/somecontext/test/id=1234 とやってみると、
HTTP Status 404 が出てしまうのです。。。

ちなみに、http://localhost:8080/hoge/somecontext/test だと、
ちゃんと TestAction が実行されるので、Struts の場合は URL が
struts-config の action path とマッチするものでないと、
受け付けてくれないのかなぁ?と思った次第です。

何か対策がありましたらご教授頂ければ幸いです。
tak3
ベテラン
会議室デビュー日: 2004/04/15
投稿数: 80
お住まい・勤務地: 菜の花・銀杏
投稿日時: 2004-11-12 13:06
うーーん。
pathにワイルドカードが使えればねぇ・・・
コード:
  <action
     ……(略)
     path="/test/*"
     type="jp.hoge.TestAction">
     ……(略)
  </action>



っていうか、結局フロントコントローラパターンなんですよね。
で、パっと思い浮かんだのが

1.org.apache.struts.action.ActionServletを拡張する。
2.自分でURLを解析するServletを登録し、strutsのActionServletへフォワードする。

の2つぐらいです。
どっちも、やったことないのでアイデアぐらいで受け止めてください。
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2004-11-12 14:04
引用:

うーーん。
pathにワイルドカードが使えればねぇ・・・



Struts 1.2.x からは使えます。
http://struts.apache.org/userGuide/building_controller.html#action_mapping_wildcards

で、クエリ文字列を使わずに何らかの値を受け渡すのは
普通の CGI やサーブレットなら PATH INFO 使いますね。
そもそも HTTP の仕様だったんじゃないかな。

Struts の場合は一筋縄にはいかないので、上に示した
ワイルドカードをうまく使うことで似たような動作を実現できます。

ただし、getPathInfo() は効かないはずなので注意。
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2004-11-12 15:46
皆さん、ありがとうございます♪

Struts1.1 を使っていたので、早速 Struts1.2.4 を落として実験してみました。

web.xml は先程とほとんど同じ。
コード:
  <servlet>
     <servlet-name>action</servlet-name>
     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
     <servlet-name>action</servlet-name>
     <url-pattern>/*</url-pattern>
  </servlet-mapping>


struts-config はワイルドカードを使えるように変更。
ちなみに最初は /test* でやったのですが、URL に / が含まれているとダメでした。
アマゾンのように / だけで区切りたかったので /test** とすると、
URL 内で / を好きなだけ使えるようになりました。

コード:
  <action
     ……(略)
     path="/test**"
     type="jp.hoge.TestAction">
     ……(略)
  </action>



後は Action で request.getPathInfo() を実行すると、/test… が
取得できるので、解析してパラメータを取り出せばOKでした。

有用な情報をありがとうございました。<(_ _*)>

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