繁体   English   中英

与弹簧集成的嵌入式tomcat

[英]embedded tomcat integrated with spring

我正在使用Maven + Spring + Hibernate构建无xml文件的webapp,并从Minimal Tomcat 7嵌入示例开始

应用结构:

webapp
  |_src/main/java
  |  |_com.myapp.test
  |    |_Main.java
  |    |_HelloController.java
  |    |_MvcConfig.java
  |_src/main/resources
  |  |_hello.jsp
  |_src/test/java
  |_src/test/resources

HelloController.java

@Controller
@RequestMapping("/welcome")
public class HelloController {
@RequestMapping(method = RequestMethod.GET)
public String printWelcome(ModelMap model) {
    model.addAttribute("message", "Spring 3 MVC Hello World");
    return "hello";
}

MvcConfig.java

@Configuration
@EnableWebMvc
public class MvcConfig {
    @Bean
    public InternalResourceViewResolver configureInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

尝试在Main.java添加spring功能时

Tomcat tomcat = new Tomcat();
tomcat.setPort(9090);
File base = new File("");
System.out.println(base.getAbsolutePath());
Context rootCtx = tomcat.addContext("", base.getAbsolutePath());            
AnnotationConfigWebApplicationContext aactx = new AnnotationConfigWebApplicationContext();
aactx.scan("com.myapp");
aactx.register(MvcConfig.class);
DispatcherServlet dispatcher = new DispatcherServlet(ctx);
Tomcat.addServlet(rootCtx, "SpringMVC", dispatcher);
rootCtx.addServletMapping("/*", "SpringMVC");
tomcat.start();

然后当我进入localhost:9090/welcome.jsp检出嵌入式服务器时收到此错误

Jun 04, 2013 4:34:39 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/hello.jsp] in DispatcherServlet with name 'SpringMVC'
Jun 04, 2013 5:00:38 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/favicon.ico] in DispatcherServlet with name 'SpringMVC'

为什么我收到此错误以及如何解决?

提前致谢!

我很确定您设置为“ /”的后缀是相对的“ WEB-INF”。 尝试创建webapp / src / main / webapp / WEB-INF /并将hello.jsp放在此处。

如果您改变了怎么办

File base = new File("");

File base = new File("src/main/resources");

在开始之前,进行@RobBarreca指出的调整。 应该是aactx而不是ctx。

使用嵌入式Tomcat(7.0)进行Spring时有两个选项:addContext和addWebapp。 确实是推荐的入门方法,而addContext是更高级的方法,必须具有控制路线。 您可以使用addContext,但必须指定更多配置信息。 在此答案中,我将重点介绍addContext。

您确实只缺少上面的内容,那就是用于JSP文件的Servlet类? 我可以想象您可能有一个名为welcome.jsp的文件,它很可能位于正确的位置。 但是,以上代码将仅说明如何正确处理Controller。

您需要添加以处理JSP文件的代码如下:

Wrapper jspServlet = rootCtx.createWrapper();
jspServlet.setName("jsp");
jspServlet.setServletClass("org.apache.jasper.servlet.JspServlet");
jspServlet.addInitParameter("fork", "false");
jspServlet.addInitParameter("xpoweredBy", "false");
jspServlet.setLoadOnStartup(2);
rootCtx.addChild(jspServlet);
rootCtx.addServletMapping("*.jsp", "jsp");

实际上,您确实需要第二件事,那就是更改SpringMVC的servlet映射。 它应该是

rootCtx.addServletMapping("/", "SpringMVC");

如果您确实加注了星号,那么它可能会尝试为您处理jsp,即使添加了新的JspServlet Servlet类,它也无法做到。

现在可以使用,但是您可能要根据实际提供的内容进行另一项改进,就是在MvcConfig.java中指定一个View类。 例如,如果这样做,则可以允许您处理jstl内容:

resolver.setViewClass(JstlView.class);

但在许多其他情况下,最好设置View Class。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM