SpringMVC詳解(一)

1.     SpringMVC概述

1.1.  什麼是Spring MVC

SpringMVC是Spring框架內置的MVC的實現.SpringMVC就是一個Spring內置的MVC框架.html

MVC框架,它解決WEB開發中常見的問題(參數接收、文件上傳、表單驗證、國際化、等等),並且使用簡單,與Spring無縫集成。 支持 RESTful風格的 URL 請求 。前端

採用了鬆散耦合可插拔組件結構,比其餘 MVC 框架更具擴展性和靈活性。java

 

1.2.  SpringMVC的做用

MVC模式:(Model-View-Controller):爲了解決頁面代碼和後臺代碼的分離.程序員

2.     SpringMVC底層實現

在沒有使用SpringMVC以前咱們都是使用的Servlet在作Web開發。可是使用Servlet開發在接受請求數據參數,數據共享,頁面跳轉等操做相對比較複雜。web

 

SpringMVC底層就是的Servlet,SpringMVC就是對Servlet進行更深層次的封裝ajax

 

2.1.  回顧MVC模式

回顧什麼是mvc模式  spring

   模型model(javabean),  視圖view(jsp/img)   控制器Controller(Action/servlet)   C存在的目的.就是爲了保證M和V的一致性apache

   當M發生改變時,C能夠把M中的新內容更新到V中.json

 

2.1.1.  原始MVC 模式

MVC模式最先開始是在CS 架構上面 20世紀70+年代後端

下面爲原始的mvc模式.

目前web應用中,99%的項目都會使用mvc模式開發.

 

 

2.1.2.  WEB開發的MVC

WEB開發從20世紀90+年代開始,也是使用MVC模式。在最原始的MVC上有一些改進

優秀的框架改變了這種模式,將model更普遍的使用,這樣會比原始的mvc好多了.

像如今一些優秀的mvc的框架,如Struts2,springMVC

在客戶端提交也使用了模型來請求參數

spring MVC 也實現的相關的功能

 

 

3.     入門案例 -xml 配置

3.1.  準備工做

建立動態Web項目

 

3.2.  步驟

3.3.  準備jar包

 

3.4.  SpringMVC開發相關jar包

spring-web-4.3.3.RELEASE.jar         spring 對web項目的支持。

spring-webmvc-4.3.2RELEASE.jar   spring mvc核心包。

 

 

3.5.  編寫Controller控制器(與之前servlet相似)

public class HelloController implements Controller  {

    @Override

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

         ModelAndView mv = new ModelAndView();

         mv.addObject("username", "師姐");

         mv.setViewName("/WEB-INF/hello/hello.jsp");

         return mv;

    }

}

3.6.  在springmvc.xml配置 Controller

   <!--

         name : 給當前控制器取的一個名字,至關於Servlet中的資源名稱,以便瀏覽器訪問,必須以斜槓/開頭

             建議使用 name屬性,不要使用id,由於早期版本 id 不支持特殊字符 如 /斜槓

      -->

    <bean name="/hello" class="cn.zj.springmvc.HelloController"/>

3.7.  配置spring mvc核心(前端)控制器,而且初始化spring容器。 web.xml配置.

<!-- 配置前端控制器 :全部的請求都會通過此控制器,讓後經過此控制器分發到各個控制器(總控)

         總控其實就是Servlet,SpringMVC底層就是使用Servlet編寫的

     -->

    <servlet>

         <servlet-name>springMVC</servlet-name>

         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

         <!-- 讀取SpringMVC的配置文件 -->

         <init-param>

             <param-name>contextConfigLocation</param-name>

             <param-value>classpath:springmvc.xml</param-value>

         </init-param>

         <!-- 初始化容器 -->

         <load-on-startup>1</load-on-startup>

    </servlet>

   

    <servlet-mapping>

         <servlet-name>springMVC</servlet-name>

         <url-pattern>/</url-pattern>

    </servlet-mapping>

3.8.  啓動項目

 

3.9.  訪問項目

 

 

 

4.     SpringMVC的全註解開發

4.1.  Spring中IOC 註解

註解

說明

@Component

通用組件註解(通常配置其餘非三層相關的類)

@Controller

表現層(控制層)    

@Service

