-2

これは私がやりたいことです:

サーブレットが呼び出されます。サーブレットが呼び出される前に、リクエストはフィルタによってインターセプトされます。フィルターはリクエストから詳細を取得し、それらを属性として設定し、それを 経由でサーブレットに転送しますchain.doFilter(request,response)。リクエストは最終的にサーブレットに到達します。サーブレットは、以前にフィルタで設定された属性を取得し、別の名前で新しい属性を設定します。次に、ページが属性を取得して処理するjspページに転送します。

これを行うにはどうすればよいですか? フィルターとサーブレットを作成する方法は知っていますが、それをサーブレットから JSP ページに転送するにはどうすればよいですか、またはこれを実現する他の方法はありますか?

4

2 に答える 2

1

RequestDispatcher.forwardサーブレットからメソッドを使用できます。

public class YourServlet extends HttpServlet {

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

        RequestDispatcher rd = getServletConfig().getServletContext()
                      .getRequestDispatcher("/yourJsp.jsp");
        rd.forward(request, response);
    }
}

javaee 5 チュートリアルも参照してください

編集: Tomcat 7の例でこのアプローチをテストしました:

  • サンプルタイミングフィルターを有効にしました
  • servletToJsp の例を呼び出しました (この例では、サーブレットが jsp に転送されます)。

すべてが完璧に機能します。フィルターはその役割を果たしており、例外はありません。

問題があったことを最初から明記し、スタックトレースなどを提供する必要があります。

コメントの質問について:

request.getRequestDispatcher ではないのはなぜですか?

私が提供した例では、絶対パスを呼び出しているため、違いはありません。request.getRequestDispatcher相対パスを扱う場合に便利です。このSOの質問を参照してください。

編集2:

フィルター、サーブレット、jsp を含むソースを添付しています。

フィルター:

package tests.filters;

import javax.servlet.*;
import java.io.IOException;

public final class ExampleFilter implements Filter {

    private String attribute = null;

    private FilterConfig filterConfig = null;

    @Override
    public void destroy() {
        this.attribute = null;
        this.filterConfig = null;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain)
        throws IOException, ServletException {

        if (attribute != null)
            request.setAttribute(attribute, this);

        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long stopTime = System.currentTimeMillis();

        filterConfig.getServletContext().log
            (this.toString() + ": " + (stopTime - startTime) +
                    " milliseconds");
    }

    @Override
    public void init(FilterConfig fConfig) throws ServletException {

        this.filterConfig = fConfig;
        this.attribute = fConfig.getInitParameter("attribute");
    }

    @Override
    public String toString() {
        if (filterConfig == null)
            return ("TimingFilter()");
        StringBuilder sb = new StringBuilder("TimingFilter(");
        sb.append(filterConfig);
        sb.append(")");
        return (sb.toString());

    }
}

サーブレット:

package tests.servlets;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletToJsp extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void doGet (HttpServletRequest request,
                   HttpServletResponse response) {
        try {
            request.setAttribute ("servletName", "servletToJsp");
            getServletConfig().getServletContext().getRequestDispatcher(
                    "/jsp/jsp-to-servlet/hello.jsp").forward(request, response);
        } catch (Exception ex) {
            ex.printStackTrace ();
        }
    }
}

JSP:

<html>
    <body bgcolor="white">

    <h1>
    I have been invoked by
        <% out.print (request.getAttribute("servletName").toString()); %> Servlet.
   </h1>

</html>

web.xml

<web-app 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_3_0.xsd"
     version="3.0"
     metadata-complete="true">

<filter>
    <filter-name>Timing Filter</filter-name>
    <filter-class>tests.filters.ExampleFilter</filter-class>
    <init-param>
        <param-name>attribute</param-name>
        <param-value>tests.filters.ExampleFilter</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>Timing Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>ServletToJsp</servlet-name>
    <servlet-class>tests.servlets.ServletToJsp</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ServletToJsp</servlet-name>
    <url-pattern>/servletToJsp</url-pattern>
</servlet-mapping>
</web-app>

戦争としてパッケージ化された例を含むダウンロード リンクも提供します: http://goo.gl/GaV5w (7 日間利用可能)

tomcat 7の webapps ディレクトリにファイルをコピーし、ブラウザから次のように呼び出しますhttp://localhost:8080/webapp-javaee6-1.0-SNAPSHOT/servletToJsp。フィルターが処理時間を出力し、jsp がその内容を表示することが、logs/localhost.currentDate.log ファイルに表示されます。

このアプローチが機能し、問題 (問題がある場合) が別の場所にあることを納得させるために、これ以上何もできません。

于 2012-09-08T07:06:01.427 に答える
0

はい、ワイルドカードを指定すると。これは、すべてのリクエストに対して、フィルターが最初にリクエストをインターセプトすることを意味します。セキュリティを導入する必要がある本格的な Web アプリケーションで、このシナリオを実際に想像することができます。最も単純な形式では、ユーザーを承認するセキュリティ フィルターを記述します。したがって、すべてのリクエストに対して最初にセキュリティ フィルタが呼び出されるように、マッピングを汎用として指定できます。すでに応答をコミットしている場合、IllegalState 例外が発生します。コードは正常に動作していますか? それでも機能しない場合は、コードを投稿してください。HTH、ベン

于 2012-09-10T11:18:38.473 に答える