溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Mvc詳解

發(fā)布時(shí)間:2020-07-13 05:12:19 來(lái)源:網(wǎng)絡(luò) 閱讀:891 作者:cnslp 欄目:開(kāi)發(fā)技術(shù)

一、spring mvc處理請(qǐng)求的流程。

  1. 客戶端發(fā)出http請(qǐng)求,如果匹配到DispatcherServlet的請(qǐng)求映射路徑,則web容器將請(qǐng)求轉(zhuǎn)交給DispatcherServlet處理。

  2. DispatcherServlet接受到請(qǐng)求后,根據(jù)請(qǐng)求的信息和HandlerMapping的配置,找到處理請(qǐng)求的處理器(Handler)。HandlerMapping類是路由控制器。

  3. 得到相對(duì)應(yīng)的Handler后,通過(guò)HandlerAdapter對(duì)Handler進(jìn)行封裝,再以統(tǒng)一的適配器接口調(diào)用Handler。

  4. 處理完業(yè)務(wù)后,返回ModelAndView給DispatcherServlet。

  5. 通過(guò)ViewResolver完成ModelAndView邏輯視圖到真實(shí)視圖的解析工作。



二、在web中配置DispatcherServlet

1.配置<context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-base.xml,classpath:spring-another.xml</param-value>
    </context-param>

通過(guò)contextConfigLoaction在web.xml里配置需要加載的spring配置文件


2.配置<listener>

<listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
   </listener>

    在web.xml里配置Listener,本Listener會(huì)去加載第一步中指定的配置文件,如果指定了要加載的文件,則會(huì)去加載相應(yīng)的xml,而不會(huì)去加載/WEB-INF/下的applicationContext.xml。(指定加載即是第1步的配置)如果沒(méi)有指定的話,默認(rèn)會(huì)去/WEB-INF/下加載applicationContext.xml。


3.配置DispatcherServlet

 <servlet>
     <servlet-name>Servlet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
 </servlet>
<servlet-mapping>
    <servlet-name>Servlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

  配置了名為Servlet的DispatcherServlet,它默認(rèn)自動(dòng)加載/WEB-INF/Servlet-servlet.xml的spring配置文件,啟動(dòng)web層的Spring容器。

  可以通過(guò)<servlet>的<init-param>指定:

屬性namespace:對(duì)于DispatcherServlet的命名空間,默認(rèn)為<servlet-name>-servlet。用于構(gòu)造spring配置文件的路徑,指定該屬性,可以指定spring配置文件。

屬性contextConfigLocation:如果DispatcherServlet對(duì)應(yīng)上下文有多個(gè)spring配置文件,則可以使用該屬性指定。


三、注解驅(qū)動(dòng)的控制器

1.使用@RequestMapping映射請(qǐng)求

/** 
     * 接收GET請(qǐng)求 
     * @return 
     */  
    @RequestMapping(value="/delete",method = RequestMethod.GET)  
    public String get(){  
        System.out.println("get");  
        return "get";  
    }  
  
    /** 
     * 接收POST請(qǐng)求 
     * @return 
     */  
    @RequestMapping(value="/delete",method = RequestMethod.POST)  
    public String post(){  
        System.out.println("post");  
        return "post";  
    }  
      
    /** 
     * 只接收 name 參數(shù) 
     * @return 
     */  
    @RequestMapping(value="/delete",params="name")  
    public String params(String name){  
        System.out.println("hello "+name);  
        return "helloworld";  
    }  
      
    /** 
     * 只接收請(qǐng)求頭中 Content-Type 為 text/html;charset=UTF-8的請(qǐng)求 
     * @return 
     */  
    @RequestMapping(value="/delete",headers="Content-Type:text/html;charset=UTF-8")  
    public String headers(){  
        System.out.println("headers");  
        return "helloworld";  
    }

