1. 程式人生 > >springMVC常用傳參總結

springMVC常用傳參總結

本文介紹了springMVC常用的傳參方式和一些注意的事項,頁面表單主要以ajax的形式提交.

本帥是個菜雞,水平有限,若有什麼講得不對或有補充的地方歡迎各位提意見。

一、傳遞String型別

1.controller方法使用String物件作為引數接收

(a) controller

使用controller使用string型別接收,引數名與ajax提交引數名對應即可

	@RequestMapping("test")
	@ResponseBody
	public RespMessage test(String a,String b){
		System.out.println(a);
		System.out.println(b);
		return RespMessage.success();//這個是返回固定格式的響應資料,不用管
	}

(b)頁面提交程式碼

	var data = {
		a:"paramA",
		b:"paramB"
	}
	
	$.ajax({
		"type" : "post",//請求方式
		"url" : "test",//請求連線
		"dataType":"json",//預期伺服器返回格式,不設定jq也會自己判斷
		//"contentType" : "application/x-www-form-urlencoded;charset=utf-8",
		//不要指定contentType,它會自動識別傳參型別,設定不對反而會報400
		data:data,//請求引數
		success : function(data) {}
	});

(c)控制檯輸出

paramA
paramB

2. controller使用bean作為引數接收

(a)TestBean

public class TestBean {
	private String a;
	private String b;
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public String getB() {
		return b;
	}
	public void setB(String b) {
		this.b = b;
	}
}

(b)controller

ajax提交的引數名需要與TestBean成員物件名對應

	@RequestMapping("test")
	@ResponseBody
	public RespMessage test(TestBean testBean){
		System.out.println(testBean.getA());
		System.out.println(testBean.getB());
		return RespMessage.success();
	}

(c)頁面提交程式碼同 "一. 1.(b)"

(d)控制檯輸出同 " 一. 1.(c)"

3.使用HttpServletRequest接收

(a)controller
	@RequestMapping("test3")
	@ResponseBody
	public RespMessage test(HttpServletRequest request){
		System.out.println(request.getParameter("a"));
		System.out.println(request.getParameter("b"));
		return RespMessage.success();
	}

注意:Content-Type不是application/x-www-form-urlencoded的POST請求是不會讀取請求體資料和進行相應的引數處理的,即不會解析表單資料來放到request parameter map中。所以通過request.getParameter(name)是獲取不到的。 其他同上

二、傳遞陣列

1.使用urlencodeed的形式

(a)頁面提交程式碼
	/*var data = {
		arr:['a','b','c']
	}*///這種方式是不能伺服器是接收不到資料的 
	var data = "arr=a&arr=b&arr=c"
	//或者
	//var data = "arr=a,b,c";
	$.ajax({
		"type" : "post",//請求方式
		"url" : "test5",//請求連線
		"dataType":"json",//預期伺服器返回格式,不設定jq也會自己判斷
		data:data,
		success : function(data) {}
	});

(b)controller
	@RequestMapping("test")
	@ResponseBody
	public RespMessage test(String[] arr){
		for(String a:arr){
			System.out.println(a);
		}
		return RespMessage.success();
	}
(c)控制檯輸出 a
b
c

(d)順便一提,我們可以使用jq的serialize()方法將form序列化成"arr=a&arr=b&arr=c"這樣的格式的資料,具體如下: html部分
	<form id="form" action="">
		<input type="text" name="arr" value="a">
		<input type="text" name="arr" value="b">
		<input type="text" name="arr" value="c">
	</form> 
js部分
	var data = $("#form").serialize()
	//data="arr=a&arr=b&arr=c"

2.利用@RequestBody接收

(a)controller 在引數上加上@RequestBody註解後就可以接收到前端傳來的json格式的資料
	@RequestMapping("test")
	@ResponseBody
	public RespMessage test(@RequestBody String[] arr){
		for(String a:arr){
			System.out.println(a);
		}
		return RespMessage.success();
	}