業務邏輯層(服務Service)

@Resposotory

數據持久層(DAO)

 

4.2.  SpringMVC使用註解步驟

4.2.1.  Spring mvc 採用註解方式(須要導入aop的包)

 

 

4.2.2.  經過註解方式註冊控制器,配置須要掃描的根目錄

<context:component-scan base-package="cn.zj.springmvc"/>

4.2.3.  支持全部mvc註解支持。支持json

<mvc:annotation-driven/>

4.2.4.  在覈心類上添加@Controller 註解

4.2.5.  在方法上添加@RequestMapping("/hello")註解

4.3.  案例代碼

@Controller

public class AnnotationController  {

    //@RequestMapping(value= {"/method1","/method2"})

    @RequestMapping("method1")

    public ModelAndView mehtod1() {

         ModelAndView mv = new ModelAndView();

         mv.addObject("username", "喬峯");

         mv.setViewName("/WEB-INF/anno/index.jsp");

         return mv;

    }

}

 

 

 

 

 

5.     SpringMVC執行流程和原理

 

SpringMVC流程:

0一、用戶發送出請求到前端控制器DispatcherServlet。

0二、DispatcherServlet收到請求調用HandlerMapping(處理器映射器)。

0三、HandlerMapping找到具體的處理器(可查找xml配置或註解配置),生成處理器對象及處理器攔截器(若是有),再一塊兒返回給DispatcherServlet。

0四、DispatcherServlet調用HandlerAdapter(處理器適配器)。

0五、HandlerAdapter通過適配調用具體的處理器(Handler/Controller)。

0六、Controller執行完成返回ModelAndView對象。

0七、HandlerAdapter將Controller執行結果ModelAndView返回給DispatcherServlet。

0八、DispatcherServlet將ModelAndView傳給ViewReslover(視圖解析器)。

0九、ViewReslover解析後返回具體View(視圖)。

十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。

十一、DispatcherServlet響應用戶。

 

 

涉及組件分析:

一、前端控制器DispatcherServlet(不須要程序員開發),由框架提供,在web.xml中配置。

做用:接收請求,響應結果,至關於轉發器,中央處理器。

 

二、處理器映射器HandlerMapping(不須要程序員開發),由框架提供。

做用:根據請求的url查找Handler(處理器/Controller),能夠經過XML和註解方式來映射。

 

三、處理器適配器HandlerAdapter(不須要程序員開發),由框架提供。

做用:按照特定規則(HandlerAdapter要求的規則)去執行Handler。

 

4、處理器Handler(也稱之爲Controller,須要工程師開發)

注意:編寫Handler時按照HandlerAdapter的要求去作,這樣適配器才能夠去正確執行Handler。

做用:接受用戶請求信息,調用業務方法處理請求,也稱之爲後端控制器。

 

五、視圖解析器ViewResolver(不須要程序員開發),由框架提供

做用:進行視圖解析,把邏輯視圖名解析成真正的物理視圖。

SpringMVC框架支持多種View視圖技術,包括:jstlView、freemarkerView、pdfView等。

 

六、視圖View(須要工程師開發)

做用:把數據展示給用戶的頁面

View是一個接口,實現類支持不一樣的View技術(jsp、freemarker、pdf等)

具體組件的配置相關,請查閱

spring-webmvc-4.3.2.RELEASE.jar 包

下面

/org/springframework/web/servlet/DispatcherServlet.properties 的相關配置

HanderMapping 請求映射處理器

    做用:根據不一樣的請求選擇最合適的處理器(本身編寫的控制器),請求映射處理器能夠配置多個,誰最早匹配就執行誰。

    Spring MVC默認:/org/springframework/web/servlet/DispatcherServlet.properties

   org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\

                                                                                          org.springframework.web.servlet.do.annotation.DefaultAnnotationHandlerMapping

  BeanNameUrlHandlerMapping:處理經過<bean name="/xxx">註冊的控制器。控制器須要實現Controller接口。

 

  DefaultAnnotationHandlerMapping:處理經過註解@Controller(類標籤) 及@RequestMapping(方法標籤) 註冊的控制器。 該請求映射處理器已經在Spring 3.2 版本過期,替換爲RequestMappingHandlerMapping。

 

  spring 中提供的映射處理器:

       org.springframework.web.servlet.handler.SimpleUrlHandlerMapping   簡單url請求映射處理器。

       <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

         <property name="mappings">

           <value>

              /helloworld=helloworldController

              /helloworld002=helloworldController

           </value>

        </property>

     </bean>

       org.springframework.web.servlet.do.method.annotation.RequestMappingHandlerMapping  採用註解方式請求映射處理器。

HandlerAdapter 處理器適配

HandlerAdapter 處理器適配:

   做用: 支持多種類型的處理器,如何來執行"處理器(控制器)「;

     Spring MVC默認:

    org.springframework.web.servlet.HandlerAdapter=

                                                                                        org.springframework.web.servlet.do.HttpRequestHandlerAdapter,\

                                                                                        org.springframework.web.servlet.do.SimpleControllerHandlerAdapter,\

                                                                                        org.springframework.web.servlet.do.annotation.AnnotationMethodHandlerAdapter

 

    org.springframework.web.servlet.do.HttpRequestHandlerAdapter 處理實現了HttpRequestHandler對應的控制器。

           核心代碼:

          public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)

           throws Exception {

 

              ((HttpRequestHandler) handler).handleRequest(request, response);

           return null;

    }

 

   org.springframework.web.servlet.do.SimpleControllerHandlerAdapter 處理實現了Controller對應的控制器。

 

      public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)

              throws Exception {

 

           return ((Controller) handler).handleRequest(request, response);

       }

   

    org.springframework.web.servlet.do.annotation.AnnotationMethodHandlerAdapter  處理經過註解方式的控制器。 3.2中已過期,替換爲org.springframework.web.servlet.do.method.annotation.RequestMappingHandlerAdapter

ViewResolver 視圖解析器

   做用:根據不一樣的視圖,響應不一樣的結果,好比普通的jsp或json.

   Spring mvc默認:

   org.springframework.web.servlet.ViewResolver=

                                                            org.springframework.web.servlet.view.InternalResourceViewResolver

  

   InternalResourceViewResolver : 支持默認視圖,採用forward,redirect。

   視圖名:

          不寫前綴默認爲"轉發"

          視圖名字符串前綴:

           forward:/xxx.jsp 採用轉發。

          redirect:/xxx.jsp  採用重定向。

 

        new ModelAndView("forward:/userList");

        new ModelAndView("redirect:/userList");

   

   註冊視圖解析器:

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/" />

        <property name="suffix" value=".jsp" />

     </bean>

6.     對靜態資源訪問

咱們這樣的配置有這樣一個問題

         在Web根路徑添加index.html,而後不能訪問,緣由是什麼呢?爲何此時在配置前端控制器的URL模式(<url-pattern>)寫成 / 就不行呢?

 

緣由:

Tomcat中處理靜態資源訪問的servlet(default)的映射路徑爲/.

         在啓動項目的時候,在Tomcat中的web.xml是先加載的,項目的web.xml是後加載的,若是配置了相同的映射路徑,後面的會覆蓋前者.

         也就是說,SpringMVC中的DispatcherServlet的映射路徑覆蓋了Tomcat默認對靜態資源的處理的路徑。

         若是SpringMVC要配置爲/,那麼就得設置Dispatcherservlet對靜態資源進行支持。

 

Tomcat 根/confg/web.xml  103行

<servlet>

        <servlet-name>default</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <init-param>

            <param-name>listings</param-name>

            <param-value>false</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

</servlet>

    <servlet-mapping>

        <servlet-name>default</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

 

解決方案:須要在SpringMVC的配置文件中添加對靜態資源的訪問

         <mvc:default-servlet-handler/>

-----------------------------------------------------------------------------------------

<mvc:default-servlet-handler/> 將在 SpringMVC 上下文中定義一個 DefaultServletHttpRequestHandler,它會對進入 DispatcherServlet  的請求進行篩查,若是發現是沒有通過映射的請求,就將該請求交由 Tomcat默認的 Servlet 處理,若是不是靜態資源的請求,才由 DispatcherServlet  繼續處理

