2

之前已经提出过这个问题,但是给出的答案要么对我不起作用,要么答案完全回避了这个问题,转而支持不同的基本示例。

我正在尝试使用嵌入在 Je​​tty 实例中的 Spring MVC servlet 的简单基本示例。我的控制器正在接收页面请求并返回正确的视图名称。正是在寻找 jsp 页面时失败了。我相信,根据我看到的其他答案,问题在于 Servlet 映射,但在我的情况下我看不到解决方案。

码头服务器设置:

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;
}

包下的 Web App 配置类com.company.webapptemplate.config

@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";
    } 
}

target/classes运行 maven / IntelliJ 构建后的非 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'

如果有人能告诉我我错过了哪一块拼图,我将不胜感激。

谢谢。

4

1 回答 1

3

Sotirios 的评论推动了我前进——如何让 Jsp 处理 servlet 进入嵌入式 Jetty....

getServletContextHandler我将 contextHandler 的实例化更改为现在的WebAppContext. 所有相同的方法都适用于此。

然后我创建了这个方法来获取返回的 WebAppContext 并设置 Jsp 处理(从这里获取的代码段: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

现在它像一个美女一样工作。

谢谢

于 2014-09-12T10:14:00.833 回答