1. 程式人生 > >關於SpringMVC content-type的那些事

關於SpringMVC content-type的那些事

最近專案上有一個小需求就是在form表單中上傳一個excel檔案,然後controller中對上傳的excel資料進行讀取然後執行dao操作

前端程式碼如下:

<div class="apply-r">
	<a class="pure-button upload" style="text-decoration: none" href="#" onclick="$('#upid').click();" >匯入商品</a>
	<input id="upid" style="display:none;" class="up-file" type="file" name="files" onchange="fileChange(this);"/>
</div>
js程式碼:
//批量上傳檔案
function fileChange(target) {
	if (target.files && target.files[0]) {
		var file = target.files[0];
		target.value = "";
		var filedata = new FormData();
		filedata.append("multipartFile", file);
		doUpload(filedata);
	}
}

function doUpload(filedata) {
	console.log("doUpload");
	$.ajax({
		url: '#springUrl("/product/addBatch.do")',
		type: 'POST',
		data: filedata,
		async: false,
		cache: false,
		contentType: false,
		processData: false,
		success: function (result, status) {
			if (result.statusCode == 301) {
				$(".session-model").show();
				return;
			}
			if (status == "success" && result.success) {
				showTips(result.message ? result.message : result.returnMessage);
				productList(1)
			} else {
				showTips(result.message ? result.message : result.returnMessage);
			}
		}

	});
}
後臺java程式碼:部分程式碼沒有貼出來,這裡我們只是進行關於Content-type的說明和介紹
@RequestMapping(value="/addBatch.do")
@ResponseBody
public AjaxResponse addBatch(HttpSession session, @RequestParam("multipartFile") MultipartFile multipartFile) {
	AjaxResponse ajaxResponse = new AjaxResponse();
	try {
		String merchantId = ProcessSessionUser.getMember(session, CommonConstant.MEMBER_ID);
                //將匯入的文件的資料讀取出來
		List<ProductInfo> productInfoList = ExcelToObjectConvert.excelConvertToDomain(multipartFile, merchantId);
		//進行插入到資料庫的操作
		productManageService.addBatch(productInfoList);
		ProcessAjaxResponse.processResponse(true, ajaxResponse, null, ReturnCode.ADD_SUCCESS);
	} catch (Exception e) {
		logger.error("執行[addBatch]異常:", e);
		ExceptionConvert.convertException(ajaxResponse, e);

	}
	logger.info("返回web結果:{}", ajaxResponse);
	return ajaxResponse;
}


以上前端和後端的程式碼在google IE11上正確執行通過,但是在IE9上又出現相容性問題。

然後前端同事將程式碼修改成如下方式:

<div class="apply-r">
	<label>
       <a class="pure-button upload" style="text-decoration: none" >匯入商品</a>
       <form id="myForm" method="post" enctype="multipart/form-data">
	       <input type="file" id="upid" name="multipartFile" onchange="fileChange(this)" style="display:none"/>
	   </form>
	</label>
</div>

前端js修改如下:
//批量上傳檔案
function fileChange(target) {
	var option = {
		url : '#springUrl("/product/addBatch.do")',
		type: 'POST',
		success : function(data) {
		   var objData = {};
		   if(data.indexOf('<pre>')>=0) {
			  objData = JSON.parse($(data).html());
		   } else{
			  objData = JSON.parse(data);
		   }
		   if (objData.statusCode == 301) {
			  $(".session-model").show();
			  return;
		    }
			if (objData.success) {
			  showTips(objData.message ? objData.message : objData.returnMessage);
			  productList(1)
			} else {
			  showTips(objData.message ? objData.message : objData.returnMessage);
			}
		},
		error: function(data) {
			 //alert(data.)
		},   
		  resetForm : true
	   };
	$("#myForm").ajaxSubmit(option);
	return false;
}
這個時候在IE9的情況下,前端同事讓我返回一個文字格式的字串,但是字串的內容為一個JSON格式

之前在postman除錯下,後臺程式碼修改之前的可以看出action返回的content-type為application/json;charset=UTF-8



