一、配置DispatcherServlet
1.使用 java 将 DispatcherServlet 配置在 Servlet 中
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /** * 注意:该种配置方法是传统web.xml 方式的替代方案。只能部署到支持 Servlet3.0的服务器中才能正常工作(既Tomcat7或更高版本才可以) * * 只要扩展了 AbstractAnnotationConfigDispatcherServletInitializer 类,容器会自动发现该种类,并用它类配置 Servlet 上下文。 * AbstractAnnotationConfigDispatcherServletInitializer 会同时创建 DispatcherServlet 和 ConetxtLoaderListener */ public class MySpringDispatcherServlet extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { // 这个方法带回的带有 @Configuration 注解的类将会用来配置 ConetxtLoaderListener 创建的应用上下文中的 bean. System.out.println("pppppppppp"); return new Class<?>[] {RootConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { System.out.println("hhhhhhhhh"); // 指定配置类 //当 DispatcherServlet 启动时,会创建 Spring 应用上下文,并加载配置文件或配置类中所声明的 bean .这里要求 DispatcherServlet 加载上下文时使用定义在 WebConfig 配置类中的 bean 。 return new Class<?>[] {WebConfig.class}; } //该方法的作用是将一个或多个路径映射到 DispatcherServlet 上,这里映射的是 "/" ,这表示它是应用的默认 Servlet 它会处理进入应用的所有请求。 @Override protected String[] getServletMappings() { System.out.println("vvvvvvvvvv"); // 将DispatcherServlet 映射到 "/" return new String[] {"/"}; } }
WebConfig 类
import org.springframework.context.annotation.Bean; 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(basePackages={"config", "controller", "data"}) //启用组件扫描 指定了扫描路径 public class WebConfig extends WebMvcConfigurerAdapter { //配置视图解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); //prefix属性指定资源页面的前缀 这里直接把资源位置定位到项目的/WEB-INF/下面 resolver.setPrefix("/WEB-INF/views/"); //suffix属性指定资源页面的后缀 resolver.setSuffix(".jsp"); //exposeContextBeansAsAttributes属性以将当前spring 环境中的 beans作为request attritbutes来暴露到页面上。 //exposedContextBeanNames属性来限制能够暴露到页面上的spring bean的名称列表。 resolver.setExposeContextBeansAsAttributes(true); return resolver; } //配置静态资源的处理 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { //该方法作用是 DispatcherServlet 将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 上 configurer.enable(); } }
RootConfig 类
@Configuration //开启自动扫描 可以指定多个包路径 @ComponentScan(basePackages={"com"}, excludeFilters={@Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)}) public class RootConfig { }
然后我们编写一个控制器
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller //声明为一个控制器 @RequestMapping("homepage")
//@RequestMapping({"/", "homepage"}) //将处理器映射到"/" 和 homepage
public class HomeController { //@RequestMapping(value="/",method=RequestMethod.GET) //处理对"/"的 GET 请求 方法级别的请求处理 //@RequestMapping(method=RequestMethod.GET) @RequestMapping(value="/register",method=RequestMethod.GET) public String home() { System.out.println("ssssssssssssssssssssss"); System.out.println("llllllllllllll"); return "home"; //这里就解析为 /WEB-INF/views/home.jsp } }
遇到的问题:
1.访问不到首页 原因:默认的首页访问是放在 WebContent 目录下的,而不是 WEB-INF 目录下
2.默认访问页是按照 web.xml 中配置的顺序起作用的
例如:
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
如果 WebContent 目录下同时有 index.html 和 index.jsp 的话,则会显示 index,html
3.在用纯java 配置 spring mvc 时,要将相关jar包放在 WEB-INF/lib 路径下,不然不会加载 AbstractAnnotationConfigDispatcherServletInitializer 的实现类。