40

Struts ベースの Web アプリケーションを使用しており、デフォルトの「ようこそ」ページをアクションにしたいと考えています。これに対して私が見つけた唯一の解決策は、ウェルカム ページをアクションへのリダイレクトを含む JSP にするバリエーションのようです。たとえば、web.xml次のようになります。

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

とでindex.jsp

<% 
  response.sendRedirect("/myproject/MyAction.action");
%> 

きっともっと良い方法があります!

4

15 に答える 15

23

個人的には、現在と同じ設定を維持しますが、転送のリダイレクトを変更します。これにより、ヘッダーをクライアントに送り返して別のリクエストを作成する必要がなくなります。

したがって、特に、私は

<% 
  response.sendRedirect("/myproject/MyAction.action");
%>

index.jspで

<jsp:forward page="/MyAction.action" />

この変更のもう 1 つの影響は、アドレス バーの URL が " http://server/myproject " から " http://server/myproject/index.jsp " に変わるのをユーザーが見ないことです。サーバー上で内部的に。

于 2008-09-04T14:31:22.697 に答える
17

これはかなり古いスレッドですが、議論されたトピックはまだ関連していると思います。これを実現するために、struts タグ - s:action を使用します。これを書いたindex.jspを作成しました...

<s:action name="loadHomePage" namespace="/load" executeResult="true" />
于 2011-01-30T12:53:32.117 に答える
11

サーブレット仕様の 2.4 バージョンでは、ウェルカム ファイル リストにサーブレットを含めることが許可されています。これは URL ではない場合があることに注意してください (/myproject/MyAction.action など)。これは名前付きサーブレットである必要があり、クエリ文字列をサーブレットに渡すことはできません。コントローラー サーブレットには、デフォルト アクションが必要です。

<servlet>
  <servlet-name>MyController</servlet-name>
  <servlet-class>com.example.MyControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>MyController</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
  <welcome-file>MyController</welcome-file>
</welcome-file-list>
于 2008-11-25T21:01:11.693 に答える
6

「確かにもっと良い方法があります!」

ありません。サーブレット仕様(Javaサーブレット仕様2.4、「SRV.9.10ウェルカムファイル」など)の状態:

このメカニズムの目的は、WebコンポーネントにマップされていないWARのディレクトリエントリに対応するURIの要求がある場合に、コンテナがURIに追加するために使用する部分的なURIの順序付きリストをデプロイヤが指定できるようにすることです。 。

Strutsはファイル拡張子を操作する必要があるため、Strutsを「/」にマップすることはできません。したがって、JSPや静的ファイルなどの暗黙的にマップされたコンポーネントを使用する必要があります。他のすべてのソリューションは単なるハックです。ですから、ソリューションを維持してください。完全に読みやすく、保守しやすく、さらに詳しく調べる必要はありません。

于 2008-09-03T21:13:38.713 に答える
6

私がやっていることは、struts アクションと同じ名前の空のファイルを置き、コンテナーをだまして struts アクションを呼び出すことです。

元。Struts アクションが welcome.do の場合は、welcome.do という名前の空のファイルを作成します。これにより、コンテナが Struts アクションを呼び出すようにだます必要があります。

于 2009-11-21T13:37:59.873 に答える
1

一般的なソリューションがすべてのコンテナで機能するとは限らないようです... http://www.theserverside.com/discussions/thread.tss?thread_id = 30190

于 2008-09-02T14:06:51.133 に答える
1

フィルターを作成し、フォワード レスポンスですべてのリクエストをルートに戻します。home.do ページを作成するハックは私には見苦しく見えます (もう 1 つ覚えておくべきことと、コードをサポートしてくれる人のために調査する必要があります)。

于 2008-09-02T21:39:32.233 に答える
1

上記の回答がありますが、Web アプリのコンテキストについては明確ではないため、次のようにします。

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>TilesDispatchServlet</servlet-name>
    <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TilesDispatchServlet</servlet-name>
    <url-pattern>*.tiles</url-pattern>
