SpringMVC基本使用


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM