springMVC是一個MVC框架,他控制着請求相應的整個流程,從請求一進入到應用服務器到相應離開,都離不開mvc框架
請求在應用服務器中
先說說請求相應在應用服務器的整個過程

- DisptacherServlet接收到請求,並讀取出請求中的數據
- DisptacherServlet根據請求中的信息(url),去Handlermapping中查找url對應的資源(如果沒有則報404)
- 如果資源指向一個Controller,則將請求和請求數據發送給Controller
- Controller處理請求(一般Controller將處理動作交給業務層處理),將處理好的數據和視圖名返回給DisptacherServlet
- DisptacherServlet根據視圖名去查找ViewResolver視圖解析器,將數據交給對應的視圖處理
- 視圖(jsp,html等等)拿到數據后,渲染
清楚了請求在服務器中的流程后,知道了使用一個mvc框架我們要進行幾步配置
- 初始化DisptacherServlet(配置Handlermapping和Controller的位置)
- 配置Handlermapping(ServletMapping)
- 標識Controler,配置Controler要處理的url以及返回的視圖名
- 配置視圖解析器
第二步和第三步是在一起的,因為Controler就是ServletHandlermapping和Controller的配置在web.xml中就相當於<servlet>和<servlet-mapping>DisptacherServlet需要從web.xml中拿關於springmvc的配置(servlel,servletmapping),才能調度整個流程
關於DisptacherServlet
(可以先跳過這部分,往后面看)DisptacherServlet是SpringMVC的調度中心,在這里請求會第一次進入到SpringMVCDisptacherServlet配置着SpringMVC運作的信息在以前,我們會在web.xml中配置SpringMVC,然后SpringMVC會根據web.xml中的配置初始化DisptacherServlet在servlet3.0之后,出現了ServletContainerInitializer,可以在項目啟動最開始時,會自動掃描實現了ServletContainerInitializer接口的類,對Servlet、Listener、Filter進行動態注冊,利用此技術,可以通過實現ServletContainerInitializer來配置DisptacherServlet(注冊controller,ViewResolve),達到SpringMVC零配置的效果
關於ServletContainerInitializer
(可以先跳過這部分,往后面看)ServletContainerInitializer的作用和web.xml差不多,都是部署servlet,listener,filter,只是一個是用java代碼配置,一個用xml配置在實現了ServletContainerInitializer接口的類上要注解上@HandlesTypes(//要動態注冊的class,一定要是Servlet或者Listener或者Filter)ServletContainerInitializer接口中只有一個方法onStart(Set<Class>,ServletContext)當應用啟動的時候,會調用onStart方法,參數Set<Class>就是@HandlesTypes中的類,意味着這些類可以被動態注冊實現動態注冊的核心方法:
- addServlet(String name,Servlet servlet)
- addFilter(String name,Filter filter)
- addListener(Listener listener)
這些都是注冊Servlet、listener、filter的方法顯然還是有點麻煩,所以隨着spring的發展,有更多簡單的方法去配置現在最簡單就是繼承AbstractAnnotationConfigDispatcherServletInitializer,重寫getServletConfigClasses、getServletMappings、getRootConfigClasses來配置DisptacherServlet
配置DisptacherServlet
這一步,跟配置web.xml作用差不多,就是要部署注冊servlet在這里我們采用繼承重寫AbstractAnnotationConfigDispatcherServletInitializer的方法,來配置DisptacherServlet
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
//得到中間層(service、dao、aop、po等)的配置
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{DAOConf.class,ServiceConf.class,AOPConf.class};
}
//得到controler和ViewResolver的配置
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConf.class};
}
//標識哪些url要經過這個DisptacherServlet處理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};//所有url都被DisptacherServlet處理
}
}
SpringMVC配置
這一步是完成SpringMvcConf.class,這個類配置了一些controller和ViewResolver
@Configuration
@EnableWebMvc
//掃描控制器
@ComponentScan(includeFilters=@ComponentScan.Filter(type=FilterType.ANNOTATION,value=Controller.class))
public class SpringMvcConf extends WebMvcConfigurerAdapter {
//配置視圖解析器
//html解析
@Bean
public ViewResolver htmlResolver(){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".html");
return viewResolver;
}
//靜態資源處理
//當DisptacherServlet接收到了他匹配的請求,但是找不到相應的Controller,就會把這個請求返回給默認的處理(比如交給tomcat處理)
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
這里關鍵有幾步:
- @EnableWebMvc,開啟springmvc
- @ComponentScan開啟自動掃包,掃描所有帶有@Controller的Bean
- 添加ViewResolver,這里的配置是使,視圖路徑為"/WEB-INF/view/"+Controller返回的視圖名+".html"
- 因為之前配置了所有路徑都被DisptacherServlet接收,這會導致一些靜態資源找不到controller去處理,結果出現404,configurer.enable()開啟了之后,當springmvc不能處理的時候會交回給默認的處理
配置Controller
最簡單配置
@Controller
public class IndexServlet {
@RequestMapping(value="/",method=RequestMethod.GET)//GET方法訪問"/"的時候,調用此方法
public String get(Model model){
model.addAttribute("title","index");
return "index";
}
}
這是一個最簡單的控制器,幾個要點
- 當類被@Controller注釋時,該類就是一個控制器
- 控制器中的方法被@RequestMapping標識,配置了這個方法訪問的url和method
- get方法有一個參數Model,這跟Request中的Attribute差不多,model.addAttribute就跟request.addAttribute一樣
接收參數
接收參數形式有3種:?號傳值,路徑變量,提交表單
?號傳值
訪問形式:路徑?參數名=值&參數名=值
@RequestMapping(value="/login",method=RequestMethod.GET)
public String login(@RequestParam("username")String username,@RequestParam("password")String password){
return "login";
}
這樣子就能拿到參數了
路徑變量
這種也是用的比較多的,通過占位符來實現訪問形式:路徑/參數值
@RequestMapping(value="/logout/{id}",method=RequestMethod.GET)
public String logout(@PathVariable("id")int id){
return "logout";
}
比如訪問"/logout/123",123就是id參數
表單變量
當表單要上傳一個對象的時候,這種方式就很好用了,springmvc會自動將讀取表單數據然后實例化相應bean
@RequestMapping(method=RequestMethod.POST,path="/user")
public String Post(User user){
return "post";
}
查看原文:http://zswlib.com/2016/07/15/springmvc%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8/
