2012-04-23 2 views
0

내 서버 (Spring 사용)와 클라이언트 (ExtJS에서)간에 투명 데이터 전달을 구현하려고합니다.Spring : 서버와 클라이언트 사이의 데이터 전달 (Java 객체에서 JS 객체로)

서버 측에서 JSP를 사용하여 ModelAndView 객체를 반환하는 스프링 컨트롤러가 있습니다. 보통 모델 객체를 만들지 않고, 모델 맵에 항목을 넣습니다.

투명한 Java에서 Javascript 객체로 변환하기를 원합니다. 서버 측에서 Java Date 객체를 맵에 넣었고 클라이언트에서 Javascript Date 객체를 얻습니다. 즉, 서버에서 나는 이러한 코드 쓰기 :

public ModelAndView getModelAndView(User user) { 
    Map<String, Object> modelMap = new HashMap<String, Object>(); 
    modelMap.put("date", new Date()); 
    modelMap.put("intarray", new int[] {1,2,3}); 
    return new ModelAndView("mainpage", modelMap); 
} 

를 클라이언트에 나는 JSP에서 쓰기 :

var model = <someMagicTagOrSomething /> 

렌더링 된 HTML에서

내가 얻을 :

var model = { 
    date: Date.parse('2012-01-01 12:12:12', 'Y-m-d H:m:s'), //JS Date object 
    intarray: [1,2,3] 
} 

무엇의 대부분을 I Spring 문서에서 볼 수 있듯이 @NumberFormat (style = Style.PERCENT)와 같은 주석을 사용하여 서버에서 객체 형식을 지정하고 form : input 태그를 사용하여 클라이언트에서 가져 오는 작업이 포함됩니다. 클라이언트에서 날짜 형식을 지정하고 클라이언트에 전송되는 형식에 대해 걱정하지 않으려 고하기 때문에 원하는 내용이 아닙니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 즉시 사용할 수있는 솔루션이 있습니까? 아니면 직접 작성해야합니까? 내 모델을 JSON으로 번역하기 위해 Gson과 같은 라이브러리를 사용할 수 있다는 것을 알았지 만 자바 날짜를 문자열로 반환하고 곧바로 Javascript 날짜 오브젝트를 가져오고 포맷팅에 대해 걱정할 필요가 없다. 다음

public class LocalDateEditor extends PropertyEditorSupport{ 
    @Override 
    public void setAsText(String text) throws IllegalArgumentException{ 
     setValue(DateTimeFormat.forPattern("dd MMM yyyy").print(text)); 
    } 

과 : 어떤 조언을

감사합니다,

표트르

답변

0
<c:set var="myModelObject" value="${myObjectFromServer}"/> 

<script> 
    var myJSvar = "${myModelObject}"; 
</script> 

그리고 그래, 당신이/역 직렬화 날짜를 직렬화 할 것이다 ... 나는이 PropertyEditor를 확장 (글로벌 컨트롤러도 설정할 수 있지만 기억이 안납니다) :

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(LocalDate.class, new LocalDateEditor()); 
} 

나는 세계적인 날짜 포맷터를 사용하고, 사용자 인터페이스에는 전역 jquery와 ui datepicker 클래스가 있습니다. 코딩은별로 필요하지 않습니다. 초기 설정 후 모든 것이 상자에서 작동합니다. 나는 iso 표준 날짜가 마음에 들지 않았다. (영국인 때문에 ---)

+0

var myJSvar = "12 Mar 2012"; 내 의견을 soulcheck의 대답을 참조하십시오. 감사합니다 :) – machinery

+0

정확히 무엇을 할 것입니다. 서버가 당신을 위해 클라이언트 코드를 생성하기를 원하는 것처럼 들리네. 컨트롤러를 뷰 (MVC의 V 및 C)와 믹싱하고 있습니다. GWT와 Vaadin은 자바 스크립트 작성의 필요성을 없앴습니다. – NimChimpsky

+0

흠 .. 나는 자바 스크립트를 쓰는 것에 반대하지 않았지만 팁을 주셔서 감사합니다. 제 경우에는 뷰와 컨트롤러 믹싱이 정당하다고 생각합니다. 보일러 플레이트 코드를 약간 삭제할 수 있습니다. – machinery

1

날짜를 어떤 형식으로 직렬화하는 것을 피하지 않을 것이다. 자바 스크립트는 자바 객체를 이해하지 못하기 때문에 직렬화 단계가 있어야한다. 그것은 json, xml 또는 무엇이든간에)

ISO 문자열을 보내고 Date.parse(isostring) 문자열을 지정하는 것이 가장 좋습니다. 형식 문자열을 지정할 필요가 없으므로 최소한을 입력해야합니다 대부분의 고객이 이해할 수있는 형식으로 작업하십시오

+0

어떻게 든 개체를 serialize/deserialize해야한다는 것을 알고 있습니다. 나는 단지 그것을 투명하게/자동적으로 나를 위해 수행하는 것을 선호 할 것이다. 솔루션에서 당신은 내가 "Date.parse"를 자바 스크립트에 추가하는 데 필요한 모든 날짜를 제안하고있다. 서버에서이 "Date.parse"호출을 추가하길 원합니다. JSP를 렌더링 할 때 JSON을 HTML에 붙여 넣는 서버 대신 Javascript와 JSON을 결합하여 궁극적으로 JS 객체를 생성합니다 (예를 들어 질문과 같이). 이 작업을 수행하는 라이브러리 또는 스프링 메커니즘이 있습니까? – machinery

+1

@machinery IMO가 스프링 범위를 벗어 났지만 JavaScript 날짜 변환에 대한 자동 날짜 - 문자열을 수행하는 인기있는 js 라이브러리의 확장이 있습니다 ([jquery의 예] (http://erraticdev.blogspot.com.es/2010/12). /converting-dates-in-json-strings-using.html) 테스트하지 않았습니다. 그 예를 들어 – soulcheck

+0

주셔서 감사합니다, 꽤 유용하게 보인다 :) – machinery

관련 문제