3

JSP プロジェクトで Spring を使用しています。

すべての HTML リクエストに対して次のマッピングがあります。

<servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
   <servlet-name>spring</servlet-name>
   <url-pattern>*.html</url-pattern>
</servlet-mapping>

したがって、各リクエストはディスパッチャーに送られます。

session.getAttribute()セッション変数をそのページに返すJSP ページがあります。

一部のユーザーがそのページに直接アクセスすると、セッション変数は null として返されます。

これを回避するために、JSP ページに次の行を追加してみました。

<%@page errorPage="error.jsp"%>

JSP ファイルはそのページと同じディレクトリにありますが、うまくいきません。次の例外が発生します: --> 404

errorPage が次のように指すように、組み合わせも試しました。

<%@page errorPage="../error.jsp"%>まだ動作していません

次に、次のようにコントローラーにエントリを追加しました。

 @RequestMapping("/xyz/result/error")
        public ModelAndView showErrorPageEng() {
            return new ModelAndView("errorpage", "command", null);
        }

質問の更新部分:

エラーページには次のタイル エントリがあります。

<definition name="errorpage" extends="basic"
    template="/error/error_layout.jsp">
    <put-attribute name="error" value="/error/error.jsp"/>  
</definition>

JSP のコードを次のように変更します。

<%@page errorPage="error.html"%>

上記のパス /xyz/result/error は次のとおりです。

ROOT/xyz/result/error

ファイルにアクセスできますmydomain/xyz/result/error.htmlが、次の例外を除いて同じことは起こりません。

として開始

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:745)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:716)
at org.apache.jsp.error_jsp._jspService(error_jsp.java:63)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:745)


**and ends as** 

    at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:220)
    at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:103)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:659)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:678)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:633)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:322)
    at org.springframework.web.servlet.view.tiles2.TilesView.renderMergedOutputModel(TilesView.java:124)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549

)

4

2 に答える 2

2

@pradeep の既存のソリューションに基づく別の解決策として、HttpServletResponse オブジェクトを使用して静的 HTML ページにリダイレクトする方法があります。

静的 HTML ページは JSP スクリプトレット ページ宣言では使用できませんが、ブラウザからアクセス可能な既存のパスは、サーバーがユーザーをリダイレクトできるものです。

このようなソリューションの利点は、HTML が Java 文字列ではなく、HTML ファイル内の本来の場所にとどまることです。これにより、Java エンジニアがコードを読み取り、Web 開発者がコードにアクセスできる、より保守しやすい環境が作成されますが、提案された回避策の上に構築されます。

ジャワ:

String  myObject= (String)session.getAttribute("finalList");

    if(myObject==null)
        {

            // redirect to the error page, using static HTML
            response.sendRedirect("/errorPage.html");
            return;

        }

errorPage.html:

<html>
<head></head>
<body>
  <div class="content">
    <div class="mainbarWH">
        <div class="article">
        <h2 class="style1">Sorry !</h2>
        <div class="clr style1"></div>
        <p class="style1">
            <strong>Your session has been expired </strong>
        </p>
        <p class="style1">Please go to <a href="engineering.html">Home</a></p>
     </div>
   </div>
   <div class="clr"></div> </div>
</body>
</html>
于 2012-05-27T20:57:19.687 に答える
2

次のように可能な回避策を見つけました。これをjspページに配置できます。わかりませんが、リターンを配置すると機能します。

String  myObject= (String)session.getAttribute("finalList");

    if(myObject==null)
        {
            out.println("<div class=\"content\">     <div class=\"mainbarWH\">       <div class=\"article\">         <h2 class=\"style1\">Sorry !</h2>         <div class=\"clr style1\"></div>         <p class=\"style1\"><strong>Your session has been expired </strong></p>         <p class=\"style1\">Please go to <a href=\"engineering.html\">Home</a></p>       </div>       </div>     <div class=\"clr\"></div> </div>");
            return;

        }

あなたが好きなjspページとしましょう

x - タイル y - タイル z - jsp ページのタイルで、null ポインター例外がタイル y で発生した場合、

次に、上記のコードはページを次のように指定します。

x -タイル y - タイル

そのため、戻って、 out.println('some html code') を実行しました

これは単なる回避策であり、まだ標準的な解決策ではありません

于 2012-05-27T20:46:25.620 に答える