-----------------------------------------------------------------------------------------

 /和/*的區別:

/  會匹配url請求/index等 ,也會匹配靜態資源*.js,*.html等, 不會匹配*.jsp文件。

/* 會匹配url請求/index等 ,也會匹配靜態資源*.js,*.html等,  會匹配*.jsp文件。

實際開發中通常推薦使用  *.後綴  如  *.do *.action *.do

<servlet-mapping>

    <servlet-name>springMVC</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

 

7.     Spring請求響應

7.1.  @RequestMapping

@RequestMapping註解主要是設置SpringMVC請求的映射路徑

所謂的映射路徑,就是匹配請求路徑和執行方法關係的路徑.

 

請求路徑:http://localhost:8080/springmvc/method1.do

映射路徑:@RequestMapping(value="/method1")

 

@RequestMapping 用於貼在控制器的類上或者方法上面

若是是貼在控制器的類上面,那麼在訪問這個類的方法以前必須先加上類上的對應的名稱

相似於 項目下面的 模塊名稱

若是貼在方法上面,就是訪問此方法的資源名稱

@Controller

@RequestMapping("/request")  //訪問時候必須加上,相似模塊名稱

public class RequestController {

    @RequestMapping(value="/method1") //資源名稱

    public void method1() {

    }

}

訪問地址  : http://localhost:8080/springmvc/request/method1.do

 

7.2.  兩種限制

SpringMVC支持對請求的限制.若是不知足限制的條件,就不讓訪問執行方法.

 

這樣作,大大提升了執行方法的安全性.

 

主要的限制有兩種:(method)方法限制,參數限制

7.2.1.  方法限制

就是設置請求的method類型.若是發送過來的請求與方法設置的method不同,就不能訪問執行方法.

 

請求method : GET , POST

  <form action="${pageContext.request.contextPath }/login.do" method="get">

    <input type="submit" value="登陸">

  </form>

 

    /**

     * 接收的請求,必須是POST

     * @return

     */

    @RequestMapping(value="login",method=RequestMethod.POST)

    public String login(){

         System.out.println("-登陸-");

         return "/login.jsp";

    }

 

前臺發送的是GET請求,而方法限制是POST請求,因此請求沒法執行方法

 

 

方法限制能夠配置多個參數

    @RequestMapping(value="login",method={RequestMethod.GET,RequestMethod.POST})

    public String login(){

         System.out.println("-登陸-");

         return "/login.jsp";

    }

7.2.2.  參數限制

1.就是請求裏面必須包括哪些參數,或不包括哪些哪些.

2.參數包括哪些值,不包括哪些值

 

限制參數格式:

1.參數必須包括:params={"username","password"}

2.參數不能包括:params={"!userid"}

3參數值必須是指定的值:params={"username=zhangsan"})

4.參數值必須不是指定的值:params={"userid!=123"})

 

請求:沒有後臺方法指定的參數

<h4>登陸頁面</h4>

<form action="${pageContext.request.contextPath}/request/method1.do" method="post">

    帳號:<input name="username"><br>

    密碼:<input type="password" name="pwd"><br>

    <button type="submit">登陸</button>

</form>

 

後臺代碼

    /**

     * 需求:登陸時必須包括用戶名,密碼

     * @return

     */

    @RequestMapping(value="login2",params={"username","password"})

    public String login2(){

         System.out.println("-登陸-");

         return "/login.jsp";

    }

若是前臺請求沒有指定後臺要求的參數,會報錯.

 

7.3.  Spring方法參數能夠注入的類型

SpringMVC的方法默承認以注入 JavaWeb開發經常使用的數據共享對象

HttpServletRequest

HttpServletResponse

HttpSession

獲取這些共享對象之後,就能夠向以前的Servlet同樣,作任何數據共享以及頁面跳轉操做

 

/*

 * Spring的方法默承認以注入 JavaWeb開發經常使用的數據共享對象

HttpServletRequest

HttpServletResponse

 * HttpSession 之後開發 按需注入

 */

@RequestMapping(value = "/method0")

public void method0(HttpServletRequest req,

                      HttpServletResponse resp,

                      HttpSession session) {

    //TODO

}

 

8.     數據綁定

8.1.  數據綁定是什麼

SpringMVC裏面,所謂的數據綁定就是將請求帶過來的表單數據綁定到執行方法的參數變量.

 

