天天看點

springmvc環境搭建 & 請求參數綁定 & 常用注解 ->(個人學習記錄筆記)

@

目錄

  • springmvc
    • 1. 搭建開發環境
      • 1.1 建立項目
      • 1.2 配置maven
      • 1.3 前端控制器配置
      • 1.4 建立springmvc配置檔案
    • 2. 執行過程
      • 2.1 入門案例的執行流程
      • 2.2 SpringMVC官方提供圖形
      • 2.3 入門案例中的元件分析
      • 2.4 @RequestMapping注解
    • 3. 請求參數的綁定
      • 3.1 請求參數的綁定說明
        • 3.1.1 綁定機制
        • 3.1.2 支援的資料類型
      • 3.2 基本資料類型和字元串類型
      • 3.3 實體類型(JavaBean)
      • 3.4 給集合屬性資料封裝
      • 3.5 請求參數中文亂碼的解決
      • 3.6 自定義類型轉換器
      • 3.7 在控制器中使用原生的ServletAPI對象
    • 4. 常用的注解
      • 4.1 @RequestParam注解
      • 4.2 @RequestBody注解
      • 4.3 @PathVariable注解
      • 4.4 @RequestHeader注解
      • 4.5 @CookieValue注解
      • 4.5 @ModelAttribute注解
      • 4.5 @SessionAttributes注解

springmvc環境搭建 & 請求參數綁定 & 常用注解 ->(個人學習記錄筆記)
  • 添加鍵值對,加快建構時間
  • key: archetypeCatalog

  • value: internal

springmvc環境搭建 & 請求參數綁定 & 常用注解 ->(個人學習記錄筆記)

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--  版本鎖定  -->
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
           

  • web.xml
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <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>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--配置解決中文亂碼的過濾器-->
  <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>

</web-app>

           

springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)
springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
    <!--  開啟注解掃描  -->
    <context:component-scan base-package="xyz.slienceme"/>
    
</beans>
           

  1. 當啟動

    Tomcat

    伺服器的時候,因為配置了

    load-on-startup

    标簽,是以會建立

    DispatcherServlet

    對象,就會加載

    springmvc.xml

    配置檔案
  2. 開啟了注解掃描,那麼

    HelloController

    對象就會被建立
  3. index.jsp

    發送請求,請求會先到達

    DispatcherServlet

    核心控制器,根據配置

    @RequestMapping

    注解找到執行的具體方法
  4. 根據執行方法的傳回值,再根據配置的視圖解析器,去指定的目錄下查找指定名稱的

    JSP

    檔案
  5. Tomcat

    伺服器渲染頁面,做出響應

springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)

  1. 前端控制器(

    DispatcherServlet

  2. 處理器映射器(

    HandlerMapping

  3. 處理器(

    Handler

  4. 處理器擴充卡(

    HandlAdapter

  5. 視圖解析器(

    View Resolver

  6. 視圖(

    View

2.4

@RequestMapping

注解

  • 作用:建立請求

    URL

    和處理方法之間的對應關系
  • 範圍:可以作用在方法和類上
    • 作用在類上:第一級的通路目錄
    • 作用在方法上:第二級的通路目錄
    • 細節:路徑可以不編寫

      /

      表示應用的根目錄開始
    • 細節:

      ${ pageContext.request.contextPath }

      也可以省略不寫,但是路徑上不能寫

      /

  • 屬性
    1. path

      指定請求路徑的

      url

    2. value

      value屬性和path屬性是一樣的
    3. method

      指定該方法的請求方式
    4. params

      指定限制請求參數的條件 要求key和value必須一緻
    5. headers

      發送的請求中必須包含的請求頭
/**
     * RequestMapping注解
     * @return
     */
	@RequestMapping(value="/testRequestMapping",method = {RequestMethod.POST},params = {"username=heihei"},headers = {"Accept"})
    public String testRequestMapping(){
        System.out.println("測試RequestMapping注解...");
        return "success";
    }
           

  1. 表單送出的資料都是

    k=v

    格式的

    username=haha&password=123

  2. SpringMVC

    的參數綁定過程是把表單送出的請求參數,作為控制器中方法的參數進行綁定的
  3. 要求:送出表單的name和參數的名稱是相同的

  1. 基本資料類型和字元串類型
  2. 實體類型(

    JavaBean

  3. 集合資料類型(

    List

    map

    集合等)

  1. 送出表單的name和參數的名稱是相同的
  2. 區分大小寫

  1. 送出表單的name和JavaBean中的屬性名稱需要一緻
  2. 如果一個

    JavaBean

    類中包含其他的引用類型,那麼表單的

    name

    屬性需要編寫成:

    對象.屬性

    例如:

    address.name

  • 把資料封裝Account類中
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密碼:<input type="text" name="password" /><br/>
    金額:<input type="text" name="money" /><br/>
    使用者姓名:<input type="text" name="user.uname" /><br/>
    使用者年齡:<input type="text" name="user.age" /><br/>
    <input type="submit" value="送出" />
</form>
           

  1. JSP

    頁面編寫方式:list[0].屬性
  • 把資料封裝Account類中,類中存在list和map的集合
<form action="param/saveAccount" method="post">
     姓名:<input type="text" name="username" /><br/>
     密碼:<input type="text" name="password" /><br/>
     金額:<input type="text" name="money" /><br/>

     使用者姓名:<input type="text" name="list[0].uname" /><br/>
     使用者年齡:<input type="text" name="list[0].age" /><br/>

     使用者姓名:<input type="text" name="map['one'].uname" /><br/>
     使用者年齡:<input type="text" name="map['one'].age" /><br/>
     <input type="submit" value="送出" />
</form>
           
  • 實體類添加屬性
private List<User> list;
private Map<String,User> map;
           

  1. web.xml

    中配置Spring提供的過濾器類
<!--配置解決中文亂碼的過濾器-->
  <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>
           

  1. 表單送出的任何資料類型全部都是字元串類型,但是背景定義

    Integer

    類型,資料也可以封裝上,說明

    Spring

    架構内部會預設進行資料類型轉換。
  2. 如果想自定義資料類型轉換,可以實作

    Converter

    的接口
  1. 自定義類型轉換器
package xyz.slienceme.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 把字元串轉換日期
 */
public class StringToDateConverter implements Converter<String,Date>{

    /**
     * String source    傳入進來字元串
     * @param source
     * @return
     */
    public Date convert(String source) {
        // 判斷
        if(source == null){
            throw new RuntimeException("請您傳入資料");
        }
        
        try {
            // 把字元串轉換日期 解析字元串
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			Date date = df.parse(source);
			return date;
        } catch (Exception e) {
            throw new RuntimeException("資料類型轉換出現錯誤");
        }
    }

}

           
  1. 注冊自定義類型轉換器,在

    springmvc.xml

    配置檔案中編寫配置
<!--配置自定義類型轉換器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
     <property name="converters">
         <set>
             <bean class="xyz.slienceme.utils.StringToDateConverter"/>
         </set>
     </property>
 </bean>


 <!-- 開啟SpringMVC架構注解的支援 -->
 <mvc:annotation-driven conversion-service="conversionService"/>
           

  1. 隻需要在控制器的方法參數定義

    HttpServletRequest

    HttpServletResponse

    對象

4.1

@RequestParam

  1. 作用:把請求中的指定名稱的參數傳遞給控制器中的形參指派
    1. value

      :請求參數中的名稱
    2. required

      :請求參數中是否必須提供此參數,預設值是

      true

      ,必須提供的是name,必須與

      <a href="anno/testRequestParam?name=哈哈">RequestParam</a>

      中的參數name相同,否則報錯
  2. 代碼如下
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>
           
/**
* 接收請求
* @return
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name",required=false) String username){
     System.out.println("執行了...");
     System.out.println(username);
     return "success";
 }
           
  • 單純拿到

    name

    參數

4.2

@RequestBody

  1. 作用:用于擷取請求體的内容(

    注意:get方法不可以

    1. required

      :是否必須有請求體,預設值是

      true

<form action="anno/testRequestBody" method="post">
   使用者姓名:<input type="text" name="username" /><br/>
   使用者年齡:<input type="text" name="age" /><br/>
   <input type="submit" value="送出" />
</form>
           
/**
* 擷取到請求體的内容
* @return
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
    System.out.println("執行了...");
    System.out.println(body);
    return "success";
}
           
  • 得到

    username=zhangsan&age=123

4.3

@PathVariable

  1. 作用:擁有綁定

    url

    中的占位符的。例如:

    url

    中有

    /delete/{id}

    {id}

    就是占位符
    1. value

      :指定

      url

      中的占位符名稱
  2. Restful風格的URL
    1. 請求路徑一樣,可以根據不同的請求方式去執行背景的不同方法
    2. restful風格的URL優點
      1. 結構清晰
      2. 符合标準
      3. 易于了解
      4. 擴充友善
<a href="anno/testPathVariable/10">testPathVariable</a>
           
<a href="user/hello/1">入門案例</a>
/**
 * PathVariable注解
 * @return
 */
@RequestMapping(value="/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id){
    System.out.println("執行了...");
    System.out.println(id);
    return "success";
}
           
springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)

4.4

@RequestHeader

  1. 作用:擷取指定請求頭的值
    1. value

      :請求頭的名稱
<a href="anno/testRequestHeader">RequestHeader</a>
           
/**
* 擷取請求頭的值
* @param header
* @return
*/
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header, HttpServletRequest request,HttpServletResponse response) throws IOException {
   System.out.println("執行了...");
   System.out.println(header);
   // return "success";
   // response.sendRedirect(request.getContextPath()+"/anno/testCookieValue");
   return "redirect:/param.jsp";
}
           
springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)

4.5

@CookieValue

  1. 作用:用于擷取指定

    cookie

    的名稱的值
    1. value

      cookie

      的名稱
  2. 代碼
<a href="anno/testCookieValue">CookieValue</a>
           
/**
 * 擷取Cookie的值
 * @return
 */
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
    System.out.println("執行了...");
    System.out.println(cookieValue);
    return "success";
}
           
springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)

@ModelAttribute

  1. 作用
    1. 出現在方法上:表示目前方法會在控制器方法執行前先執行。
    2. 出現在參數上:擷取指定的資料給參數指派。
  2. 應用場景
    1. 當送出表單資料不是完整的實體資料時,保證沒有送出的字段使用資料庫原來的資料。
  3. 具體的代碼
<form action="anno/testModelAttribute" method="post">
  使用者姓名:<input type="text" name="uname" /><br/>
    使用者年齡:<input type="text" name="age" /><br/>
    <input type="submit" value="送出" />
</form>
           
  1. 修飾的方法有傳回值
/**
* 作用在方法,先執行
* @param name
* @return
*/
@ModelAttribute
public User showUser(String uname) {
	System.out.println("showUser執行了...");
	// 模拟從資料庫中查詢對象
	User user = new User();
	user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
	return user;
}
/**
* 修改使用者的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/testModelAttribute")
public String updateUser(User user) {
	System.out.println(user);
	return "success";
}
           
  1. 修飾的方法沒有傳回值
/**
* 作用在方法,先執行
* @param name
* @return
*/
@ModelAttribute
public void showUser(String uname,Map<String, User> map) {
	System.out.println("showUser執行了...");
	// 模拟從資料庫中查詢對象
	User user = new User();
	user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
	map.put("abc", user);
}
/**
* 修改使用者的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/testModelAttribute")
public String updateUser(@ModelAttribute(value="abc") User user) {
	System.out.println(user);
	return "success";
}
           
springmvc環境搭建 &amp; 請求參數綁定 &amp; 常用注解 ->(個人學習記錄筆記)

@SessionAttributes

  1. 作用:用于多次執行控制器方法間的參數共享
    1. value

      :指定存入屬性的名稱
<a href="anno/testSessionAttributes">testSessionAttributes</a>
<a href="anno/getSessionAttributes">getSessionAttributes</a>
<a href="anno/delSessionAttributes">delSessionAttributes</a>
           
@Controller
@RequestMapping(path="/user")
@SessionAttributes(value={"msg"})   // 把msg=美美資料存入到session域對中
public class HelloController {
	
	/**
     * 向session中存入值
     * @return
     */
    @RequestMapping(value="/testSessionAttributes")
    public String saveSessionAttributes(Model model){
        System.out.println("saveSessionAttributes...");
        // 底層會存儲到request域對象中
        model.addAttribute("msg","美美");
        return "success";
    }

    /**
     * 從session中擷取值
     * @param modelMap
     * @return
     */
    @RequestMapping(value="/getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap){
        System.out.println("getSessionAttributes...");
        String msg = (String) modelMap.get("msg");
        System.out.println(msg);
        return "success";
    }

    /**
     * 從session中清除值
     * @param status
     * @return
     */
    @RequestMapping(value="/delSessionAttributes")
    public String delSessionAttributes(SessionStatus status){
        System.out.println("getSessionAttributes...");
        status.setComplete();
        return "success";
    }
}
           

注:(之前的前端筆記傳送門)

1. HTML初學

2. CSS初學

3. JavaScript初學

4. JQuery初學

5. HTML複學

6. CSS複學

7. JavaScript基礎 複學

8. JavaScript進階 複學

9. BootStrap簡單了解