2.請(qǐng)求處理方法簽名

  Spring MVC通過(guò)分析處理方法的簽名,把http請(qǐng)求信息綁定到處理方法的相應(yīng)入?yún)⒅?,然后再調(diào)用處理方法得到返回值。以下是四種綁定參數(shù)的方式:

// ①請(qǐng)求參數(shù)按名稱匹配的方式綁定到方法入?yún)⒅?,方法返回?duì)應(yīng)的字符串代表邏輯視圖名
@RequestMapping(value = "/handle1")
public String handle1(@RequestParam("userName") String userName,
      @RequestParam("password") String password,
      @RequestParam("realName") String realName) {
   return "success";
}

// ②將Cooke值及報(bào)文頭屬性綁定到入?yún)⒅小⒎椒ǚ祷豈odelAndView
@RequestMapping(value = "/handle2")
public ModelAndView handle2(@CookieValue("JSESSIONID") String sessionId,
      @RequestHeader("Accept-Language") String accpetLanguage) {
   ModelAndView mav = new ModelAndView();
   mav.setViewName("success");
   mav.addObject("user", new User());
   return mav;
}

// ③請(qǐng)求參數(shù)按名稱匹配的方式綁定到user的屬性中、方法返回對(duì)應(yīng)的字符串代表邏輯視圖名
@RequestMapping(value = "/handle3")
public String handle3(User user) {
   return "success";
}

// ④直接將HTTP請(qǐng)求對(duì)象傳遞給處理方法、方法返回對(duì)應(yīng)的字符串代表邏輯視圖名
@RequestMapping(value = "/handle4")
public String handle4(HttpServletRequest request) {
   return "success";
}


3.使用HttpMessageConverter

1)概念:HttpMessageConverter<T>負(fù)責(zé)把請(qǐng)求信息轉(zhuǎn)換為一個(gè)對(duì)象,將對(duì)象輸出作為響應(yīng)信息。

2)使用:通過(guò)@RequestBody和@ResponseBody

@RequestMapping(value = "/handle41")
public String handle41(@RequestBody String body) {//把請(qǐng)求報(bào)文體轉(zhuǎn)換為字符串綁定到RequestBody中 
   System.out.println(body);
   return "success";
}

@ResponseBody//把數(shù)據(jù)輸出到響應(yīng)流中。
@RequestMapping(value = "/handle42/{p_w_picpathId}")
public byte[] handle42(@PathVariable("p_w_picpathId") String p_w_picpathId)
      throws IOException {
   System.out.println("load p_w_picpath of " + p_w_picpathId);
   Resource res = new ClassPathResource("/p_w_picpath.jpg");
   byte[] fileData = FileCopyUtils.copyToByteArray(res.getInputStream());
   return fileData;
}

@RequestBody

作用: 

      i) 該注解用于讀取Request請(qǐng)求的body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對(duì)象上;

      ii) 再把HttpMessageConverter返回的對(duì)象數(shù)據(jù)綁定到 controller中方法的參數(shù)上。

@ResponseBody

作用: 

      該注解用于將Controller的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對(duì)象的body數(shù)據(jù)區(qū)。

使用時(shí)機(jī):

      返回的數(shù)據(jù)不是html標(biāo)簽的頁(yè)面,而是其他某種格式的數(shù)據(jù)時(shí)(如json、xml等)使用;

@RestController

作用: 

        相當(dāng)于@Controller+@ResponseBody


4.處理模型數(shù)據(jù)

  spring mvc在調(diào)用處理方法前會(huì)創(chuàng)建一個(gè)隱含的模型對(duì)象,如果處理方法的入?yún)镸ap或者M(jìn)odel類型,則spring mvc會(huì)把隱形模型的引用傳遞給這些入?yún)?,一般是在方法參?shù)寫上Model model,然后通過(guò)model.addAttribute(key,value)來(lái)添加數(shù)據(jù)。