實際開發中,SpringMVC做爲表現層框架,確定會接受前臺頁面傳遞過來的參數,SpringMVC提供了豐富的接受參數的方法

8.2.  原始方式request.getParameter() 瞭解

SpringMVC能夠注入HttpServletRequest對象,直接使用getParameter參數接受

<!--  原始方式request.getParameter() -->

<fieldset>

    <legend> 原始方式request.getParameter()</legend>

    <form action="${pageContext.request.contextPath}/request/method1.do" method="get">

         帳號: <input name="username"><br>

         年齡: <input name="age"><br>

         <button type="submit">提交</button>

    </form>

</fieldset>

@RequestMapping(value="/method1",method=RequestMethod.POST) //資源名稱

public void method1(HttpServletRequest req,HttpServletResponse resp,HttpSession session) {

          //原始方式request.getParameter()

    String username = req.getParameter("username");

    String age = req.getParameter("age");

    System.out.println(username);

    System.out.println(age);

}

8.3.  方法形參與前臺參數同名

在請求方法形參上,聲明和表單字段名相同的參數名(能夠自動同名匹配,而後進行封裝)

<fieldset>

    <legend>方法形參與前臺參數同名</legend>

    <form action="${pageContext.request.contextPath}/request/method2.do" method="post">

         帳號: <input name="username"><br>

         年齡: <input name="age"><br>

         <button type="submit">提交</button>

    </form>

</fieldset>

//方法形參與前臺參數同名

@RequestMapping(value="/method2",method=RequestMethod.POST)

public ModelAndView method2(String username,String age) {

    System.out.println(username);

    System.out.println(age);

    return null;

}

8.4.  方法形參與前臺參數不一樣名

<fieldset>

    <legend>方法形參與前臺參數不一樣名</legend>

    <form action="${pageContext.request.contextPath}/request/method3.do" method="post">

         帳號: <input name="name"><br>

         年齡: <input name="age"><br>

         <button type="submit">提交</button>

    </form>

</fieldset>

// 方法形參與前臺參數不一樣同名

// 解決方案使用 : @RequestParam("前臺表單對應的名")

@RequestMapping(value = "/method3", method = RequestMethod.POST)

public ModelAndView method3(@RequestParam("name") String username, String age) {

    System.out.println(username);

    System.out.println(age);

    return null;

}

 

8.5.  接受數組

<fieldset>

    <legend>接收數組或集合</legend>

    <form action="${pageContext.request.contextPath}/request/method4.do" method="post">

         帳號: <input name="name"><br>

         年齡: <input name="age"><br>

         愛好: <input type="checkbox" name="hobbys" value="java">java

         <input type="checkbox" name="hobbys" value="html">html<br>

         <button type="submit">提交</button>

    </form>

</fieldset>

// 接受數組

    @RequestMapping(value = "/method4", method = RequestMethod.POST)

    public ModelAndView method4(String[] hobbys) {

         System.out.println(Arrays.toString(hobbys));

         return null;

    }

8.6.  對象傳參

後臺並不能直接接受集合參數,須要將集合設置到對應的JavaBean中,經過JavaBean接受集合參數

Pojo對象

public class User {

    private String username;

    private String password;

    private String email;

    private String phone;

    private String[] hobby;

}

<fieldset>

    <legend>接受對象,表單參數名必須和後臺pojo對象對應的屬性名相同</legend>

    <form action="${pageContext.request.contextPath}/request/method5.do" method="get">

         帳號: <input name="username"><br>

         密碼: <input type="password" name="password"><br>

         郵箱: <input name="email"><br>

         電話: <input name="phone"><br>

         愛好:<input type="checkbox" name="hobby" value="java">java

         <input type="checkbox" name="hobby" value="C">C

         <input type="checkbox" name="hobby" value="C++">C++<br/>

         <button type="submit">提交</button>

    </form>

</fieldset>

// 對象傳參->對象中有集合

    @RequestMapping(value = "/method5", method = RequestMethod.POST)

    public ModelAndView method4(User user) {

         System.out.println(user);

         return null;

    }

8.7.  接受參數封裝成Map集合

