【问题标题】:jsp errorPage not working properly with spring dispatcherjsp errorPage 无法与 spring 调度程序一起正常工作
【发布时间】:2012-06-01 17:04:03
【问题描述】:

我在我的 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>

所以每个请求都会发送到调度程序。

我有一个 JSP 页面,其中有 session.getAttribute(),它将会话变量返回到该页面。

如果某些用户直接访问该页面,则会话变量将返回为 null。

为避免这种情况,我尝试在 JSP 页面中添加以下行:

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

JSP 文件位于该页面所在的同一目录中,但没有运气。我收到以下异常:--> 404

我也尝试了一个组合,这样errorPage会指向如下:

&lt;%@page errorPage="../error.jsp"%&gt; 还是不行

然后,我在Controller中添加了一个入口如下:

 @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

)

【问题讨论】:

  • 你试过 &lt;%@page errorPage="/error.jsp"%&gt; 只用 / 吗?
  • 为此,我得到与上面相同的异常,但页面仍然空白,在 tomcat 控制台上同样的异常是宝座
  • Pradeep,框架和容器通常在比您的应用程序更低的级别记录内容,这似乎是框架/服务器抛出的错误。考虑将日志级别提高到 DEBUG 或 ALL,以便您可以看到更多关于服务器正在尝试执行的操作。我们需要知道为什么会发生错误。此外,异常与瓷砖有关。您的 error.jsp 是磁贴的一部分吗?
  • 另外,完整的错误是什么,您显示的是堆栈跟踪,而不是引发该异常的异常或行。
  • 1.是的,我正在使用磁贴,让我编辑问题,我将为错误页面添加磁贴条目,2. 例外情况是大约 70000 个字符,我不能在这里发布,即使我没有得到任何原因声明

标签: spring jsp servlets


【解决方案1】:

基于@pradeep 现有解决方案的另一种可能解决方案是使用 HttpServletResponse 对象重定向到静态 HTML 页面。

虽然静态 HTML 页面不能在 JSP 脚本页面声明中使用,但浏览器可访问的现有路径是服务器可以将用户重定向到的路径。

这种解决方案的优点是 HTML 保留在它所属的位置,在 HTML 文件中,而不是在 Java 字符串中。这创建了一个更易于维护的环境,其中代码可供 Java 工程师阅读并可供 Web 开发人员访问,但仍构建在建议的解决方法之上。

Java:

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>

【讨论】:

    【解决方案2】:

    我们找到了可能的解决方法如下,我们可以把它放在jsp页面中,我不知道但把return工作,

    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页面中的平铺 如果空指针异常出现在 tile y 中,

    然后上面的代码将页面显示为,

    x -平铺 y - 平铺

    所以在回去的时候,我们只是做了 out.println('some html code')

    这只是解决方法,还不是标准解决方案

    【讨论】:

    • +1 - 这行得通。您启发了我发布一个基于此的答案。你可能也想考虑一下。感谢您通过发布解决方案来跟进。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多