開始Spring MVC建立一個(gè)web project,并導(dǎo)入spring 3.x的jar包配置web.xml根據(jù)上面的spring mvc流程圖,我們知道DispatcherServlet是spring mvc 的一個(gè)前端控制器,所以我們當(dāng)然要去配置它,以便于將請求轉(zhuǎn)給DispatcherServlet處理
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 如果配置文件位于classpath下,可以這么寫: classpath:dispatcher.xml --> <param-value>/WEB-INF/dispatcher.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
注:由于DispatcherServlet在初始化的過程中需要一個(gè)配置文件來生產(chǎn)文件中的各種bean,并生成 WebApplicationContext對象,保存到ServletContext中(如果DispatcherServlet有多個(gè),那么每一個(gè) DispatcherServlet都對應(yīng)一個(gè)WebApplicationContext),我們可以在Servlet的init-param中配置配 置文件的路徑,當(dāng)然如果我們沒有配置Init-Param,它會默認(rèn)到WEB-INF的文件夾中找[servletname]-servlet.xml文 件,例如上面如果我們沒有配置,則會去尋找dispatcher-servlet.xml這個(gè)配置文件。(在init-param中我們可以指定多個(gè)配置 文件,用逗號分隔也可以使用通配符*) 配置上文中我們指定的所需的dispatcher.xml文件<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:p="http://www./schema/p" xmlns:context="http://www./schema/context" xmlns:mvc="http://www./schema/mvc" xsi:schemaLocation=" http://www./schema/beans http://www./schema/beans/spring-beans-3.0.xsd http://www./schema/context http://www./schema/context/spring-context-3.0.xsd http://www./schema/mvc http://www./schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.controls" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> </bean>
</beans>
配置文件說明:<context:component-scan base-package="com.controls" /> 由于我們使用了基于注解的Controller,所以這里指定了需要被掃描的包路徑,如果有多個(gè)可以使用逗號分隔
<mvc:annotation-driven /> 上面的spring mvc流程圖中我們知道DispatcherServlet接管請求后,會由HandlerMapping來執(zhí)行映射,所以我們需要注冊 HanlderMapping,比如上面的標(biāo)簽會自動注冊比如DefaultAnnotationHandlerMapping(執(zhí)行請求到 Controller的映射)和AnnotationMethodHandlerAdapter(調(diào)用controller中的方法)這樣的bean,當(dāng) 然這個(gè)標(biāo)簽還提供了其他的一些支持(更多介紹請參照spring官方文檔第455頁)。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> </bean> 上面spring mvc流程圖的最后controller處理完畢后會交給一個(gè)ViewResolver進(jìn)行處理,大體上是解析視圖邏輯名并經(jīng)過一定的處理獲取一個(gè)視圖, 這里的意思是設(shè)置視圖用jsp來處理(比如我們設(shè)置viewClass為JstlView)來進(jìn)行處理,就是以forward的形式轉(zhuǎn)發(fā)給jsp,這個(gè)地 址是:/WEB-INF/views/[controller返回值].jsp ,當(dāng)然視圖解析器可以定義多個(gè),(視圖解析器不會處理ModelAndView中已經(jīng)設(shè)置了View的請求,因?yàn)橐呀?jīng)有View來處理了,那當(dāng)然就不需要 它來解析到真正的視圖View啦) 編寫Controller控制器這里我們使用例子的形式來說明
實(shí)現(xiàn)一個(gè)控制器類@Controller @RequestMapping("/user") public class UserControl { } 只要給類加上Controller的注解,并放在被掃描的包中,那么這個(gè)類就是一個(gè)控制器了,RequestMapping表明匹配的路徑,可以寫 在類或者類的方法上,如果類上面有RequestMapping注解,那么其下面的方法就是相對于類上面注解地址的一個(gè)相對路徑
定義一個(gè)接管請求的方法方法名:無任何要求 -------------------------------------------------------------- 參數(shù):(順序以及個(gè)數(shù)無任何要求) HttpServletRequest HttpServletResponse PrintWriter 相當(dāng)于HttpResponse.getWriter()獲得的對象 Map 其實(shí)是獲得了ModelAndView中的Model BindingResult 綁定數(shù)據(jù)的處理結(jié)果 HttpSession 如果使用此參數(shù),需要注意如果是第一次訪問還沒有session的話會報(bào)錯(cuò) @PathVariable 用于接收路徑變量 @RequestParam 相當(dāng)于調(diào)用request.getParameter(“name”)方法 @CookieValue 獲取cookie的值 @RequestHeader 獲取header中的值 實(shí)體對象 會根據(jù)請求的參數(shù)名,注入到這個(gè)對象對于得屬性中,必須提供set方法 等等等等等 -------------------------------------------------------------- 返回值: void 返回值是void,如果接收了PrintWriter 或者 HttpServletResponse 參數(shù),那么返回的ModelAndView就是null,也就是直接將輸出流輸出到客戶端,如果方法沒有接收輸出參數(shù),后面會默認(rèn)生成一個(gè)視圖名
String 視圖邏輯名
ModelAndView 是一個(gè)視圖邏輯名+Map的封裝類 其他任意類型 存入ModelAndView中的Model --------------------------------------------------------------
不管我們的返回類型是什么,返回值會通過處理,最終返回一個(gè)ModelAndView或者null 例1:給方法定義一個(gè)請求映射并使用路徑變量@RequestMapping("/id/{userid}/name/{username}") public String queryUser(@PathVariable("userid") long userID , @PathVariable("username") String userName , Map<String, User> model) {
User user = new User(); user.setUserID(userID); user.setUserName(userName);
model.put("userInfo", user);
return "Home"; }
@RequestMapping定義路由映射,其中{userid} {username} 是PathVariable(路徑變量) 這樣我們只需訪問 http://localhost:8080/SpringMVC/user/id/10001/name/liudehua 就能進(jìn)入上面的方法 RequestMapping還可以使用通配符,如: /test/*/name/{name} 例2:接受請求參數(shù)@RequestMapping("/save") public String save(@RequestParam("userName") String userName ,@RequestParam("Age") int age) {
System.out.println(userName); System.out.println(age);
return "Home"; }
例3:請求參數(shù)直接注入到Model@RequestMapping("/save") public String save(User user) {
System.out.println(user.getUserID()); System.out.println(user.getUserName());
return "Home"; }
例4:轉(zhuǎn)發(fā)與重定向轉(zhuǎn)發(fā): (相當(dāng)于 request.getRequestDispatcher(“”).forward(request, response)) return “forward:/user/test”;
重定向: (相當(dāng)于response.redirect(“”)) return “redirect:/user/test” return “redirect:http://www.”;
例5:根據(jù)HttpMethod來過濾請求@RequestMapping(value="", method=RequestMethod.POST) public String Test(//…) { //… }
例6:根據(jù)參數(shù)來進(jìn)行過濾@RequestMapping(params="hello=world", method={RequestMethod.GET, RequestMethod.POST}) public String helloworld() { } 必須有個(gè)hello的參數(shù)并且名稱為world,而且只能是get或post請求才會進(jìn)入此方法 |
|