<fieldset>

    <legend>接受參數封裝成Map集合</legend>

    <form action="${pageContext.request.contextPath}/request/method6.do" method="post">

         帳號: <input name="username"><br>

         密碼: <input name="password"><br>

         郵箱: <input name="email"><br>

         電話: <input name="phone"><br>

    </form>

</fieldset>

// 接受參數封裝成Map集合

    @RequestMapping(value = "/method6", method = RequestMethod.POST)

    public ModelAndView method6(@RequestParam Map<String,Object> map) {

         System.out.println("map:"+map);

         return null;

    }

 

8.8.  RESTful風格支持

8.8.1.  RESTFUL 風格介紹

REST(英文:Representational State Transfer,簡稱REST)描述了一個架構樣式的網絡系統,好比 web 應用程序。它首次出如今 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規範的主要編寫者之一。在目前主流的三種Web服務交互方案中,REST相比於SOAP(Simple Object Access protocol,簡單對象訪問協議)以及XML-RPC更加簡單明瞭,REST都傾向於用更加簡單輕量的方法設計和實現。值得注意的是REST並無一個明確的標準,而更像是一種設計的風格。

 

 

RESTful一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件能夠更簡潔,更有層次,更易於實現緩存等機制。

 

 

8.8.2.  參數傳遞方法 GET

例如:根據商品id查詢對應的商品信息(京東網站)

 

若是按照咱們web開發應該是將商品id經過get方法跟在地址後面

 

普通方式 https://item.jd.com?product_id=100000287117 京東不支持

 

可是京東不是使用的此種方式,使用的 RESTFUL風格

 

RESTful風格 : https://item.jd.com/100000287117.html

 

 

8.8.3.  案例代碼

// RESTful風格

@RequestMapping(value = "/method7/{product_id}")

public ModelAndView method7(@PathVariable("product_id") Integer product_id) {

    System.out.println(product_id);//1231323123

    return null;

}

 

8.8.4.  瀏覽器訪問地址

localhost:8080/springmvc/request/method7/1231323123.html

 

 

8.8.5.  使用RESTful優點

  1. 可讓頁面僞靜態

頁面訪問感受像在訪問靜態html頁面,實際上訪問時動態頁面(僞靜態)

2,方便搜索引擎的SEO優化

 

8.9.  請求中文亂碼問題

SpringMVC默認接受的參數是ISO-8859-1編碼參數,單字節,不支持中文,Spring提供了一個過濾器可讓開發者自定義請求參數的字符編碼

 

注意:此種方式只對post提交方式有效

    <!-- 統一配置SpringMVC接受請求參數的編碼 -->

    <filter>

         <filter-name>characterEncodingFilter</filter-name>

         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

         <init-param>

             <param-name>encoding</param-name>

             <param-value>UTF-8</param-value>

         </init-param>

    </filter>

    <filter-mapping>

         <filter-name>characterEncodingFilter</filter-name>

         <url-pattern>/*</url-pattern>

    </filter-mapping>

若是提交中文參數的提價是get方式

配置 tomcat/conf/server.xml 添加 URIEncoding="UTF-8"

 <Connector URIEncoding="UTF-8"

 connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 

建議:之後表單通常使用post,get方式請求儘可能不要使用中文做爲參數

9.     響應傳值方式

9.1.  返回void類型和共享數據 : 須要共享數據,頁面跳轉

//返回void類型和共享數據 : 須要共享數據,頁面跳轉

    //必須注入請求響應對象(共享數據,頁面跳轉)

    @RequestMapping("/method1")

    public void method1(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {

         //共享數據

         req.setAttribute("username", "小龍女");

         //跳轉到jsp頁面要顯示數據,就必須使用請求轉發

         req.getRequestDispatcher("/WEB-INF/response/response.jsp").forward(req, resp);

    }

訪問地址: http://localhost:8080/springmvc/response/method1.do

9.2.  返回ModelAndView類型和共享數據

/*

 * 返回ModelAndView類型和共享數據

 *  ModelAndView 模型和視圖

 *  Spring提供此對象能夠集中管理共享數據操做和設置跳轉視圖操做

 *  ModelAndView 只能使用請求轉發

 */

@RequestMapping("/method2")

