代码之家  ›  专栏  ›  技术社区  ›  Xavier Marquis

spring boot 1.4 jsp页面未计算Forward InternalViewResolver

  •  0
  • Xavier Marquis  · 技术社区  · 7 年前

    经过两天的调查,我找到了很多关于我的问题的答案,我无法解决它。 我不是spring框架的专家。

    入口点: 一年前,我生成了一个jhipster项目。我想在我的项目中嵌入jsp页面。

    我在maven项目中使用spring boot 1.4 我包括以下依赖项:

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
    

    我在WebConfigure类中创建了一个新的servlet,它实现了ServletContextInitializer。onStartup并创建了一个名为servletJsp servlet的文件。WEB-INF资源文件夹中的xml。 前缀为/mesPages/且后缀为的xml instanciate InternalViewResolver。jsp

    我还创建了一个控制器:

    @Controller
    public class TestJspController {
        @RequestMapping(value = "/jsp/bbb")
        public ModelAndView serveLog4jAdmin() {
            return new ModelAndView("log4jAdmin");
        }
    }
    

    我坚持在这里:(见下面的日志)

    日志显示:

    • 管制员很有名气
    • 它很好地返回ModelAndView
    • 从InternalResourceView“log4jAdmin”启动转发到资源[/mesPagesJsps/log4jAdmin.jsp]

    但在那之后,不要获取并呈现它,不要使用stacktrace并尝试使用另一个servlet解析jsp页面:dispatcherServlet(我相信这是自动配置和创建的defaut spring)spring servlet。 dispatcherServlet成功地获得了它,因为我已将我的文件夹mesPages(其中包含我的JSP)放在资源和webapp项目(META-INF、WEB-INF、根文件夹)的每一个地方

    最后,jsp页面没有被评估,broswer让我将其作为“应用程序/八位字节流”下载。 之前,在将jsp放在所有这些文件夹上之前,我使用相同的控制器行为,但以404错误(空白页)结束。

    我真的不明白为什么应用程序会这样。 我有另一个spring(非boot)webapp,它运行得很好。 我试图调试,但对我来说太复杂了。。。调试时,我刚刚检测到requestDispatcher无法向前调度,因为在某些“next”变量中没有类型为Forward的处理程序。 我想这就是原因。。。

    如果有人有安眠药,我会很高兴的
    我可以提供所需的任何其他信息。

    日志的相关部分:

    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'servletJSP' processing GET request for [/jsps/jsp/bbb]
    [  XNIO-3 task-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /jsp/bbb
    [  XNIO-3 task-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.web.servlet.ModelAndView fr.softeam.testify.web.rest.jsp.TestJspController.serveLog4jAdmin()]
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/jsps/jsp/bbb] is: -1
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : Rendering view [org.springframework.web.servlet.view.JstlView: name 'log4jAdmin'; URL [/mesPagesJsps/log4jAdmin.jsp]] in DispatcherServlet with name 'servletJSP'
    [  XNIO-3 task-2] o.s.web.servlet.view.JstlView            : Forwarding to resource [/mesPagesJsps/log4jAdmin.jsp] in InternalResourceView 'log4jAdmin'
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/mesPagesJsps/log4jAdmin.jsp]
    [  XNIO-3 task-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /mesPagesJsps/log4jAdmin.jsp
    [  XNIO-3 task-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/mesPagesJsps/log4jAdmin.jsp]
    [  XNIO-3 task-2] o.s.w.s.handler.SimpleUrlHandlerMapping  : Matching patterns for request [/mesPagesJsps/log4jAdmin.jsp] are [/**]
    [  XNIO-3 task-2] o.s.w.s.handler.SimpleUrlHandlerMapping  : URI Template variables for request [/mesPagesJsps/log4jAdmin.jsp] are {}
    [  XNIO-3 task-2] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapping [/mesPagesJsps/log4jAdmin.jsp] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@1774cad]]] and 1 interceptor
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/mesPagesJsps/log4jAdmin.jsp] is: -1
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : Successfully completed request
    [  XNIO-3 task-2] o.s.web.servlet.DispatcherServlet        : Successfully completed request
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   Xavier Marquis    7 年前

    因为我希望所有jsp都有一个新的路径(我知道我们也可以在controller中这样做),我担心会保留相同的servlet来服务angular frontend和jsp。 因为jhipster生成了许多参数化的类(HttpSecurity),所以我认为创建一个新的servlet(没有任何自定义参数)可能更简单,可以避免问题。

    DispatcherServlet.render()
    --> resolveViewName() qui retourne une JstlView
    --> JstlView.render()
    --> renderMergedOutputModel()
    dispatcherPath = prepareForRendering(request, response);   //  dispatcherPath = /mesPagesJsps/log4jAdmin.jsp
    RequestDispatcher rd = getRequestDispatcher() // rd.path=/mesPagesJsps/log4jAdmin.jsp   and   rd.servletChain=another DispatcherServlet !!! why ??? named dispatcherServlet, which is not my jsp servlet
    --> rd.forward()
    --> forwardImpl()
    --> response.resetBuffer()
    newServletPath = newRequestUri = /mesPagesJsps/log4jAdmin.jsp
    pathMatch.servletChain still contains wrond servlet : dispatcherServlet instead of jspServlet
    --> servletContext.getDeployment().getServletDispatcher().dispatchToPath(requestImpl.getExchange(), pathMatch, DispatcherType.FORWARD);
    --> servletInitialDispatcher.dispatchToPath()
    servletRequestContext.servletChain correspond to my servletJSP
    --> dispatchRequest( pathInfo = /mesPagesJsps/log4jAdmin.jsp, dispatcherType=FORWARD, servletChain is not my jsp servletJSP but dispatcherServlet )
    Exchange is : HttpServerExchange{ GET /mesPagesJsps/log4jAdmin.jsp request {Accept=[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8], Accept-Language=[fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3], Cache-Control=[max-age=0], Accept-Encoding=[gzip, deflate], User-Agent=[Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0], Connection=[keep-alive], Cookie=[CSRF-TOKEN=f6843de6-766d-4259-8a84-242c020420bc; JSESSIONID=VrVa7HNkUmzv_JM_cAhwyrfGWGCcrjZSltoQh2EJ], Upgrade-Insecure-Requests=[1], Host=[localhost:8080]} response {X-Application-Context=[testify_jhi:swagger,dev:8080], Content-Language=[fr-]}}
    --> servletInitialHandler.dispatchRequest()
    setCurrentServlet( WITH SERVLET dispatcherServlet and NOT servletJSP )
    --> next.handleRequest(exchange) : next is here a SessionRestoringHandler
    --> next.handleRequest(exchange) : next is here PredicateHandler. This called because a sessionId has been found ...
    --> predicate.resolve() with a predicate of type REQUEST (I think this bad) --> which return falseHandler
    --> next.handleRequest() --> with again a predicate of type REQUEST --> which return falseHandler
    --> next.handleRequest() --> with a ServletDispatchingHandler whose ServletChain is the wrong servlet : dispatcherServlet instead of servletJSP
    the dispatcher type is still FORWARD here but its to late because I thing the wrong servlet process the request
    
        2
  •  0
  •   Xavier Marquis    7 年前

    因为我希望所有jsp都有一个新的路径(我知道我们也可以在controller中这样做),我担心会保留相同的servlet来服务angular frontend和jsp。 因为jhipster生成了许多参数化的类(HttpSecurity),所以我认为创建一个新的servlet(没有任何自定义参数)可能更简单,可以避免问题。

    例如,有HttpSecurity,这是:

    public void customize(ConfigurableEmbeddedServletContainer container) {
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        // IE issue, see https://github.com/jhipster/generator-jhipster/pull/711
        mappings.add("html", "text/html;charset=utf-8");
        // CloudFoundry issue, see https://github.com/cloudfoundry/gorouter/issues/64
        mappings.add("json", "text/html;charset=utf-8");
        //mappings.add("jsp", "text/html;charset=utf-8"); // si je fais ça, en combinaisais avec le addResourcesHandler(), alors la page jsp est affichée dans le navigateur
        container.setMimeMappings(mappings);
        // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets.
        setLocationForStaticAssets(container);
    }
    
        3
  •  0
  •   Xavier Marquis    7 年前

    我最终发现并解决了这个问题(解决方案如下),它似乎与一些undertow元素有联系,defaut没有配置这些元素来初始化japser。JasperInitializer从未初始化。 如果有人想向我解释,欢迎:)

    必须在配置类中添加此代码。

    @Bean
    public TomcatContextCustomizer tomcatContextCustomizer() {
        return new TomcatContextCustomizer() {
            @Override
            public void customize(Context context) {
                context.addServletContainerInitializer(new JasperInitializer(), null);
            }
        };
    }
    
    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatContainerFactory() {
         TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
         factory.setTomcatContextCustomizers(Arrays.asList(new TomcatContextCustomizer[] { tomcatContextCustomizer() }));
         return factory;
    }
    

    另一个问题:我的spring boot应用程序中没有xml文件,只有一个: 是否可以用web-INF/servletJSP servlet替换我构建的servlet web应用程序上下文定义。xml按java/注释定义?