paulwong

          開始Spring MVC

          建立一個web project,并導入spring 3.x的jar包配置web.xml根據上面的spring mvc流程圖,我們知道DispatcherServlet是spring mvc 的一個前端控制器,所以我們當然要去配置它,以便于將請求轉給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在初始化的過程中需要一個配置文件來生產文件中的各種bean,并生成WebApplicationContext對象,保存到ServletContext中(如果DispatcherServlet有多個,那么每一個DispatcherServlet都對應一個WebApplicationContext),我們可以在Servlet的init-param中配置配置文件的路徑,當然如果我們沒有配置Init-Param,它會默認到WEB-INF的文件夾中找[servletname]-servlet.xml文件,例如上面如果我們沒有配置,則會去尋找dispatcher-servlet.xml這個配置文件。(在init-param中我們可以指定多個配置文件,用逗號分隔也可以使用通配符*)
          配置上文中我們指定的所需的dispatcher.xml文件

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
          xmlns:context
          ="http://www.springframework.org/schema/context"
          xmlns:mvc
          ="http://www.springframework.org/schema/mvc"
          xsi:schemaLocation
          ="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/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,所以這里指定了需要被掃描的包路徑,如果有多個可以使用逗號分隔
          <mvc:annotation-driven />

          上面的spring mvc流程圖中我們知道DispatcherServlet接管請求后,會由HandlerMapping來執行映射,所以我們需要注冊HanlderMapping,比如上面的標簽會自動注冊比如DefaultAnnotationHandlerMapping(執行請求到Controller的映射)和AnnotationMethodHandlerAdapter(調用controller中的方法)這樣的bean,當然這個標簽還提供了其他的一些支持(更多介紹請參照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處理完畢后會交給一個ViewResolver進行處理,大體上是解析視圖邏輯名并經過一定的處理獲取一個視圖,這里的意思是設置視圖用jsp來處理(比如我們設置viewClass為JstlView)來進行處理,就是以forward的形式轉發給jsp,這個地址是:/WEB-INF/views/[controller返回值].jsp ,當然視圖解析器可以定義多個,(視圖解析器不會處理ModelAndView中已經設置了View的請求,因為已經有View來處理了,那當然就不需要它來解析到真正的視圖View啦)
          編寫Controller控制器這里我們使用例子的形式來說明

          實現一個控制器類@Controller
          @Controller
          @RequestMapping(
          "/user")
          public class UserControl {

          }

          只要給類加上Controller的注解,并放在被掃描的包中,那么這個類就是一個控制器了,RequestMapping表明匹配的路徑,可以寫在類或者類的方法上,如果類上面有RequestMapping注解,那么其下面的方法就是相對于類上面注解地址的一個相對路徑


          定義一個接管請求的方法方法名:無任何要求
          --------------------------------------------------------------
          參數:(順序以及個數無任何要求)
          HttpServletRequest
          HttpServletResponse
          PrintWriter 相當于HttpResponse.getWriter()獲得的對象
          Map 其實是獲得了ModelAndView中的Model
          BindingResult 綁定數據的處理結果
          HttpSession 如果使用此參數,需要注意如果是第一次訪問還沒有session的話會報錯
          @PathVariable 用于接收路徑變量
          @RequestParam 相當于調用request.getParameter(“name”)方法
          @CookieValue 獲取cookie的值
          @RequestHeader 獲取header中的值
          實體對象 會根據請求的參數名,注入到這個對象對于得屬性中,必須提供set方法
          等等等等等
          --------------------------------------------------------------
          返回值:
          void
          返回值是void,如果接收了PrintWriter 或者 HttpServletResponse 參數,那么返回的ModelAndView就是null,也就是直接將輸出流輸出到客戶端,如果方法沒有接收輸出參數,后面會默認生成一個視圖名

          String 視圖邏輯名

          ModelAndView 是一個視圖邏輯名+Map的封裝類
          其他任意類型 存入ModelAndView中的Model
          --------------------------------------------------------------

          不管我們的返回類型是什么,返回值會通過處理,最終返回一個ModelAndView或者null
          例1:給方法定義一個請求映射并使用路徑變量 @RequestMapping("/id/{userid}/name/{username}")

          @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 就能進入上面的方法
          RequestMapping還可以使用通配符,如: /test/*/name/{name}

          例2:接受請求參數@RequestMapping("/save")
          @RequestMapping("/save")
          public String save(@RequestParam("userName") String userName,@RequestParam("Age"int age) {
                 System.out.println(userName);
                 System.out.println(age);
                 
          return "Home";
          }


          例3:請求參數直接注入到Model@RequestMapping("/save")
          @RequestMapping("/save")
          public String save(User user) {
                 System.out.println(user.getUserID());
                 System.out.println(user.getUserName());
                 
          return "Home";
          }

          例4:轉發與重定向轉發: (相當于 request.getRequestDispatcher(“”).forward(request, response))
          return “forward:/user/test”;

          重定向: (相當于response.redirect(“”))
          return “redirect:/user/test”
          return “redirect:http://www.google.com.hk”;

          例5:根據HttpMethod來過濾請求
          @RequestMapping(params="hello=world", method={RequestMethod.GET, RequestMethod.POST}
          public String helloworld() {
          }
           


          例6:根據參數來進行過濾
          @RequestMapping(params="hello=world", method={RequestMethod.GET, RequestMethod.POST})  
          public String helloworld() {
          }
            

          必須有個hello的參數并且名稱為world,而且只能是get或post請求才會進入此方法

          http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315425.html

          posted on 2012-03-29 19:06 paulwong 閱讀(1162) 評論(0)  編輯  收藏 所屬分類: SPRING MVC

          主站蜘蛛池模板: 韩城市| 巴东县| 镇宁| 枣强县| 百色市| 孝感市| 青田县| 沈阳市| 湘潭市| 聂拉木县| 西平县| 林甸县| 徐闻县| 扶绥县| 迭部县| 湟中县| 共和县| 阳城县| 鄂托克旗| 靖安县| 姜堰市| 怀安县| 洛浦县| 衡水市| 白朗县| 桑植县| 福安市| 安阳市| 秦皇岛市| 昌江| 光山县| 正宁县| 广宁县| 江城| 柘城县| 鄂温| 如东县| 怀集县| 华池县| 兰西县| 神农架林区|