public ModelAndView method2() {

   ModelAndView mv = new ModelAndView();

   //共享數據,等價於 request對象共享數據的級別

   //mv.addObject(attributeName, attributeValue)

   mv.addObject("username", "楊過");

   //頁面跳轉,等價於request對象的請求轉發

   //mv.setViewName(viewName);

   mv.setViewName("/WEB-INF/response/response.jsp");

   return mv;

}

訪問地址: http://localhost:8080/springmvc/response/method2.do

 

9.3.  配置視圖解析器

9.3.1.  代碼分析圖

 

 

9.3.2.  視圖解析器的配置

<!-- 配置SpringMVC的視圖解析器: 配置前綴和後綴 -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

         <!-- 配置視圖跳轉的前綴 -->

         <property name="prefix" value="/WEB-INF/response/"/>

         <!-- 配置視圖跳轉的後綴 -->

         <property name="suffix" value=".jsp"/>

    </bean>

9.3.3.  配置視圖解析器後的代碼

Controller方法返回字符串表示邏輯視圖名,經過視圖解析器解析爲物理視圖地址。

此時默認的物理視圖地址爲:視圖前綴+返回值+視圖後綴

    @RequestMapping("/method2")

    public ModelAndView method2() {

         ModelAndView mv = new ModelAndView();

         //共享數據,等價於 request對象共享數據的級別

         //mv.addObject(attributeName, attributeValue)

         mv.addObject("username", "楊過");

         //頁面跳轉,等價於request對象的請求轉發

         //mv.setViewName(viewName);

         //沒有配置視圖解析器以前的寫法

         //mv.setViewName("/WEB-INF/response/response.jsp");

         //配置視圖解析器以後的寫法

         mv.setViewName("response");

         return mv;

    }

 

注意: 配置完視圖解析器之後,必須保證,前綴目錄下面必須有對應邏輯視圖名稱所在的 頁面 ,不然可能會報404錯誤

 

9.4.  經過Model方式-設置共享數據

/*

 * Model方式 :  直接將須要共享的數據封裝到Model對象中便可

 *   方法返回String字符傳直接,返回須要跳轉的地址便可

 *    默認使用請求轉發

 */

@RequestMapping("/method3")

public String method3(Model m) {

    //m.addAttribute(attributeName, attributeValue)

    m.addAttribute("username", "小敬哥123");

    //沒有配置視圖解析器以前的寫法

    //return "/WEB-INF/response/response.jsp";

    //配置視圖解析器以後的寫法

    return "model"; //返回邏輯視圖名稱

}

9.5.  自定義請求轉發和重定向跳轉的頁面

 

 * 若是直接使用視圖解析器的配置開發,那麼必須保證視圖解析器前綴目錄下面有對應的頁面文件才能跳轉,不然報錯

 * 默認頁面跳轉也只能使用請求轉發跳轉,不能使用重定向 須要解決問題: 除了使用視圖解析器對應規則的開發,用戶還得自定義跳轉方式,和自定義跳轉頁面 方案:

 * 使用視圖解析器的 請求轉發和重定向配置,能夠打破默認的規則

 * public static final String REDIRECT_URL_PREFIX = "redirect:";

 * public static final String FORWARD_URL_PREFIX = "forward:";

 

9.5.1.  案例代碼

 

// 自定義請求轉發頁面跳轉的地址 : forward: 跳轉的地址

@RequestMapping("/method4")

public String method4(Model m) {

    // m.addAttribute(attributeName, attributeValue)

    m.addAttribute("username", "東方姑娘");

    return "forward:/WEB-INF/views/index.jsp";

}

// 自定義重定向頁面跳轉的地址 redirect: 跳轉的地址

@RequestMapping("/method5")

public String method5() {

    return "redirect:http://www.jd.com";

}

9.6.  返回對象類型和共享數據

方法不返回ModelAndView也不返回String類型對應的邏輯視圖名稱直接返回一個Pojo對象

若是直接返回Pojo對象,項目又配置了視圖解析器規則

 

若是方法中沒有返回ModelAndView對象,此時SpringMVC不知道視圖在哪裏.

此時須要配置視圖解析器org.springframework.web.servlet.view.InternalResourceViewResolver.

物理視圖路徑爲:前綴+請求路徑(上下文路徑+資源名稱)+後綴

