SpringMVC를 확장하여 보다 정확한 데이터 바인딩 지원1
문제 설명:
springMVC 데이터는 여러 대상을 어떻게 정확하게 귀속합니까?
<form>
<input name="student.name" value="Kate" />
<input name="student.type" value=" " />
<input name="teacher.name" value="Gavin" />
<input name="teacher.level" value="2" />
</form>
@RequestMapping("/school.do")
public String school(Student student, Teacher teacher) {
return "school";
}
만약 아까 jsp에서 작성한 폼을 원한다면, 파라미터를 봉인할 수 없으며, 반드시 "student."를teacher.제거하지만 이렇게 봉인하면 정확하게 봉인할 수 없다.
이 문제는 최근에 자꾸 물어보기 때문에 확장자를 쓰면 이 문제를 쉽게 해결할 수 있다.springmvc는spring과 마찬가지로 미리 남겨둔 확장점이 충분하다.
우리는 struts2가 기본적으로 이런 방안인 것을 알고 있다. 이것은 struts2가 OGNL을 사용하고 창고(루트 대상)를 통해 조작하는 것이며 창고에 기본적으로 액션 실례가 있기 때문에 자연스레 이런 문제가 없다.
springmvc는 다르게 뿌리 대상의 개념이 없고 그 자체로 이 문제를 해결하기 어려우므로 이런 방식을 피하거나 struts1과 유사한 FormBean 조합 대상을 사용하는 것이 좋다.
솔루션:
spring의handlerMethodArgumentResolver를 확장하여 사용자 정의 데이터 귀속 방식을 지원합니다.
1. 첨부 파일의 코드를 다운로드하여 프로젝트에 넣으십시오.
2. RequestMappingHandlerAdapter에 사용자 정의HandlerMethodArgumentResolverBean을 추가합니다.
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<!-- session-->
<property name="synchronizeOnSession" value="true"/>
<property name="customArgumentResolvers">
<list>
<bean class="cn.javass.spring.mvc.method.annotation.RequestJsonParamMethodArgumentResolver"/>
<bean class="cn.javass.spring.mvc.method.annotation.FormModelMethodArgumentResolver"/>
</list>
</property>
</bean>
//customArgumentResolvers는 사용자 정의 매개 변수 해석기를 주입하는 데 사용되며 여기는FormModelMethodArgumentResolver를 주입했습니다.FormModelMethodArgumentResolver 내가 직접 수정한 org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;
3. 사용 방식
public String user(@FormModel("student") Student student, @FormModel("teacher") Teacher teacher)
4. 테스트 컨트롤러
package cn.javass.chapter6.web.controller.formmodel;
import java.util.Arrays;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import cn.javass.chapter6.model.UserModel;
import cn.javass.spring.mvc.bind.annotation.FormModel;
import cn.javass.spring.mvc.util.MapWapper;
@Controller
@RequestMapping("/formmodel")
public class FormModelController {
//ok http://localhost:9080/springmvc-chapter6/formmodel/user?user.username=zhang&user.password=123
@RequestMapping("/user/{user.realname}")
public String user(@FormModel("user") UserModel user) {
System.out.println(user);
return "redirect:/success";
}
//ok http://localhost:9080/springmvc-chapter6/formmodel/array1?array[0]=zhang&array[1]=li
@RequestMapping("/array1")
public String array1(@FormModel("array") String[] array) {
System.out.println(Arrays.toString(array));
return "redirect:/success";
}
//ok http://localhost:9080/springmvc-chapter6/formmodel/array2?array[0].username=zhang&array[0].password=123&array[1].username=li
@RequestMapping("/array2")
public String array2(@FormModel("array") UserModel[] array) {
System.out.println(Arrays.toString(array));
return "redirect:/success";
}
//ok http://localhost:9080/springmvc-chapter6/formmodel/list1?list[0]=123&list[1]=234
@RequestMapping("/list1")
public String list1(@FormModel("list") List<Integer> list) {
System.out.println(list);
return "redirect:/success";
}
//ok http://localhost:9080/springmvc-chapter6/formmodel/list2?list[0].username=zhang&list[1].username=li
@RequestMapping("/list2")
public String list2(@FormModel("list") List<UserModel> list) {
System.out.println(list);
return "redirect:/success";
}
//ok http://localhost:9080/springmvc-chapter6/formmodel/map1?map['0']=123&map["1"]=234
@RequestMapping("/map1")
public String map1(@FormModel("map") MapWapper<String, Integer> map) {
System.out.println(map);
return "redirect:/success";
}
//ok http://localhost:9080/springmvc-chapter6/formmodel/map2?map['0'].password=123&map['0'].username=123&map["1"].username=234
@RequestMapping("/map2")
public String map2(@FormModel("map") MapWapper<Integer, UserModel> map) {
System.out.println(map);
return "redirect:/success";
}
}
구체적으로 사용하면 이전springmvc 제6장 원본 코드를 다운로드할 수 있다http://jinnianshilongnian.iteye.com/blog/1683388
첨부 파일의 FormModel.rar 압축을 src에 풀고 테스트를 진행합니다.
지원되는 스프링 버전:
springmvc 3.1.x, 3.0은 아직 지원되지 않습니다.왜 지지하지 않습니까?springmvc3.1과 3.0은 구조적으로 변화가 생겼고springmvc3.1 확장성이 뛰어납니다.
바인딩된 데이터 지원:
모델, 컬렉션, 배열, MapWapper(Map의 패키지, getInnerMap을 통해 실제 Map을 획득)
단점:
spring 사용자 정의 매개 변수 해상도는 기본 해상도 다음에order를 지정할 수 없습니다. 따라서 @FormModel ("맵") 맵이 있으면 이 맵은 모델이 됩니다. (참고하십시오.http://jinnianshilongnian.iteye.com/blog/1698916여섯 번째 부분, 모델맵 모델맵)은 미래 버전에서 사용자 정의 순서를 지원하여 이 문제를 해결하기를 희망한다.여기서 우리는 MapWapper를 사용하여 해결할 수 있으며 MapWapper를 통해 해결할 수 있다.getInnerMap () 필요한 Map 가져오기
기타 시나리오:
[spring MVC] 리퀘스트 요청 파라미터를 더욱 스마트하게 자동으로 조립할 수 있도록 원본 코드를 수정합니다.(소스 코드 수정을 권장하지 않음)
@rainsoft에서도 비슷한 방안을 제시했습니다.http://www.iteye.com/topic/1124433#2357830
만약 mvc:annotation-driven을 사용한다면 이렇게 설정하십시오
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.sishuok.es.common.web.bind.method.annotation.FormModelMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
여러분의 피드백을 환영합니다. 제때에 수정하겠습니다.
다음 확장: 연결 요청 매개 변수(JSON 문자열, 예를 들어 deptIds=[{"deptId":4, "isPrimary":true}])를 모델 대상에 연결합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.