(b)頁面提交程式碼 前端這裡要注意的地方有兩個,一是jq封裝的ajax引數的data這裡要傳字串格式的資料,也就是說在傳值之前需要呼叫JSON.stringify()方法將json物件轉成字元型別,這並不代表伺服器拿到的是字串,到了伺服器那邊是json物件,只是前端這裡傳參需要的是字串,其內部是怎麼轉換的還沒有進行深入研究。 二是要制定contentType為"application/json"否則會報415錯誤。
	var data = ['a','b','c'];
	data = JSON.stringify(data);//這一部很重要,將json物件轉成字串格式
	$.ajax({
		"type" : "post",//請求方式
		"url" : "test6",//請求連線
		"contentType" : "application/json;charset=utf-8",//這個時候就必須加contentType
		"dataType":"json",//預期伺服器返回格式,不設定jq也會自己判斷
		data:data,
		success : function(data) {}
	});

(c)控制檯輸出 a
b
c

3.使用@RequestParam

這個方法有個不好的地方就是如果這個引數沒有傳就會報異常 (a)controller
	@RequestMapping("test")
	@ResponseBody
	public RespMessage test(@RequestParam(value = "arr[]") String[] arr){
		for(String a:arr){
			System.out.println(a);
		}
		return RespMessage.success();
	}

(b)請求頁面程式碼
	var data = {
		arr:['a','b','c']
	}
	$.ajax({
		"type" : "post",//請求方式
		"url" : "test4",//請求連線
		"dataType":"json",//預期伺服器返回格式,不設定jq也會自己判斷
		data:data,
		success : function(data) {}
	});

4.使用formData

(a)controller
	@RequestMapping("test5")
	@ResponseBody
	public RespMessage test2(String[] arr){
		for(String a:arr){
			System.out.println(a);
		}
		return RespMessage.success();
	}


(b)請求介面程式碼
	var data = new FormData($('#form')[0]);
	$.ajax({
		"type" : "post",//請求方式
		"url" : "test5",//請求連線
		processData:false,//必須加否則出錯
        contentType:false,//必須加否則出錯
		"dataType":"json",//預期伺服器返回格式,不設定jq也會自己判斷
		data:data,
		success : function(data) {}
	});


三、傳遞複雜物件

一般遇到比較複雜的物件就使用@requestBody註解比較方便

1.使用@requestBody

(a)bean
public class TestBean2 {
	
	private String a;
	
	private String b;
	
	private TestBean bean;
	
	private TestBean[] beans;
	
	public TestBean[] getBeans() {
		return beans;
	}
	public void setBeans(TestBean[] beans) {
		this.beans = beans;
	}
	
	public String getA() {
		return a;
	}
	
	public void setA(String a) {
		this.a = a;
	}
	
	public String getB() {
		return b;
	}
	
	public void setB(String b) {
		this.b = b;
	}
	public TestBean getBean() {
		return bean;
	}
	public void setBean(TestBean bean) {
		this.bean = bean;
	}
	
}


(b)controller
	@RequestMapping("test7")
	@ResponseBody
	public RespMessage test7(@RequestBody TestBean2 test){
		
		return RespMessage.success();
	}


(c)請求頁面程式碼
	var data = {
		a:"paramA",
		b:"paramB",
		bean:{a:"beanA",b:"beanB"},
		beans:[{a:"beansA1",b:"beadsB1"},{a:"beansA2",b:"beadsB2"}]
	}
	data = JSON.stringify(data);
	$.ajax({
		"type" : "post",//請求方式
		"url" : "test7",//請求連線
		"dataType":"json",//預期伺服器返回格式,不設定jq也會自己判斷
		"contentType" : "application/json;charset=utf-8",
		data:data,
		success : function(data) {}
	});


(d)測試結果

2.使用form提交

(a)controller

	@RequestMapping("test8")
	@ResponseBody
	public RespMessage test8(TestBean2 test){
		
		return RespMessage.success();
	}

(b)提交頁面程式碼

	<form id="form" action="test8" method="post">
		<input type="text" name="a" value="paramA">
		<input type="text" name="b" value="paramB">
		<input type="text" name="bean.a" value="beanA">
		<input type="text" name="bean.b" value="beanB">
		<input type="text" name="beans[0].a" value="beans0A">
		<input type="text" name="beans[0].b" value="beans0B">
	</form> 

