1

我正在使用 maven + spring + hibernate 构建一个无 xml 文件 webapp 并从Minimal Tomcat 7 embedding example开始

应用结构:

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

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'

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

提前致谢!

4

3 回答 3

0

如果你改变了怎么办

File base = new File("");

File base = new File("src/main/resources");
于 2013-07-18T00:25:22.637 回答
0

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

使用嵌入式 Tomcat (7.0) 执行 Spring 时有两个选项:addContext 和 addWebapp。后者确实是推荐的入门方式,而 addContext 是更高级的,必须有控制路线。使用 addContext 很好,但是您必须指定更多配置信息。我将在这个答案中关注 addContext 。

您真的只缺少上面的一件,那就是用于 JSP 文件的 Servlet 类?我想您可能有一个名为welcome.jsp 的文件,它很可能位于正确的位置。但是,您上面的代码只会说明如何正确处理您的控制器。

您需要添加以处理 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");

如果你做了star,那么它可能会尝试为你处理jsp,即使添加了新的JspServlet Servlet Class,它也无法做到这一点。

现在这工作了,但是根据您实际提供的内容,您可能想要进行的另一项改进是在 MvcConfig.java 中指定一个视图类。例如,如果您这样做,则可以让您处理 jstl 内容:

resolver.setViewClass(JstlView.class);

但还有许多其他情况下最好设置一个视图类。

于 2014-04-16T16:06:14.947 回答
0

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

于 2013-06-04T14:45:02.160 回答