必須保證視圖解析器路徑下面必須有 請求路徑對應的頁面

------------------------------------------------------------------

@ModelAttribute做用以下:

一、設置請求參數綁定到Model對象中並傳到視圖頁面的key名.

二、將方法返回值或請求參數綁定到Model對象中並傳到視圖頁面

 

 

@ModelAttribute("userKey")//跳轉頁面使用el表達式獲取的對應的屬性名稱

    @RequestMapping("/method6")

    public User method6() {

         User user = new User();

         user.setUsername("東方姑娘");

         user.setPassword("dfgn");

         user.setEmail("dfgn@qq.com");

         user.setPhone("234234234324");

         return user;

    }

9.7.  轉換JSON數據

在web開發中,前臺頁面常常會發送ajax請求從後臺請求數據,ajax請求給前臺的數據通常都是json 數據。

SpringMVC支持自動將對象轉換JSON格式的數據響應給客戶端

SpringMVC默認使用的是 jackson 做爲對象轉json的工具

 

Fast-json Alibaba

Gson google

Json-lib Apache

 

9.7.1.  步驟

導入jackson的jar包

 

 

案例代碼

@Controller

public class JsonController {

    @RequestMapping("/getUserJson")

    @ResponseBody //把響應的內容設爲普通字符串

    public User getUserJson() {

         User user = new User();

         user.setUsername("東方姑娘");

         user.setPassword("dfgn");

         user.setEmail("dfgn@qq.com");

         user.setPhone("234234234324");

         return user;

    }

   

    @RequestMapping("/getUserJsonList")

    @ResponseBody

    public List<User> getUserJsonList() {

         User user = new User();

         user.setUsername("東方姑娘");

         user.setPassword("dfgn");

         user.setEmail("dfgn@qq.com");

         user.setPhone("234234234324");

        

         List<User> list = new ArrayList<>();

         list.add(user);

         list.add(user);

         list.add(user);

         list.add(user);

         return list;

    }

}

 

10. 小結

1,SpringMVC介紹

(1)     SpringMVC是一個Spring框架下面一個基於MVC模式的 表現層/Web 框架

(2)     SpringMVC 底層就是Servlet,就是對Servlet的封裝

(3)     SpringMVC 接受參數靈活,頁面跳轉,共享數據方便

2,開發步驟

(1)     引入相關依賴jar包

(2)     在web.xml中配置SpringMVC的前端控制器

①    DispatcherServlet

(3)     在springmvc.xml配置文件配置包掃描,開啓Springmvc的註解驅動

①    <context:component-sacn basePackage=’cn.zj.springmvc’>

②    <mvc:annotation-driven>

(4)     新建一個普通類型

①    在類上面貼上 @Controller註解,就是SpringMVC的控制器了

(5)     在類中新建一個方法,而且在方法上面貼上一個註解

①    @RequestMapping(「url地址訪問路徑」)

(6)     在瀏覽器輸入地址便可訪問

3,SpringMVC的請求

(1)     請求方法的限定  GET/POST

(2)     請求參數的限定 ,必須有什麼參數,必須沒有什麼參數,參數值必須是什麼,參數值必須不是什麼

(3)     數據綁定(接受請求參數)

①    表單提交參數名和方法參數名相同 -最多見

②    表單提交參數名和方法參數名不相同

1)       在方法參數前面寫上@RequestParam("和表單參數名相同")

③    數組類型(多值)

④    接受多個參數封裝成 pojo對象

1)       必須保證表單參數名稱和pojo對象屬性名稱相同

⑤    將接受參數封裝成map集合

(4)     支持 RestFul風格

①    @PathVariables()

(5)     SpringMVC中文參數亂碼的問題

①    Post方式 設置過濾器

②    Get方式 修改tomcat 配置

4,SpringMVC的相應

(1)     ModelAndView 共享模型數據而且設置視圖地址

(2)     方法直接返回 String 使用 Model 模型對象共享

(3)     自定義頁面跳轉

①    redirect: 重定向

②    forward:請求轉發

(4)     配置視圖解析器(配置視圖的前綴和後綴)

(5)     返回對象類型

(6)     返回json數據

①    Jackson+@ResponseBody

相關文章
相關標籤/搜索