@RequestMapping(value = "/handle63")
public String handle63(ModelMap modelMap) {
   User user = (User) modelMap.get("user");//springmvcv會(huì)把隱含模型對(duì)象傳遞給modelMap,所以可以訪問(wèn)模型的數(shù)據(jù)
   user.setUserName("tom");
   modelMap.addAttribute("testAttr", "value1");
   return "/user/showUser";
}


四、處理方法的數(shù)據(jù)綁定
  spring mvc通過(guò)反射機(jī)制對(duì)目標(biāo)處理函數(shù)的簽名進(jìn)行分析,將請(qǐng)求消息綁定到處理方法的入?yún)⒅校诵牟考荄ataBinder。

1.數(shù)據(jù)格式化

  spring使用轉(zhuǎn)換器進(jìn)行源類型對(duì)象到目標(biāo)類型對(duì)象的轉(zhuǎn)換。spring提供兩個(gè)內(nèi)建的實(shí)現(xiàn)類,分別支持?jǐn)?shù)字及日期類型的注解驅(qū)動(dòng)格式化。

@NumberFormat和@DateTimeFormat注解

<bean id="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.smart.domain.StringToUserConverter"/>
        </list>
    </property>
</bean>
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
@NumberFormat(pattern="#,###.##")
private long salary;
form.add("birthday", "1980-01-01");
form.add("salary", "4,500.00");

2.數(shù)據(jù)校驗(yàn)

    <mvc:annotation-driven/>會(huì)默認(rèn)裝配一個(gè)LocalValidatorFactoryBean,通過(guò)處理方法的入?yún)⑸蠘?biāo)注的@Valid注解,即可讓spring mvc在完成數(shù)據(jù)綁定后執(zhí)行數(shù)據(jù)校驗(yàn)工作。

1)在model設(shè)置檢驗(yàn)條件

@Pattern(regexp="w{4,30}")//通過(guò)正則校驗(yàn),匹配4-30個(gè)包含數(shù)字、字母、下劃線的字符
private String userName;
@Pattern(regexp="S{6,30}")//通過(guò)正則校驗(yàn),匹配6-30個(gè)非空白的字符
private String password;
@Length(min=2,max=100)//長(zhǎng)度限制在2-100
private String realName;
@Past                    //時(shí)間值必須是個(gè)過(guò)去的時(shí)間
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
@DecimalMin(value="1000.00")//數(shù)據(jù)必須在1000.00-100000.00之間
@DecimalMax(value="100000.00")
@NumberFormat(pattern="#,###.##")
private long salary;

2)然后在處理函數(shù)中處理

@RequestMapping(value = "/handle91")
public String handle91(@Valid @ModelAttribute("user") User user,
      BindingResult bindingResult, ModelMap mm) {
   if (bindingResult.hasErrors()) {
      return "/user/register3";
   } else {
      return "/user/showUser";
   }
}

     在入?yún)?duì)象前添加了@Valid注解,同時(shí)在其后聲明了一個(gè)BindingResult入?yún)ⅰH缓笸ㄟ^(guò)BindingResult就可以進(jìn)行判斷,處理了。BindingResult除了hasErrors()外還有以下幾個(gè)接口:getFieldError(String field)獲取屬性名對(duì)應(yīng)的校驗(yàn)錯(cuò)誤、getFiledErrors()獲取所有屬性校驗(yàn)錯(cuò)誤、getFiledValue(String field)獲取屬性值、getErrorCount()獲取錯(cuò)誤數(shù)量。


五、視圖和視圖解析器

    請(qǐng)求處理方法執(zhí)行完成后,最終返回一個(gè)ModelAndView對(duì)象,spring mvc借助視圖解析器得到最終的視圖對(duì)象View。視圖對(duì)象是一個(gè)bean,由視圖解析器負(fù)責(zé)實(shí)例化。

在xml中配置試圖解析器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:order="100" p:viewClass="org.springframework.web.servlet.view.JstlView"
      p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>





向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI