Spring MVC 에서 사용자 정의 Editor 기반 폼 데이터 처리 기술 공유

6810 단어 SpringMVC양식
대상 을 대상 으로 하 는 프로 그래 밍 방식 은 프로그래머 가 데 이 터 를 관리 하 는 데 쓰 는 정력 을 크게 편리 하 게 한다.Spring MVC 기반 웹 개발 과정 에서 요청 에서 하나씩 추출 하지 않 고 대상 맵 방식 으로 폼 에 제출 된 데 이 터 를 관리 할 수 있 습 니 다.또 이 기능 은 기본 데이터 형식의 맵 도 지원 한다.예 를 들 어 in,long,float 등 이다.이렇게 하면 우 리 는 전통 적 으로 단일 한 String 유형 에서 벗 어 날 수 있다.그러나 응용 은 유연 하 다.우리 의 데이터 에 대한 수 요 는 변화무쌍 하 다.때때로 우 리 는 폼 의 데 이 터 를 호 환 처리 해 야 한다.
예 를 들 어 날짜 형식의 호 환:
중국의 날짜 표시 습관 은 yyy-MM-dd 형식 을 사용 하고 유럽 과 미국의 습관 은 MM/dd/yyy 를 사용한다.두 가지 형식 은 모두 날짜 표시 방법 이지 만,종종 우 리 는 호 환 의 목적 을 달성 하려 면 번 거 로 운 전환 을 해 야 한다.
예 를 들 어 가격 의 호환성:
가격 은 단지 한 줄 의 숫자 일 뿐 입 니 다.우리 가 자주 사용 하 는 것 은 0.00 이라는 표현 형식 입 니 다.그리고 금액 이 비교적 큰 가격 에 대해 우 리 는 0,000.00 이라는 쉼표 로 구 분 된 가격 표현 형식 을 사용 하 는 습관 이 있 습 니 다.
사실 Spring MVC 에 서 는 이 문 제 를 고려 하여 Controller 에서 바 인 딩 을 초기 화 할 때 편집 기 를 등록 할 수 있 습 니 다.폼 이 제출 한 데이터 가 특정한 유형(심지어 특정한 매개 변수)에 비 칠 때 사용자 정의 방법 에 따라 변환 할 수 있 습 니 다.(바 이 너 리 방식 으로 전 송 된 데 이 터 를 제외 하고 우 리 는 일반적으로 전 송 된 모든 매개 변 수 는 어떤 내용 이 든 문자열 이 라 고 생각한다)
다음 에 나 는 하나의 요 구 를 허구 했다.
나 는 사용자 이름,생일,포 인 트 를 기입 해 야 하 는 양식 이 하나 있다.이 는 각각 String 타 입,Date 타 입,Long 타 입 을 대표 한다.다음은 폼 내용 입 니 다

<form action="getObj.do" method="post">
 <table>
  <tr>
   <td> :</td>
   <td><input type="text" name="userName" value="Name Test" /></td>
   <td>* </td>
  </tr>
  <tr>
   <td> :</td>
   <td><input type="text" name="birthday" value="2013-3-7" /></td>
   <td>* : yyyy-MM-dd MM/dd/yyyy</td>
  </tr>
  <tr>
   <td> :</td>
   <td><input type="text" name="score" value="1,000" /></td>
   <td>* </td>
  </tr>
  <tr>
   <td colspan="3"><input type="submit" value=" " /></td>
  </tr>
 </table>
</form>
여 기 는 폼 에 따라 다음 과 같은 폼 대상 을 비 추 었 습 니 다.이 대상 의 속성 이름 은 위 폼 의 필드 name 과 일치 해 야 합 니 다

package blog.csdn.net.chaijunkun.formObjs;

import java.util.Date;

public class UserInfo {

 private String userName;

 private Date birthday;

 private Long score;

 //getters and setters...

}

그러면 우 리 는 이러한 폼 데 이 터 를 받 고 싶 습 니 다.폼 처리 방법 을 쓸 수 있 습 니 다

package blog.csdn.net.chaijunkun.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import blog.csdn.net.chaijunkun.formObjs.UserInfo;

@Controller
public class ObjController {

 private static Logger logger= Logger.getLogger(ObjController.class);

 public ObjController(){
  logger.info(" ");
 }

 @RequestMapping(value="/getObj.do")
 public String modifyUser(HttpServletRequest request,
   HttpServletResponse response,Map<String, Object> model,
   UserInfo userInfo){
  logger.info(" ");
  model.put("userInfo", userInfo);  
  return "user";
 }

}

이렇게 만 쓰 면 다 중 형식 으로 호 환 되 지 않 습 니 다.날짜 와 Long 형식의 호 환 편집 기 를 써 야 합 니 다.편집 기 는 최소한 클래스 를 계승 해 야 합 니 다:java.beans.Property Editor Support.물론 Spring 에 내 장 된 편집기 도 계승 할 수 있 습 니 다.예 를 들 어 org.spring from work.beans.property editors.CustomNumberEditor 는 디지털 변환 을 처리 하 는 데 사 용 됩 니 다.어떤 것 을 계승 하 든 방법 은 같다.
첫 번 째 단계:공 유 된 void setAsText(String text)방법 을 다시 씁 니 다.
두 번 째 단계:변 환 된 데 이 터 를 setValue(Object obj)로 기록 합 니 다.
다음은 날짜 가 호 환 되 는 편집기 입 니 다

package blog.csdn.net.chaijunkun.editors;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyDateEditor extends PropertyEditorSupport {

 @Override
 /**
  * text
  */
 public void setAsText(String text){
  Date value= null;
  SimpleDateFormat sdf= new SimpleDateFormat();
  sdf.applyPattern("yyyy-MM-dd");
  try{
   value= sdf.parse(text);
  }catch(ParseException e1){
   sdf.applyPattern("MM/dd/yyyy");
   try {
    value= sdf.parse(text);
   } catch (ParseException e2) {
    value= null;
   }
  }
  //
  setValue(value);
 }

}

그 다음 에 롱 형 을 위 한 편집 기 를 쓰 겠 습 니 다.쉼표 로 구 분 된 것 과 쉼표 로 구 분 된 것 이 없 는 수치 표현 형식 을 지원 할 수 있 습 니 다

package blog.csdn.net.chaijunkun.editors;

import org.springframework.beans.propertyeditors.CustomNumberEditor;

public class MyLongEditor extends CustomNumberEditor  {

 public MyLongEditor(){
  super(Long.class, true);
 }

 @Override
 public void setAsText(String text){
  if ((text== null) || text.trim().equals("")){
   setValue(null);
  }else{
   Long value= null;
   try{
    //
    value= Long.parseLong(text);
   }catch(NumberFormatException e){
    //
    text= text.replace(",", "");
    value= Long.parseLong(text);
   }
   //
   setValue(value);   
  }
 }

}

자,이 두 편집기 가 작 성 했 습 니 다.어떻게 하면 역할 을 발휘 할 수 있 습 니까?이것 은 Controller 에 데이터 변환 을 추가 할 때 바 인 딩 방법 이 필요 합 니 다

@InitBinder
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
 binder.registerCustomEditor(Date.class, new MyDateEditor());
 binder.registerCustomEditor(Long.class, new MyLongEditor());
}
위의 코드 역할 은 폼 데 이 터 를 받 으 면 Spring 에서 매개 변수 이름 이 대상 속성 과 대응 할 수 있 고 전환 하 는 유형 도 상기 코드 에 등 록 된 것 과 유사 하 며 데이터 내용 을 지정 한 편집기 에 따라 변환 하 는 것 입 니 다.
우리 한번 해 보 자.
아래 그림 에서 보 듯 이
마찬가지 로 데이터 가 정확하게 식별 되 었 다.
이상 의 방법 을 통 해 우 리 는 여러 가지 데이터 형식 을 성공 적 으로 호 환 하 였 다.
뒤에 쓰기:
사실 날짜 형식 에 대해 저 는 처음에 다음 코드 처럼 호 환 을 하려 고 했 습 니 다.같은 유형 에 대해 서 는 하나의 컨트롤 러 에 하나의 편집기 만 등록 할 수 있 고 마지막 으로 등 록 된 것 이 작용 하 는 것 으로 보인다.
또한 글 을 처음 시 작 했 을 때 유형 뿐만 아니 라 특정한 유형의 특정한 속성 도 자신의 요구 에 따라 편집 기 를 맞 출 수 있 고 다른 같은 유형의 속성 에 영향 을 주지 않 는 다 고 썼 다.이것 은 매우 쉽 습 니 다.registerCustomEditor 방법 에 다시 불 러 오 는 방법 이 있 습 니 다.두 번 째 매개 변 수 는 구체 적 인 속성 이름 을 지정 할 수 있 습 니 다.이렇게 하면 입자 도 를 조절 하기 쉽다.

좋은 웹페이지 즐겨찾기