順便一提:這個也可以通過var data = new FormData($('#form')[0]);獲取formdata物件然後通過ajax提交,具體可以參照二.4這裡就不贅述了。

四、傳遞檔案

1.使用form提交

(a)controller
	@RequestMapping("test10")
	@ResponseBody
	public RespMessage test10(MultipartFile file){
		try {
			file.transferTo(new File("E://".concat(file.getOriginalFilename())));
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return RespMessage.success();
	}

(b)提交頁面程式碼
	<form id="form" action="test10" method="post" enctype="multipart/form-data">
		<input type="file" name="file">
		<input type="submit" value="提交">
	</form> 
順便一提:檔案上傳同樣可以使用formdata物件使用ajax進行提交,具體參考上面的步驟,這裡就不贅述了。 這裡順便提供一個帶進度條的檔案上傳方法:
//上傳按鈕點選
		$("#uploadbtn").click(function(){
			var files = $("#file")["0"].files;
			var len = files.length;
			for(var i=0;i<len;i++) {
				UpladFile(files[i],i);
			}
		})
		
				
		//開始上傳
		function UpladFile(fileObj,i) {  
		    //bar.fadeIn();
	        //var fileObj = document.getElementById("file").files[0]; // js 獲取檔案物件  
	        var FileController = "/cwjgpt/notice/FileUpload.do"; // 接收上傳檔案的後臺地址   
	        // FormData 物件---進行無重新整理上傳  
	        var form = new FormData();  
	        //form.append("author", "hooyes"); // 可以增加表單資料  
	        form.append("file", fileObj); // 檔案物件  
	        // XMLHttpRequest 物件  
	        var xhr = new XMLHttpRequest();  
	        xhr.open("post", FileController, true);  
	        xhr.onload = function() { 
	            //alert("上傳完成!");  
	        };  
	                //監聽progress事件  
	        xhr.upload.addEventListener("progress", 
	        		function(evt){
			        	if (evt.lengthComputable) {  
				            var procce = Math.round(evt.loaded / evt.total * 100);//計算進入百分比
				            updataprocess(i,procce);//這個是自己寫的一個更新進度條的方法,這裡你們自己實現然後更新介面的進度條
				        }  
	        		}
	        , false);  
	        xhr.send(form);  
	    }  


以後有在遇到一些以上方法滿足不了的情況再繼續更新

相關推薦

springMVC常用總結

本文介紹了springMVC常用的傳參方式和一些注意的事項,頁面表單主要以ajax的形式提交. 本帥是個菜雞,水平有限,若有什麼講得不對或有補充的地方歡迎各位提意見。 一、傳遞String型別 1.controller方法使用String物件作為引數接收 (a) co

Spring MVC學習總結(20)——SpringMVC總結

一、普通屬性1、基礎型別前臺:     <input name=”name />後臺:    loginUser(String name)同名原則,屬性太多要寫很多形參,非常麻煩.2、物件傳

總結

mongod --dbpath=d:/data 開機再開啟第二個視窗 mongohelp 幫助show dbs 檢視資料庫use 資料庫名字 (use lx1816)切換資料庫db.stu.save({"name":"zsf","age":"16"})查詢:db.stu.find()show collecti

SpringMVC——請求和支援的Servlet原生引數

SpringMVC 會按照請求引數名和POJO屬性名進行自動匹配, 自動為該物件填充屬性值,同時還支援級聯屬性, 例如這裡面的User是一個POJO, 裡面包含的屬性包括String name;  int age;Address address; Address裡面包含的屬性比如有

springMVC 前臺 後端集合接收 或者集合包含集合

前臺jsp  介面 <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ taglib uri="http://jav

javaWeb頁面總結

web開發中經常用到頁面傳參,現在就來總結一下各種傳參方式。 1.a標籤傳參 <a>標籤傳值的形式--引數固定:<a href="地址?引數名=值"></a>

SpringMVC頁面到後臺,日期字串報錯處理

在controller類中加入如下程式碼, 如果頁面的查詢格式都是同一格式的日期,則直接放到BaseController類中即可: @InitBinder protected void initBinder(WebDataBinder binder) { Simp

日期對象的常用用法(以及轉字符串日期)

想要 當前 沒有 函數 fun 用法 自定義 自動調用 轉換 一、傳參 我們用var now=new Date() 獲得自定義的時間對象 函數中沒有傳遞任何參數,表示此對象now自動獲取了當前的時間。 如果想要創建一個自定義時間的對象,需要在new Date()中傳遞參

SpringMVC中的數綁定總結

tps 快速入門 query required app http 客戶 接收 imp 眾所周知,springmvc是用來處理頁面的一些請求,然後將數據再通過視圖返回給用戶的,前面的幾篇博文中使用的都是靜態數據,為了能快速入門springmvc,在這一篇博文中,我將總結一下s

ajax請求數復雜對象list,後端springmvc接收

ajax請求 問題 .ajax com 系統繁忙 bsp ces dto var 也是同樣的問題, 浪費我不少時間,在此記錄 問題描述:   ajax請求後端,springmvc接收參數, 參數是個對象,屬性中有list 解決方法: JS: function save()

SpringMVC接受JSON數詳解及常見錯誤總結我改

pen 接口 var token 練手 一個 lips users 是不是 SpringMVC接受JSON參數詳解及常見錯誤總結 最近一段時間不想使用Session了,想感受一下Token這樣比較安全,穩健的方式,順便寫一個統一的接口給瀏覽器還有APP。所以把一個練手項目

ajax的一些總結

一、ajax實現get或post的請求的封裝 1、$.ajax({}); 2、url  介面的地址 3、type  請求方式  要結合後臺 4、timeout 請求超時  單位:ms   比如:     timeout:3000;

SpringMVC——物件,字串,陣列

PageResult.class public class PagedResult<T> { private List<T> dataList;//資料 private int currentPage;//當前頁 private int pageSize

springmvc Required String parameter 'xxxx' is not present

傳參 sent 執行 inf 分享圖片 mage con src control 報錯 請求因該是已經被分配了,但是參數補全,無法被執行 加上這個參數就好了,表示請求參數,可以為空 這樣的好處是,可以進入controller之後再去判斷,比較好定位錯誤spri

專案總結之MyBatis Mapper

Mapper類本質是使用了動態代理 什麼是Mybatis? 官話來說: MyBatis 是支援定製化 SQL、 儲存過程以及高階對映的優秀的持久層框架。 MyBatis 避免了幾乎所有的 JDBC 程式碼和手工設定引數以及抽取結果集。 MyBatis 使用簡單的 XML 或註解來配置和對

vue路由常用

當點選collection()這個方法的時候,跳轉並帶上標識, collection() { this.$router.push({path: 'notSee', query: { id: '1' }}); },

[C語言]二維陣列的格式(詳細+總結)

喜歡就為我點贊,評論加收藏。 轉載請標明出處[link]https://blog.csdn.net/qq_43868654/article/details/84641383 初遇二維陣列作函式引數,宛如自己化身為了大頭兒子。很頭大。 不禁大聲吶喊:該怎麼宣告定義,該怎麼呼叫,又該怎麼

SpringMVC controller間跳轉重定向

1. 需求背景     需求:spring MVC框架controller間跳轉,需重定向。有幾種情況:不帶引數跳轉,帶引數拼接url形式跳轉,帶引數不拼接引數跳轉,頁面也能顯示。 2. 解決辦法     需求有了肯定是解決辦法了,一一解決,說明下

SpringMvc 中文亂碼

produces="application/json;charset=UTF-8" @RequestMapping(value="/方法名",produces="application/json;charset=UTF-8") Tomcat檔案 service.xml 原來

vue+axios+springmvc

No 'Access-Control-Allow-Origin' header is present on the requested resource.'Ajax跨域訪問解決方案 The Response had HTTP code 403. 前臺配置 vue在配置檔案