Spring Mvc詳解
一、spring mvc處理請求的流程。
客戶端發出http請求,如果匹配到DispatcherServlet的請求映射路徑,則web容器將請求轉交給DispatcherServlet處理。
DispatcherServlet接受到請求後,根據請求的信息和HandlerMapping的配置,找到處理請求的處理器(Handler)。HandlerMapping類是路由控制器。
得到相對應的Handler後,通過HandlerAdapter對Handler進行封裝,再以統一的適配器接口調用Handler。
處理完業務後,返回ModelAndView給DispatcherServlet。
通過ViewResolver完成ModelAndView邏輯視圖到真實視圖的解析工作。
二、在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>
通過contextConfigLoaction在web.xml裏配置需要加載的spring配置文件
2.配置<listener>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
在web.xml裏配置Listener,本Listener會去加載第一步中指定的配置文件,如果指定了要加載的文件,則會去加載相應的xml,而不會去加載/WEB-INF/下的applicationContext.xml。(指定加載即是第1步的配置)如果沒有指定的話,默認會去/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,它默認自動加載/WEB-INF/Servlet-servlet.xml的spring配置文件,啟動web層的Spring容器。
可以通過<servlet>的<init-param>指定:
屬性namespace:對於DispatcherServlet的命名空間,默認為<servlet-name>-servlet。用於構造spring配置文件的路徑,指定該屬性,可以指定spring配置文件。
屬性contextConfigLocation:如果DispatcherServlet對應上下文有多個spring配置文件,則可以使用該屬性指定。
三、註解驅動的控制器
[email protected]
/** * 接收GET請求 * @return */ @RequestMapping(value="/delete",method = RequestMethod.GET) public String get(){ System.out.println("get"); return "get"; } /** * 接收POST請求 * @return */ @RequestMapping(value="/delete",method = RequestMethod.POST) public String post(){ System.out.println("post"); return "post"; } /** * 只接收 name 參數 * @return */ @RequestMapping(value="/delete",params="name") public String params(String name){ System.out.println("hello "+name); return "helloworld"; } /** * 只接收請求頭中 Content-Type 為 text/html;charset=UTF-8的請求 * @return */ @RequestMapping(value="/delete",headers="Content-Type:text/html;charset=UTF-8") public String headers(){ System.out.println("headers"); return "helloworld"; }
2.請求處理方法簽名
Spring MVC通過分析處理方法的簽名,把http請求信息綁定到處理方法的相應入參中,然後再調用處理方法得到返回值。以下是四種綁定參數的方式:
// ①請求參數按名稱匹配的方式綁定到方法入參中,方法返回對應的字符串代表邏輯視圖名 @RequestMapping(value = "/handle1") public String handle1(@RequestParam("userName") String userName, @RequestParam("password") String password, @RequestParam("realName") String realName) { return "success"; } // ②將Cooke值及報文頭屬性綁定到入參中、方法返回ModelAndView @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; } // ③請求參數按名稱匹配的方式綁定到user的屬性中、方法返回對應的字符串代表邏輯視圖名 @RequestMapping(value = "/handle3") public String handle3(User user) { return "success"; } // ④直接將HTTP請求對象傳遞給處理方法、方法返回對應的字符串代表邏輯視圖名 @RequestMapping(value = "/handle4") public String handle4(HttpServletRequest request) { return "success"; }
3.使用HttpMessageConverter
1)概念:HttpMessageConverter<T>負責把請求信息轉換為一個對象,將對象輸出作為響應信息。
2)使用:[email protected]@ResponseBody
@RequestMapping(value = "/handle41") public String handle41(@RequestBody String body) {//把請求報文體轉換為字符串綁定到RequestBody中 System.out.println(body); return "success"; } @ResponseBody//把數據輸出到響應流中。 @RequestMapping(value = "/handle42/{imageId}") public byte[] handle42(@PathVariable("imageId") String imageId) throws IOException { System.out.println("load image of " + imageId); Resource res = new ClassPathResource("/image.jpg"); byte[] fileData = FileCopyUtils.copyToByteArray(res.getInputStream()); return fileData; }
@RequestBody
作用:
i) 該註解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然後把相應的數據綁定到要返回的對象上;
ii) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。
@ResponseBody
作用:
該註解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換為指定格式後,寫入到Response對象的body數據區。
使用時機:
返回的數據不是html標簽的頁面,而是其他某種格式的數據時(如json、xml等)使用;
@RestController
作用:
[email protected][email protected]
4.處理模型數據
spring mvc在調用處理方法前會創建一個隱含的模型對象,如果處理方法的入參為Map或者Model類型,則spring mvc會把隱形模型的引用傳遞給這些入參,一般是在方法參數寫上Model model,然後通過model.addAttribute(key,value)來添加數據。
@RequestMapping(value = "/handle63") public String handle63(ModelMap modelMap) { User user = (User) modelMap.get("user");//springmvcv會把隱含模型對象傳遞給modelMap,所以可以訪問模型的數據 user.setUserName("tom"); modelMap.addAttribute("testAttr", "value1"); return "/user/showUser"; }
四、處理方法的數據綁定
spring mvc通過反射機制對目標處理函數的簽名進行分析,將請求消息綁定到處理方法的入參中,核心部件是DataBinder。
1.數據格式化
spring使用轉換器進行源類型對象到目標類型對象的轉換。spring提供兩個內建的實現類,分別支持數字及日期類型的註解驅動格式化。
@[email protected]
<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.數據校驗
<mvc:annotation-driven/>會默認裝配一個LocalValidatorFactoryBean,[email protected],即可讓spring mvc在完成數據綁定後執行數據校驗工作。
1)在model設置檢驗條件
@Pattern(regexp="w{4,30}")//通過正則校驗,匹配4-30個包含數字、字母、下劃線的字符 private String userName; @Pattern(regexp="S{6,30}")//通過正則校驗,匹配6-30個非空白的字符 private String password; @Length(min=2,max=100)//長度限制在2-100 private String realName; @Past //時間值必須是個過去的時間 @DateTimeFormat(pattern="yyyy-MM-dd") private Date birthday; @DecimalMin(value="1000.00")//數據必須在1000.00-100000.00之間 @DecimalMax(value="100000.00") @NumberFormat(pattern="#,###.##") private long salary;
2)然後在處理函數中處理
@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"; } }
在入參對象前添加了@Valid註解,同時在其後聲明了一個BindingResult入參。然後通過BindingResult就可以進行判斷,處理了。BindingResult除了hasErrors()外還有以下幾個接口:getFieldError(String field)獲取屬性名對應的校驗錯誤、getFiledErrors()獲取所有屬性校驗錯誤、getFiledValue(String field)獲取屬性值、getErrorCount()獲取錯誤數量。
五、視圖和視圖解析器
請求處理方法執行完成後,最終返回一個ModelAndView對象,spring mvc借助視圖解析器得到最終的視圖對象View。視圖對象是一個bean,由視圖解析器負責實例化。
在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"/>
本文出自 “赤霄” 博客,請務必保留此出處http://cnslp.blog.51cto.com/11387491/1934098
Spring Mvc詳解