1. 程式人生 > >06-springMVC-引數繫結-01

06-springMVC-引數繫結-01

springMVC引數的繫結01

前言:

本篇介紹大概內容如下:

  1. 簡單引數的繫結
  2. @RequestParam註解的用法
  3. 如何用pojo接收引數(擴充套件了pojo和javaBean的介紹)
  4. 如何用包裝的pojo接收引數。

1. 簡單型別繫結

1.1 前臺請求引數和後臺處理器形參同名

  • 當前臺頁面的請求引數名稱和Handler處理器方法的形參名稱一致
    時 , 會將請求的引數與形參自動進行繫結。
    例如前臺表單:
	<form action= "${pageContext.request.contextPath}/hello2.action" method = "post">
	     姓名: <input type="text" name="usersss" />
	<input type="submit" value= "提交"/>

後臺處理:

@RequestMapping("/hello2")
	public String helloWorld2(String usersss, HttpServletRequest request,HttpServletResponse response,ModelMap modelMap) {
		System.out.println(usersss);
}

前臺條表單提交以後,其值可以直接繫結上述同名的usersss中。可以直接使用。

1.2 前臺請求引數和後臺處理器形參不同名

  • 使用@RequestParam註解,繫結引數(不要求和請求引數同名)
    該註解的屬性有:
屬性名 描述
value 要繫結的請求引數的名字(是表單的話就是name的值)
required 是否必須, 預設為true,即必須有引數,否則會報錯
defaultValue 預設值,表示如果請求中沒有要繫結的引數時的預設值。即在請求中找不到設定的value屬性的值時
	@RequestMapping("/hello2")
	public String helloWorld2(@RequestParam(value="usersss",required=false) String u, HttpServletRequest request,HttpServletResponse response,ModelMap modelMap) {
		System.out.println(u+"=============");
	}

這裡的u的值 (其實也就是改了個名字)和上邊同名的效果是一樣的, 建議無特殊需要還是使用同名的比較好。

1.3 支援繫結的資料型別

後臺處理器的形參最好使用包裝資料型別,因為基礎型別沒有null值

型別(中文) 包裝型別 基本型別
整型 Integer int
字串 String String
單精度 Float float
雙精度 Double double
布林型 Boolean boolean

說明:對於布林型別的引數,請求的引數值為true或false。或者1或0

舉慄:
前臺請求: http://localhost:8080/hello.action?id=2&flag=false
後臺處理器方法形參如下:

public String editItem(Model model,Integer id,Boolean flag)

2. 通過pojo接收表單資料

有時候會遇到前臺頁面的表單請求引數有很多,這是不能把所有請求引數寫在後臺處理器方法中的形參上。 這樣雖然技術上可行,但是一來程式碼“不美觀” 二來 業務邏輯也會變得不清晰。

  • 擴充套件: 理解一下pojo 和 javaBean(參考百度百科):
  1. 先簡單介紹一下什麼是pojo?
          POJO(Plain Ordinary Java Object) 翻譯就是: 簡單的普通的java物件。
    實際就是普通的javabeans,沒有業務邏輯,普通的java類,其中有一些屬性及getter setter方法的類就可以叫做POJO。
          一般在web應用程式中建立一個數據庫的對映物件時,我們只能稱它為POJO(不能叫做javaBean)。POJO(Plain Old Java Object)這個名字用來強調它是一個普通java物件,而不是一個特殊的物件,其主要用來指代那些沒有遵從特定的Java物件模型、約定或框架(如EJB)的Java物件。理想地講,一個POJO是一個不受任何限制的Java物件.
          即POJO是一個簡單的普通的Java物件,它不包含業務邏輯或持久邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不繼承或不實現任何其它Java框架的類或介面
  2. 什麼是javaBean?
          javaBean要比POJO複雜, JavaBean是可以複用的元件,對javaBean沒有嚴格的規範 , 理論上講,任何一個java類都可以是一個Bean. 單通常情況下, Java Bean 是被容器所建立的(eg:Tomcat),故 Java Bean應該有一個無參的構造器.
          Java Bean 是不能被跨程序訪問的。JavaBean是一種元件技術,就好像你做了一個扳子,而這個扳子會在很多地方被拿去用,這個扳子也提供多種功能(你可以拿這個扳子扳、錘、撬等等),而這個扳子就是一個元件。

通過pojo接收表單資料

條件: pojo物件中的屬性和表單中input和name屬性一致
寫個小例子:

1. 先寫個pojo
package springmvc.test.one.bo;
/**
 * pojo 
 * @author Administrator
 *
 */
public class User {
    // 姓名
	private String name;  
	// 年齡
	private Integer age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
//  注意:這個pojo 我們只是用來接收引數,不去new它, 只需要必要的屬性和getter/setter方法即可 
//	public User(String name, Integer age) {
//		super();
//		this.name = name;
//		this.age = age;
//	}
//	public User() {}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}

請求的引數名稱和pojo的屬性名稱一致,會自動將請求引數賦值給pojo的屬性。

2. 前臺頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>springmvc</title>
</head>
<body>
${ msg }
<form action="hello2.action" method="post">
   姓名: <input name="name" value=""/> </br>
   年齡: <input name = "age" value="" /> </br>
   <button type= "submit" >提交</button> 
</form>
</body>
</html>

效果如下:
在這裡插入圖片描述

3. 處理器方法
	@RequestMapping("hello2")
	public ModelAndView helloWorld2(User user ) {
	   //pojo 接收 引數
		System.out.println(user.toString());			
		return null;
	}
4. 點選頁面“提交”後效果

在這裡插入圖片描述

3.繫結包裝的pojo

白話意思就是 在搞一個pojo 裡邊搞一個屬性 型別是User 的。因此就叫做包裝的pojo.
這裡提醒一下: 基本規則就是 前臺頁面 引數的name 要和處理器中的 引數pojo的 private 的屬性名一致。 再怎麼包裝也是萬變不離其宗的。
舉慄:

1.新建包裝類 BzUser

package springmvc.test.one.bo;
/**
 * 包裝pojo 
 * @author Administrator
 */
public class BzUser {
  private User user;

public User getUser() {
	return user;
}
public void setUser(User user) {
	this.user = user;
}
}

2. 改造前臺頁面

在這裡插入圖片描述
將上個例子中的name 和 age 改為 user.name 和 user.age 即可
這裡的user 正是對應上了包裝類裡的 user屬性
在這裡插入圖片描述

3. 改造前臺頁面

處理器沒怎麼變, 就是為了方便看到效果 輸出稍有改動

	@RequestMapping("hello2")
	public ModelAndView helloWorld2(BzUser bzUser ) {
	   //pojo 接收 引數
		System.out.println(bzUser.getUser().toString());			
		return null;
	}

4. 頁面點選提交以後效果

在這裡插入圖片描述

總結:

下篇學習 複雜引數的繫結。
注: 這裡的例子都是為了 深入理解springMVC做鋪墊的 ,看到springMVC的工作完成即可,不去涉及後臺資料庫的操作。達到效果即可。