用于索引页的Spring MVC默认控制器

时间:2016-01-15 08:06:43

标签: java spring-mvc

我正在尝试使用Spring MVC创建一个简单的站点,基本思路是为每个页面创建单独的控制器。

sitename.com必须由WelcomeController

处理
@Controller
public class WelcomeController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
         System.out.println("----This line is executed on tomcat7 console---");
        return "index";
    }
}

以下是Spring MVC配置

@Configuration
@EnableWebMvc
@ComponentScan(basePackages={"com.mvc.spring4"})
public class MyAppConfig {
    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(JstlView.class);
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

public class ServletInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{MyAppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/*"};
    }

}

存在文件/WEB-INF/jsp/index.jsp,但是我收到404错误

这是tomcat7的控制台输出

2016-01-13 14:47:01 DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/Spring4MVC]
2016-01-13 14:47:01 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /
2016-01-13 14:47:01 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public java.lang.String com.mvc.spring4.WelcomeController.index(org.springframework.ui.Model)]
2016-01-13 14:47:01 DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'welcomeController'
2016-01-13 14:47:01 DEBUG o.s.web.servlet.DispatcherServlet - Last-Modified value for [/Spring4MVC] is: -1

----This line is executed on tomcat7 console---

2016-01-13 14:47:01 DEBUG o.s.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'index'; URL [/WEB-INF/jsp/index.jsp]] in DispatcherServlet with name 'dispatcher'
2016-01-13 14:47:01 DEBUG o.s.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/jsp/index.jsp] in InternalResourceView 'index'
2016-01-13 14:47:01 DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/Spring4MVC/WEB-INF/jsp/index.jsp]
2016-01-13 14:47:01 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /WEB-INF/jsp/index.jsp
2016-01-13 14:47:01 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Did not find handler method for [/WEB-INF/jsp/index.jsp]
2016-01-13 14:47:01 WARN  o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/Spring4MVC/WEB-INF/jsp/index.jsp] in DispatcherServlet with name 'dispatcher'
2016-01-13 14:47:01 DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request
2016-01-13 14:47:01 DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request

阅读许多博客,每个人都说不应该使用/,因为它会截取所有的电话,那么当只输入网站名称时如何才能显示第一页?

[我的解决方案] 然后通过错误和试验找到适用于我的案例的设置,

  1. 如果在网站名称后面没有输入任何内容,则只调用WelcomeController方法,
  2. 如果输入了错误的网址,则会收到404错误,这是错误的(之前每个错误的网址都被重定向到WelcomeController),例如sitename.com/adjahdkahXepowe
  3. 在其他已配置的控制器(如sitename.com/aboutsitename.com/about/development
  4. 上正确映射正确的网址

    这是更改(而不是/ *,使用/)

    @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    

    我的问题是,只有在浏览器中输入网站名称时,才能为欢迎屏幕创建默认控制器的正确方法。

    e.g: sitename.com
    

1 个答案:

答案 0 :(得分:0)

为了确保我们在这里谈论同样的事情,让我们同意sitename.com是您的Web应用程序的根URL。这意味着,您的Web服务器将以某种方式确保将对sitename.com的任何请求重定向到您的servlet。

如果是这样,您当前的方法是正确的。

您可能希望查看STS中提供的spring-MVC项目模板(请参阅https://spring.io/tools/sts)。除了你使用.xml进行注释和该模板的作者之外,它还有很好的相关性。

不要担心默认的控制器。您的'/'网址无需专用控制器。您也可以为应用程序的所有页面创建一个或多或少静态的Controller,例如法律声明页面,页面,联系页面等。

根据项目的大小,最好将URL分布在多个控制器上,以便保持清晰的视图。另一方面,我不会为每个URI创建一个。

关于servlet映射的问题'/'vs'/ *'请参阅Difference between / and /* in servlet mapping url pattern。像往常一样,BalusC解释完整而简单。