Spring MVC 注释。 + Jetty 9 + 查看解析器 - 找不到 jsp 页面
Posted
技术标签:
【中文标题】Spring MVC 注释。 + Jetty 9 + 查看解析器 - 找不到 jsp 页面【英文标题】:Spring MVC Annot. + Jetty 9 + View Resolvers - Can't find jsp page 【发布时间】:2014-11-06 00:27:52 【问题描述】:在然而之前已经提出了这个问题,给出的答案要么对我不起作用,要么答案完全回避了这个问题,转而支持不同的基本示例。
我正在尝试使用嵌入在 Jetty 实例中的 Spring MVC servlet 的简单基本示例。我的控制器正在接收页面请求并返回正确的视图名称。正是在寻找 jsp 页面时失败了。我相信,问题在于 Servlet 映射,基于我看到的其他答案,但在我的情况下我看不到解决方案。
Jetty 服务器设置:
public JettyServer(int port) throws JettyServerException
webServerPort = port;
webServer = new Server(webServerPort);
webServer.setStopAtShutdown(true);
try
webServer.setHandler(getServletContextHandler(getContext()));
catch (IOException e)
throw new JettyServerException("Cannot instantiate JettyServer instance", e);
private ServletContextHandler getServletContextHandler(WebApplicationContext context) throws IOException
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setContextPath("/");
contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), "/");
contextHandler.addEventListener(new ContextLoaderListener(context));
contextHandler.setResourceBase(new ClassPathResource("webapp").getURI().toString());
return contextHandler;
private WebApplicationContext getContext()
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.company.webapptemplate.config");
return context;
在包com.company.webapptemplate.config
下找到的Web App配置类:
@Configuration
@EnableWebMvc
@ComponentScan("com.company.webapptemplate.controller")
public class WebMvcConfig extends WebMvcConfigurerAdapter
@Bean
public UrlBasedViewResolver setupViewResolver()
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
控制器代码:
@Controller
@RequestMapping("/")
public class ApplicationController
@RequestMapping(method = RequestMethod.GET)
public String welcome(ModelMap model)
return "index";
运行 maven / IntelliJ 构建后 target/classes
下的非 Java 类:
|____webapp
| |____WEB-INF
| | |____views
| | | |____index.jsp
| | |____web.xml (unused)
在 IntelliJ 中运行应用程序后将浏览器指向 localhost:8080 时的响应:
Problem accessing /WEB-INF/views/index.jsp. Reason:
Not Found
还有我不知道该怎么办的日志中的确凿证据:
2014-09-11 23:12:54 调试 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping:297 - 查找路径 /WEB-INF/views/index.jsp 的处理程序方法 2014-09-11 23:12:54 调试 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping:305 - 未找到 [/WEB-INF/views/index.jsp] 的处理程序方法 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - 在名为 'org.springframework 的 DispatcherServlet 中测试处理程序映射 [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@5ddbd0c7]。 web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.handler.AbstractUrlHandlerMapping:127 - 未找到 [/WEB-INF/views/index.jsp] 的处理程序映射 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - 在 DispatcherServlet 中测试处理程序映射 [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@a67e8f5],名称为 ' org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - 在 DispatcherServlet 中测试处理程序映射 [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@2bef3229],名称为 ' org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - 在 DispatcherServlet 中测试处理程序映射 [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@64c63847],名称为 ' org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 WARN org.springframework.web.servlet.DispatcherServlet:1120 - 在名为 'org. springframework.web.servlet.DispatcherServlet-44175c06'如果有人能告诉我我错过了哪一块拼图,我将不胜感激。
谢谢。
【问题讨论】:
你确定你的servlet映射是/
而不是/*
吗?
您目前基本上没有 JSP 支持,因此对*.jsp
的请求默认为您无法处理的DispatcherServlet
。我不知道如何用 jetty 做到这一点,但你一定要研究 JSP 集成是如何工作的。
【参考方案1】:
Sotirios 的评论推动了我前进——如何让 Jsp 处理 servlet 进入嵌入式 Jetty....
在getServletContextHandler
中,我将 contextHandler 的实例化更改为现在的WebAppContext
。所有相同的方法都适用于此。
然后我创建了这个方法来获取返回的 WebAppContext 并设置 Jsp 处理(sn-p 取自这里:https://github.com/jetty-project/embedded-jetty-jsp/blob/master/src/main/java/org/eclipse/jetty/demo/Main.java)
private void setupJspHandler(WebAppContext context)
//Ensure the jsp engine is initialized correctly
JettyJasperInitializer sci = new JettyJasperInitializer();
ServletContainerInitializersStarter sciStarter = new ServletContainerInitializersStarter(context);
ContainerInitializer initializer = new ContainerInitializer(sci, null);
List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>();
initializers.add(initializer);
context.setAttribute("org.eclipse.jetty.containerInitializers", initializers);
context.addBean(sciStarter, true);
// Set Classloader of Context to be sane (needed for JSTL)
// JSP requires a non-System classloader, this simply wraps the
// embedded System classloader in a way that makes it suitable
// for JSP to use
ClassLoader jspClassLoader = new URLClassLoader(new URL[0], this.getClass().getClassLoader());
context.setClassLoader(jspClassLoader);
// Add JSP Servlet (must be named "jsp")
ServletHolder holderJsp = new ServletHolder("jsp",JspServlet.class);
holderJsp.setInitOrder(0);
holderJsp.setInitParameter("logVerbosityLevel","INFO");
holderJsp.setInitParameter("fork","false");
holderJsp.setInitParameter("xpoweredBy","false");
holderJsp.setInitParameter("compilerTargetVM","1.7");
holderJsp.setInitParameter("compilerSourceVM","1.7");
holderJsp.setInitParameter("keepgenerated","true");
context.addServlet(holderJsp, "*.jsp");
我在我的 maven pom 中导入了以下内容:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>$jetty.version</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>$jetty.version</version>
</dependency>
并且还不得不关闭我的日志记录,因为 servlet 初始化程序的运行在检查整个类路径时转储了 WebApplicationInitializer 扫描的日志记录,尽管其他问题和页面似乎给出了一些关于如何处理这个问题的提示,因为例子……
https://jira.codehaus.org/browse/JETTY-1503
现在它像美女一样工作。
谢谢
【讨论】:
不要忘记创建/添加DefaultServlet
到您的 servlet 链的末尾。 (也要注意 servlet 名称)。 JspServlet 出于自己的原因需要它。
当你说链的末端,你的意思是把它作为最后一个 addServlet,还是别的什么?关于 servlet 名称,我需要注意什么? DispatcherServlet 设置是否有问题?
在那个 embedded-jetty-jsp 演示项目(码头项目放在一起)中有一个 code snippet 你可以使用。它是 Servlet 规范的一个重要方面,在您修复它之前,您最终会偶然发现许多奇怪的错误。以上是关于Spring MVC 注释。 + Jetty 9 + 查看解析器 - 找不到 jsp 页面的主要内容,如果未能解决你的问题,请参考以下文章
Spring mvc项目,使用jetty插件和tomcat路径相差一个项目名
项目构建之maven篇:8.maven公布webproject及基于spring mvc,jetty实现的用户管理demo
如何在 spring-boot 中替换最新的 Jetty 9?