</servlet-mapping>

そして、index.jsp私はただ書く:

<jsp:forward page="index.tiles" />

そして、名前付きのインデックス定義がindexあり、すべてがうまく機能し、webapp コンテキストパスに依存しません。

于 2013-08-10T14:20:55.650 に答える
1

同じテクニックを使用した 2 つのブログ:

サーブレット API >= v2.4 が必要です。

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
    <url-pattern>/index.htm</url-pattern>    <<==  *1*
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.htm</welcome-file>   <<== *2*
</welcome-file-list>

redirect.jspそのため、WEB-INFディレクトリ以外では不要になりました!!

于 2013-03-21T15:19:01.683 に答える
0

次のように、Strut のフィルターの上にフィルターを追加するだけweb.xmlです。

<filter>
    <filter-name>customfilter</filter-name>
    <filter-class>com.example.CustomFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>customfilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

そして、その CustomFilter クラスの doFilter メソッドに次のコードを追加します

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
        FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest)servletRequest;
    HttpServletResponse httpResponse = (HttpServletResponse)servletResponse;
    if (! httpResponse.isCommitted()) {
        if ((httpRequest.getContextPath() + "/").equals(httpRequest.getRequestURI())) {
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/MyAction");
        }
        else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

Filter がアクションにリダイレクトされるようにします。JSP を WEB-INF の外側にも配置する必要はありません。

于 2013-04-09T15:01:30.210 に答える
0

OPが最良の解決策であることはほぼ確実です(ベストプラクティスについてはわかりませんが、完全に機能し、実際に私のプロジェクトリーダーと私が好む解決策です。)

さらに、次のように Spring セキュリティと組み合わせることができることがわかりました。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<sec:authorize access="isAnonymous()">
    <% response.sendRedirect("/myApp/login/login.action?error=false"); %>
</sec:authorize>
<sec:authorize access="isAuthenticated() and (hasRole('ADMIN') or hasRole('USER'))">
    <% response.sendRedirect("/myApp/principal/principal.action"); %>
</sec:authorize>
<sec:authorize access="isAuthenticated() and hasRole('USER')">
    <% response.sendRedirect("/myApp/user/userDetails.action"); %>
</sec:authorize>

これにより、ログイン フォームとなる最初のページを制御できるだけでなく、ユーザーのロールに応じて、ユーザーがログインした後のフローを制御できます。魅力のように機能します。

于 2015-11-20T11:39:48.447 に答える
0

以下のように構成しました。それは完璧に機能し、URLの変更もありません...

struts2.xml ファイルに次のようなダミー アクションを作成します。のようなアプリケーションにアクセスするたびにhttp://localhost:8080/myapp、それをダミー アクションに転送し、次に index.jsp / index.tiles... にリダイレクトします。

<action name="">
    <result type="tiles">/index.tiles</result>
</action>

タイルなし

<action name="">
    <result>/index.jsp</result>
</action>

web.xml でいくつかのアクション index.action を として構成し<welcome-file>index.action</welcome-file>、そのアクションを使用して必要なページを転送することができます...

于 2013-05-19T19:38:41.363 に答える
-1

これは同様に機能し、新しいサーブレットまたは jsp の必要性を減らします

<welcome-file-list>
<welcome-file>/MyAction.action</welcome-file>
</welcome-file-list>
于 2013-02-11T12:01:16.090 に答える
-1

これも私にとってはうまくいきました:

<welcome-file-list>
<welcome-file>MyAction.action</welcome-file>
</welcome-file-list>

ユーザーが Web アプリのルート (mywebapp/) を使用して Web アプリに入ったときに実行するデフォルト アクションを取得できませんでした。Struts 2.3.12 にはバグがあり、ルート URL を使用すると、デフォルト アクションに移動したり、ウェルカム ページを使用したりしません。これはよくあることです。Struts 2.1.8 に戻すと、問題なく動作しました。

于 2013-04-19T20:44:52.087 に答える