1. 程式人生 > >Spring mvc 前端表單傳遞來的資料被後臺的兩個entity的相同名字的屬性誰獲取的問題

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){}

前端驗證常用的15JS正則表達式

ntp html 正整數 手機號碼 表達式 浮點數 als 浮點 個數 在表單驗證中,使用正則表達式來驗證正確與否是一個很頻繁的操作,本文收集整理了15個常用的javaScript正則表達式,其中包括用戶名、密碼強度、整數、數字、電子郵件地址(Email)、手機號碼、身份證

Spring用form實現PUT、DELETE提交

reason inpu data 瀏覽器 請求方式 很多 work 部分 不支持 在REST服務中必不可少的需要PUT、DELETE提交,但是目前很多的遊覽器並不支持。所以在使用REST前需要進行一些額外的處理。 具體解決方案如下: 1,先添加一個filter。這個fi