복붙노트

[SPRING] Javascript에서 모델 속성에 액세스하는 방법

SPRING

Javascript에서 모델 속성에 액세스하는 방법

Javascript에서 모델 속성에 액세스하려고합니다. 다음 코드를 사용합니다.

model.addAttribute("data", responseDTO);

내 DTO 클래스 :

public class ResponseDTO {

    private List<ObjectError> errors;

    private Boolean actionPassed;

    private String dataRequestName;

    // and setter getter for all fields
}   

필자는 다음을 사용하여 DTO에 액세스하려고했습니다.

var data = "${data}";

그러나 대신 응답 DTO 문자열 표현을 제공합니다 (예 : com.req.dto.ResponseDTO@115f4ea). 성공적으로 DTO 내부의 필드에 액세스 할 수 있습니다.

 var data = "${data.actionPassed}";  

그러나 이것은 ObjectError의 List이므로 DTO 내부의 errors 속성에서는 작동하지 않습니다. Javascript에서 complete responseDTO 객체를 얻으려면 어떻게해야합니까?

감사!

편집하다 :

처음에는 jquery.post를 사용했습니다.

$.post('ajax/test.html', function(data) {
  // Here I was able to retrieve every attribute even list of ObjectError.
});

이제 Ajax를 제거하고 비 아약스 방식으로 변환하려고합니다. (어쩔 수없는 이유로) 그래서 정상적인 양식을 제출하고 같은 양식을 다시로드하고 Javascript에서 데이터 모델 속성을로드하려고하므로 나머지 코드를 그대로 유지하려고합니다. 그것은 Jquery 게시물을 사용하여 할 수있는 것처럼 그것은 자바 스크립트에서 얻을 수 있는지 궁금 해서요?

편집 2 :

나는 시도했다 (당신에게 @ 제안을위한 감사)

JSONObject jsonObject =JSONObject.fromObject(responseDTO);
String jsonString = jsonObject.toString();
model.addAttribute("data",jsonString);    

자바 스크립트

var data = eval('('+ ${dataJson} +')');   // Getting error on this line  
alert(data.actionPassed);   

하지만 오류가 발생하고 경고가 표시되지 않습니다. 오류 :

해결법

  1. ==============================

    1.우선, 자바 객체를 자바 스크립트 객체로 직접 변환 할 수있는 방법이 없습니다. 서로 관련이 없기 때문입니다. 하나는 서버 측 언어이고 다른 하나는 클라이언트 측 언어입니다. 따라서이 목표를 달성하려면 전환을해야합니다. 두 가지 옵션이 있다고 생각합니다.

    우선, 자바 객체를 자바 스크립트 객체로 직접 변환 할 수있는 방법이 없습니다. 서로 관련이 없기 때문입니다. 하나는 서버 측 언어이고 다른 하나는 클라이언트 측 언어입니다. 따라서이 목표를 달성하려면 전환을해야합니다. 두 가지 옵션이 있다고 생각합니다.

    옵션 # 1의 경우 자바 객체로 JSON 문자열을 생성하려면 라이브러리를 사용해야합니다. 이 하나의 JSON-lib를 사용할 수 있습니다. 예 :

    JSONObject jsonObject = JSONObject.fromObject( responseDTO );  
    /*  
      jsonStr is something like below, "errors" represents the List<ObjectError>
      I don't know what's in ObjectError, errorName is just an example property.
      {
        "dataRequestName":"request1",
        "actionPassed":true,
        "errors":[{"errorName":"error"},{"errorName":"unknown error"}]
      } 
    */
    String jsonStr = jsonObject.toString();
    model.addAttribute("dataJson", jsonStr);  
    
    /*In JSP, get the corresponding javascript object
     by eval the json string directly.*/
    <script>
    var data = eval('('+'${dataJson}'+')'); 
    </script>
    

    옵션 # 2의 경우,

    //Pass java object as you do now
    model.addAttribute("data",responseDTO);
    
    //In JSP, include jstl taglib to help accessing List.
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <script>
    var errorArr = [], errorObj;
    <c:forEach var="error" items="${data.errors}">
        errorObj = { errorName: '${error.errorName}' };
        errorArr.push(errorObj);                                  
    </c:forEach>
    
    //Populate the corresponding javascript object.
    var data = {
      dataRequestName: '${data.dataRequestName}',
      actionPassed: ${data.actionPassed},
      errors: errorArr
    };
    </script>
    

    알 수 있듯이 옵션 # 2는 복잡하고 Java 객체가 단순하고 옵션 # 1이 훨씬 쉽고 유지하기 쉬운 경우에만 유용합니다.

  2. ==============================

    2.그래서 Grant의 첫 번째 옵션 인 객체 목록과 유사한 솔루션을 구현했지만 Gson 라이브러리를 사용하여 객체를 JSON 문자열로 변환 한 다음 JSON.parse ()를 사용하여 javascript 객체로 변환했습니다.

    그래서 Grant의 첫 번째 옵션 인 객체 목록과 유사한 솔루션을 구현했지만 Gson 라이브러리를 사용하여 객체를 JSON 문자열로 변환 한 다음 JSON.parse ()를 사용하여 javascript 객체로 변환했습니다.

    서버에서 :

    List<CustomObject> foo = database.getCustomObjects();
    model.addAttribute("foo", new Gson().toJson(foo));
    

    자바 스크립트 페이지에서 :

    var customObjectList = JSON.parse('${foo}');
    console.log(customObjectList);
    

    모델 객체 foo를 참조 할 때 '$ {foo}'문자열로 사용한다는 점에 유의하십시오. 문자열 밖에서 참조하기 때문에 오류가 발생한다고 생각합니다. 올바른 코드는 다음과 같습니다.

    var data = eval('('+ '${dataJson}' +')');
    
  3. ==============================

    3.매우 간단하다.

    매우 간단하다.

    in your spring controller 
    
    model.addAttribute("attributeName", "attributeValue");
    
    in the script
    
    <script type="text/javascript">      
         $(window).on('load', function () {             
                var springAttribute= '${attributeName}';
                alert(springAttribute);     
        </script>
    
  4. from https://stackoverflow.com/questions/9361977/how-to-access-model-attribute-in-javascript by cc-by-sa and MIT license