所以這個時候我們要將後臺程式碼返回的content-type修改成文字格式

這篇文章詳細說明了Springmvc下content-type,其中重點關注下RequestMapping的一些引數值

consumes: 指定處理請求的提交內容型別(Content-Type),例如application/json, text/html;
produces:    指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回

當然關於Spring如何返回處理JSON或者XML格式的資料可以使用到matter,這裡我們先說下這種方法,上篇文章中可以看出要修改成 文字格式就要將content-type修改成 text/plain

常見的媒體格式型別如下:

  •     text/html : HTML格式
  •     text/plain :純文字格式      
  •     text/xml :  XML格式
  •     image/gif :gif圖片格式    
  •     image/jpeg :jpg圖片格式 
  •     image/png:png圖片格式
所以我將後臺程式碼修改成如下:
@RequestMapping(value="/addBatch.do",produces="text/plain;charset=utf-8")
@ResponseBody
public String addBatch(HttpSession session, @RequestParam("multipartFile") MultipartFile multipartFile) {
	AjaxResponse ajaxResponse = new AjaxResponse();
	try {
		String merchantId = ProcessSessionUser.getMember(session, CommonConstant.MEMBER_ID);
		List<ProductInfo> productInfoList = ExcelToObjectConvert.excelConvertToDomain(multipartFile, merchantId);
		productManageService.addBatch(productInfoList);
		ProcessAjaxResponse.processResponse(true, ajaxResponse, null, ReturnCode.ADD_SUCCESS);
	} catch (Exception e) {
		logger.error("執行[addBatch]異常:", e);
		ExceptionConvert.convertException(ajaxResponse, e);
	}
	logger.info("返回web結果:{}", ajaxResponse);
	return JSON.toJSONString(ajaxResponse);
}
produces處理的是返回值的資料格式  如果設定 produces="text/plain"  這樣返回的資料為亂碼

所以要設定 charset=utf-8

我們可以在postman下進行檢視






相關推薦

關於SpringMVC content-type那些

最近專案上有一個小需求就是在form表單中上傳一個excel檔案,然後controller中對上傳的excel資料進行讀取然後執行dao操作 前端程式碼如下: <div class="apply-r"> <a class="pure-button u

SpringMVC Content-Type解析

響應 為了測試方便,我們編寫了一個簡單的HttpMessageConverter package cn.bjut.converter; import java.io.IOException; import java.io.UnsupportedEnco

Http的那些: Content-Type

