书上的启动代码,我跟着敲了一遍,最后在tomcat跑不起来~报404错。想不出哪里出错了,求指导。。tomcat 用的8.0.29,是servlet3.0+的代码很简单,(注册DispatcherServlet,启动应用上下文)。(我估计是注册DispatcherServlet不成功,但是不知道为什么?)
目录如下:
然后贴代码:
SpitterWebInitializer.java (核心)package spittr.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/**
 * 扩展了AbstractAnnotationConfigDispatcherServletInitializer的类会自动配置DispatcherServlet和Spring应用上下文
 * @author c00284934
 *
 */
public class SpitterWebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {    /**
     * 返回带有@Configuration注解的类将会用来配置ContextLoaderListener创建的应用上下文中的bean
     * ContextLoaderListener加载的bean通常是驱动应用后端的中间层和数据层组件
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootConfig.class};
    }    /**
     * 带有@Configuration注解的类会用来定义为DispatcherServlet应用上下文中的bean
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        /**
         * 当DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置文件中所声明的bean
         */
        return new Class<?>[]{WebConfig.class};//指定配置类
    }    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};//将DispatcherServlet映射到“/”
    }}
WebConfig.javapackage spittr.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@EnableWebMvc    //启用SpringMVC
@ComponentScan("spittr.web")   //启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter{    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver(); //配置jsp视图解析器
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) { //配置静态资源的处理
        //我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求
        configurer.enable();
    }}RootConfig.javapackage spittr.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages={"spittr"},excludeFilters={@Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)})
public class RootConfig {}
HomeController.javapackage spittr.web;import static org.springframework.web.bind.annotation.RequestMethod.*;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/")
public class HomeController {  @RequestMapping(method = GET)
  public String home(Model model) {
    return "home";
  }
}
home.jsp<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
  <head>
    <title>Spitter</title>
    <link rel="stylesheet" 
          type="text/css" 
          href="<c:url value="/resources/style.css" />" >
  </head>
  <body>
    <h1>Welcome to Spitter</h1>    <a href="<c:url value="/spittles" />">Spittles</a> | 
    <a href="<c:url value="/spitter/register" />">Register</a>
  </body>
</html>

解决方案 »

  1.   

    重新贴一遍代码,我有写注解:
    SpittrWebAppInitializer.javapackage spittr.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/**
     * 扩展了AbstractAnnotationConfigDispatcherServletInitializer的类会自动配置DispatcherServlet和Spring应用上下文
     * @author c00284934
     *
     */
    public class SpittrWebAppInitializer extends
            AbstractAnnotationConfigDispatcherServletInitializer {    /**
         * 返回带有@Configuration注解的类将会用来配置ContextLoaderListener创建的应用上下文中的bean
         * ContextLoaderListener加载的bean通常是驱动应用后端的中间层和数据层组件
         */
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class<?>[]{RootConfig.class};
        }    /**
         * 带有@Configuration注解的类会用来定义为DispatcherServlet应用上下文中的bean
         */
        @Override
        protected Class<?>[] getServletConfigClasses() {
            /**
             * 当DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置文件中所声明的bean
             */
            return new Class<?>[]{WebConfig.class};//指定配置类
        }    @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};//将DispatcherServlet映射到“/”
        }}
    WebConfig.javapackage spittr.config;import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
    @EnableWebMvc    //启用SpringMVC
    @ComponentScan("spittr.web")   //启用组件扫描
    public class WebConfig extends WebMvcConfigurerAdapter{    public ViewResolver viewResolver(){
            InternalResourceViewResolver resolver = new InternalResourceViewResolver(); //配置jsp视图解析器
            resolver.setPrefix("/WEB-INF/view/");
            resolver.setSuffix(".jsp");
            resolver.setExposeContextBeansAsAttributes(true);
            return resolver;
        }    @Override
        public void configureDefaultServletHandling(
                DefaultServletHandlerConfigurer configurer) { //配置静态资源的处理
            //我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求
            configurer.enable();
        }}
    RootConfig.javapackage spittr.config;import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
    @ComponentScan(basePackages={"spittr"},excludeFilters={@Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)})
    public class RootConfig {}
    HomeController.javapackage spittr.web;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;@Controller
    public class HomeController {
        @RequestMapping(value="/",method=RequestMethod.GET)
        public String home(){
            return "home";
        }
    }
      

  2.   

    RootConfig的basePackages={"spittr"}应该改成basePackages={"spittr.config"}
      

  3.   

    http://www.weare.net.cn/article/e80684e1e7fe65eb2e1ace94d222f504.html希望能帮到你
      

  4.   

    直接用spring boot吧
      

  5.   

    1.public ViewResolver viewResolver()这个方法应该有注解@Bean。
    2.检查你的lib目录下是不是已经添加spring相关jar包。ps:不是添加在Libraries
      

  6.   

    这是springMVC写法????,换本书吧,这本书不适合你
      

  7.   

    哈哈哈,楼主肯定是发布目录里面没有spring-framework的jar包。
      

  8.   

    我也遇到此坑, 
    书的确写的不对,有几个地方:
    1、@ComponentScan("spittr.web") 不是spitter.web ,你上面的代码也对了
    2、HomeController映射的地址是"/" 那么浏览器访问的就是localhost:8080即可, 不需要再加spittr如果你输入localhost:8080还是404,并且你用的是IDEA,那么检查下Tomcat启动选项中有没有配置Deployment,如果没有配置也是404的。因为你的代码没有发布到tomcat。
      

  9.   

    https://blog.csdn.net/weixin_43690318/article/details/90214150这是我自己当时实现的,可以参考下