我正在使用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'
为什么我收到此错误以及如何解决?
提前致谢!
答案 0 :(得分:0)
我很确定您设置为“/”的后缀是相对“WEB-INF”。 尝试创建webapp / src / main / webapp / WEB-INF /并在那里放置hello.jsp。
答案 1 :(得分:0)
如果您更改
,该怎么办?File base = new File("");
到
File base = new File("src/main/resources");
答案 2 :(得分:0)
在开始之前,进行@RobBarreca指出的调整。它应该是aactx而不是ctx。
使用嵌入式Tomcat(7.0)执行Spring时有两个选项:addContext和addWebapp。后者实际上是推荐的入门方式,而addContext是更高级的,必须有控制路径。您可以使用addContext,但是必须指定 more 配置信息。我将在这个答案中关注addContext。
你真的只丢失了上面的一个,这就是Servlet Class将用于JSP文件的东西?我想你可能有一个名为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");
如果你做了星,那么它可能会尝试为你处理jsp,即使添加了新的JspServlet Servlet类也无法做到。
现在这样可行,但您可能想要进行一项额外的改进,具体取决于您实际服务的内容是在MvcConfig.java中指定View类。例如,如果您这样做,则可以允许您处理jstl内容:
resolver.setViewClass(JstlView.class);
但是还有很多其他情况需要设置View Class。