Spring mvc 前端表單傳遞來的資料被後臺的兩個entity的相同名字的屬性誰獲取的問題
原文地址:http://blog.csdn.net/outlook008/article/details/8455710
當我們的input標籤裡面寫著如下的程式碼是這樣的 <input type='text' name='orderId' /> 會賦值到Springmvc的方法上的實體的orderId的屬性上。
當然,後臺擁有屬性名為orderId的實體只有一個那還好說,如果是兩個的話,那就有點麻煩。
當然也是有辦法的。
加入一個實體的變數是order 裡面含有orderId屬性 worker實體也含有orderId屬性。
我們可以這樣寫 <input type='text' name='order.orderId' /> 和 <input type='text' name='worker.orderId' />
來區分是哪個實體的成員變數
我們先寫一個自定義的註解
package com.thinkgem.jeesite.modules; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestBean { String value() default "_def_param_name"; }
我們再為這個註解寫一個解析器
package com.thinkgem.jeesite.modules; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebArgumentResolver; import org.springframework.web.context.request.NativeWebRequest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; public class BeanArgumentResolver implements WebArgumentResolver { @SuppressWarnings("rawtypes") public Object resolveArgument(MethodParameter param, NativeWebRequest request) throws Exception { RequestBean requestBean = param.getParameterAnnotation(RequestBean.class); if (requestBean != null) { String _param = requestBean.value(); if (_param.equals("_def_param_name")) { _param = param.getParameterName(); } Class clazz = param.getParameterType(); Object object = clazz.newInstance(); HashMap<String, String[]> paramsMap = new HashMap<String, String[]>(); Iterator<String> itor = request.getParameterNames(); while (itor.hasNext()) { String webParam = (String) itor.next(); String[] webValue = request.getParameterValues(webParam); if (webParam.startsWith(_param)) { paramsMap.put(webParam, webValue); } } BeanWrapper obj = new BeanWrapperImpl(object); //obj.findCustomEditor(paramClass, paramString) obj.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); //WebDataBinder. System.out.println(obj.findCustomEditor(Date.class, null).getAsText()); for (String propName : paramsMap.keySet()) { String[] propVals = paramsMap.get(propName); String[] props = propName.split("\\."); if (props.length == 2) { obj.setPropertyValue(props[1], propVals); } else if (props.length == 3) { Object tmpObj = obj.getPropertyValue(props[1]); if (tmpObj == null) obj.setPropertyValue(props[1], obj.getPropertyType(props[1]).newInstance()); obj.setPropertyValue(props[1] + "." + props[2], propVals); } } /* * Field[] fields = clazz.getDeclaredFields(); for(Field * field:fields){ obj.setPropertyValue(field.getName(), * paramsMap.get(_param +"."+field.getName())); } * * for(String porpName:paramsMap.keySet()){ String[] params = * paramsMap.get(porpName); if (null != params) { Object * field=obj.getPropertyValue(porpName.replaceFirst(_param+".", * "")); Class * clz=obj.getPropertyType(porpName.replaceFirst(_param+".", "")); * System.out.println(porpName.replaceFirst(_param+".", * "")+":"+field+" "+clz); if(field==null){ * //field=obj.getPropertyType(porpName.replaceFirst(_param+".", * "")).newInstance(); } * obj.setPropertyValue(porpName.replaceFirst(_param+".", ""), * params); } } */ /* * Method[] methods = clazz.getMethods(); for (Method m : methods) { * Class[] parClazzs = m.getParameterTypes(); String methodName = * m.getName(); if (parClazzs.length == 1 && * methodName.startsWith("set")) { * * String[] params = paramsMap.get(_param + * methodName.toLowerCase().replace("set", ".")); * * if (parClazzs[0].equals(String.class)) { if (null != params) { * m.invoke(object, new Object[] { params[0] }); } } else if * (parClazzs[0].equals(String[].class)) { if (null != params) { * m.invoke(object, new Object[] { params }); } } } * * } */ return object; } else { return WebArgumentResolver.UNRESOLVED; } } }
在Spring的xml配置檔案上加上一些xml片段
<mvc:argument-resolvers>
<bean class="com.thinkgem.jeesite.modules.BeanArgumentResolver"/>
</mvc:argument-resolvers>
在我們的Controller中就可以這樣寫得以區分
@RequestMapping(value = {"hehe", ""})
public String hehe(@RequestBean("order") Order order, @RequestBean("workerDepositInfo") WorkerDepositInfo workerDepositInfo) {
}
相關推薦
Spring mvc 前端表單傳遞來的資料被後臺的兩個entity的相同名字的屬性誰獲取的問題
原文地址:http://blog.csdn.net/outlook008/article/details/8455710 當我們的input標籤裡面寫著如下的程式碼是這樣的 <input type='text' name='orderId' /> 會賦值到S
Spring MVC form表單提交亂碼
mapping 設置 char 必須 init 服務 orm set XML spring mvc form表單submit直接提交出現亂碼。導致亂碼一般是服務器端和頁面之間編碼不一致造成的。根據這一思路可以依次可以有以下方案。 1、jsp頁面設置編碼 <%
spring-mvc jsp表單提交 不同POJO的相同屬性[同名引數]
同名引數繫結問題 今天遇到一個在日常中不是那麼容易遇到的問題,但是被一個朋友問到了! 覺得以後還是可能會出現,所以記錄下解決方法. 表單的寫法 <form action="/test/s
Spring MVC的 表單提交相對路徑異常問題
表單提交後,action的URL寫的是, saler/release,每次跳轉後都變成saler/saler/release,很顯然是相對路徑沒有搞清楚。 應該弄清楚相對路徑,並在JSP程式碼中加入<base href="<%=basePath%>">
spring mvc中接收表單提交的資料的幾種方式
spring mvc封裝資料的物件有session、request、ModelAndView、ModelMap、Model、Map Map map,Model model,ModelMap mmap,ModelAndView mav,HttpServletRequest r
spring mvc中controller怎麼接收頁面表單提交的資料
轉自:http://blog.csdn.net/wujiaqi168/article/details/41957187 1、定義一個類,該類的欄位要包含表單中所有input的name對應的值,並且在類中為對應的欄位生成getter 與setter方法 2、在對應的c
Spring MVC中Controller如何獲取Form表單提交的資料
表單提交的資料也就是請求資料,分為Get和Post兩種方式提交。 Controller中有三種方式獲取表單資料: Controller的方法,新增HttpServletRequst型別入參,通過HttpServletRequst.getParameter()獲取請求資料
前端表單提交資料~php獲取表單內容
上圖程式碼如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml
Struts 後臺接收處理Form表單傳遞過來的json資料
一.資料表單 <form id="messagePrioritySetting" name="messagePrioritySetting" method='post'> <table class="table_gry" > <tr&g
前端頁面中把form表單中的資料轉換為json格式
$.fn.serializeJson=function(){ var serializeObj={}; var array=this.serializeArray(); var str=th
Spring接收前臺表單資料的三種方法
一、 提交方式表單可以通過get/post介面提交,在RequestMapping中不指定method那麼get/post都可以訪問到,指定method=RequestMethod.POST則只能通過post方式訪問。二、Controller層獲取表單資料的三種方式1. 在方
利用ajax提交表單,實現資料前端後臺資料互動的完整流程演示
該演示需要用到 1 : json.jar(下載) 2 : jquery.js(下載) 流程演示:1.點選“登入”按鈕,傳參到後臺 2.後臺獲取資料,處理分析資料,利用JSO
Spring: RestTemplate提交表單資料的三種方法
1. 用exchange方法提交 exchange既可以執行POST方法,還可以執行GET,所以應用最為廣泛,使用方法如下: String url = "http://localhost/mirana-ee/app/login"; RestTemplate client = new RestTe
spring mvc 中通過controller 傳遞物件給jsp,並且資料繫結,在修改值後回傳物件給controller
在controller 中需要指定 sessionAttribute的key @sessionattributes註解應用到Controller上面,可以將Model中的屬性同步到session當中。 當需要清除session當中的值得時候,我們只需要在
一般處理程式中使用隱藏域來實現非Form表單元素上資料的改變
html程式碼: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <me
前臺傳遞JSON資料,後臺spring mvc如何接收資料
如何傳遞JSON資料到後臺?方式一, 使用post請求,請求型別為:application/x-www-form-urlencoded; charset=UTF-8$.ajax({ url : url, type : 'POST', data : {
循序漸進VUE+Element 前端應用開發(27)--- 資料表的動態表單設計和資料儲存
在我們一些系統裡面,有時候會需要一些讓使用者自定義的資料資訊,一般這些可以使用擴充套件JSON進行儲存,不過每個業務表的顯示專案可能不一樣,因此需要根據不同的表單進行設計,然後進行對應的資料儲存。本篇隨筆結合基於Vue+Element實現動態表單的設計、資料錄入儲存的相關操作。 1、動態表單的設計 動態表單的
Mvc 提交表單的4種方法全程詳解
c4346 數字 parameter words 代碼 help pro reat src 一,MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){}
前端表單驗證常用的15個JS正則表達式
ntp html 正整數 手機號碼 表達式 浮點數 als 浮點 個數 在表單驗證中,使用正則表達式來驗證正確與否是一個很頻繁的操作,本文收集整理了15個常用的javaScript正則表達式,其中包括用戶名、密碼強度、整數、數字、電子郵件地址(Email)、手機號碼、身份證
Spring用form表單實現PUT、DELETE提交
reason inpu data 瀏覽器 請求方式 很多 work 部分 不支持 在REST服務中必不可少的需要PUT、DELETE提交,但是目前很多的遊覽器並不支持。所以在使用REST前需要進行一些額外的處理。 具體解決方案如下: 1,先添加一個filter。這個fi