article hba 數據 找不到 oschina dex ria ack null Content-Type 無疑是http中一個非常重要的屬性了, request 中可以存在, 也可以不存在( request的Content-Type 默認是 */*, 實際上呢, 如

http請求中content-type那些事兒

在jquery+ajax盛行的年代裡,前後端互動實在太方便了,ajax發起一個請求就是這麼簡單 $.ajax({ url:'', type:'post', data:{},//引數 ... }) 久而久之,裡面很多的細節都被我們忽略了,等到有一天,沒有jque

springmvc+jsp中關於JQuery ajax提交的Content-Type引數設定application/json和application/x-www-form-urlencoded區別

介紹 本人頁面是用的JSP,後臺用的Spring MVC。 使用JQ的ajax需要設定Content-Type,Content-Type的設定有以下幾種常用的 "Content-Type": "application/x-www-form-urlencoded" // 適用於

springmvc controller動態設定content-type

  springmvc  RequestMappingHandlerAdapter#invokeHandlerMethod 通過ServletInvocableHandlerMethod#invokeAndHandle呼叫目標方法,並處理返回值。      

想寫一些SpringMVC那些

  我是從大二開始學Java Web, 剛開始接觸的是Struts2, 可能是由於剛開始學MVC框架,很多東西搞得很不理解吧,最終放棄治療. 後來偶然的機會發現了SpringMVC, 然後就一發不可收拾了,深深的愛上它了, 它真的很棒, 簡單,功能強大,可拓展性好.   很早就有想寫一些和SpringMVC相

springmvc中@requestbody註解接收前端引數使用content-type型別

最近程式碼遇見了一個springmvc中的小問題,算是很基礎的東西,同事問我後我有有些迷惑上網找了一些資料後弄清楚了。特此記錄一下 首先是後臺程式碼使用springmvc註解@requestbody,

Servlet3.0與springmvc那些

line pat 啟動tomcat api文檔 runtime lib 功能 反射 spring 官方文檔:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.ht

發送get和post請求時常用的content-type

encode json數據格式 ima for www 下載 orm 文件上傳 服務器 常見的媒體格式類型如下: text/html : HTML格式 text/plain :純文本格式 text/xml : XML格式

哈夫曼編碼(Huffman coding)的那些,(編碼技術介紹和程序實現)

信號 truct 依次 while 交換 需要 .text 示例 system 前言   哈夫曼編碼(Huffman coding)是一種可變長的前綴碼。哈夫曼編碼使用的算法是David A. Huffman還是在MIT的學生時提出的,並且在1952年發表了名為《

Android Studio 那些|Activity文件前標識圖標顯示為 j 而是 c

div roi 右下角 ext blog 識圖 cti 問題: content 問題:Activity文件前標識圖標顯示為 j 而是 c 的圖標,或是沒有顯示,並且自己主動提示不提示 解決:這是由於你的studio設置了省電模式,你能夠通過 File>

軟件project—思考項目開發那些(一)

app 爛代碼 fontsize 模式 大型 不明確 極限 後拋 con 閱讀文件夾: 1.背景2.項目管理,質量、度量、進度3.軟件開發是一種設計活動而不是建築活動4.高速開發(簡單的系統結構與復雜的業務模型)5.技術人員的業務理解與產品經理的業務理解的終於業務模型

常用對照表的參考_chapter-two(Content-Type

接下來 adding 網頁服務器 發送請求 不一致 行修改 用戶信息 官網 頁面 HTTP狀態碼詳解 狀態碼含義 100 客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕。客戶端應當繼續發送請求的剩余部

IPv4中的A,B,C類網及子網掩碼那些

來看 了解 擁有 nbsp 開發 信息 alt 位或 其余 IP 地址的主要類型有五種 A B C D 和 E 一般 A B C 類地址更為常用 每類地址都是由 32 位或 4 個字節組成 A類地址: 在 A 類地址中第一個 8 位字節表示網絡部分 其余 3 個 8 位字節

JMETER content-type增加

multipart ava enc param ref blank files ima cat Jmeter—3 http請求—content-type與參數 本文講三種content-type以及在Jmeter中對應的參數輸入方式 第一部分:目前工作中涉及到的c

Kafka文件存儲機制那些

kafka 方便 成對出現 讀者 開源項目 sock 位置 通過 刪除 點評一下先:kafka的存儲主要有幾個特點: 1. 多級索引(名義上是1級索引,但是這級索引依賴了文件列表,相當於文件列表是第一級索引,所以是二級索引),二級索引文件和數據文件一一對應。 相比只有1

關於代碼調試de那些

左右 == 一次 done 推斷 編輯 有用 track 幾分鐘 原文出處:http://www.wklken.me/posts/2014/11/23/how-to-debug.html 關於代碼調試de那些事 1.你得明白你在做什麽, 保持清醒 2.想清楚了再寫代碼

我的項目管理那些

機會 軟件設計 nio 需求 一段 領導 團隊 失業 證書 在2015年加入WD之前,準確的說,在2013-2015年我第一份工作的這段時間,我完全不知道自己工作是跟項目管理關系很大的。 2013碩士畢業後,以部門助理的身份開始第一份正式工作,每天的瑣事雜事很多、很亂,除了

關於System.Convert那些

方法 osi system popu exception mes tox resource object 關於System.Convert那些事 前言 不知咋的,今天腰疼的不行,疼的站不起來了,今下午突然就疼起來了,唉,這是身體要垮了的節奏啊,再加上自己的