it-roy-ru.com

Как получить доступ к объекту модели Spring MVC в файле JavaScript?

Я использую Spring 3 MVC, и у меня есть ниже классы.

Внешняя система будет вызывать мое приложение, используя следующий URL:

http://somehost/root/param1/param2/param3

У меня есть метод пружинного контроллера MVC, как показано ниже:

public ModelAndView showPage(@PathVariable("param1") String paramOne, @PathVariable("param2") String paramTwo, @PathVariable("param3") String paramThree, HttpServletResponse response) {  
        SomeModel model = new SomeModel(paramOne, paramTwo, paramThree);
       return new ModelAndView("SomeJsp", "model", model);
    } 

SomeModel.Java

public class SomeModel{
 private String paramOne;
 private String paramTwo;
 private String paramThree;
//constructor
 //setters and getters

}

SomeJsp.jsp

//In this Jsp i have a div with few elements. Div is not visible by default.
//This jsp has externalJavascript included.
//I enable div and set the data into div elements using jquery.
<script src="<c:url value="/resources/js/extjs.js" />" type="text/javascript"></script>

externalJs.js

$(document).ready(function() {

    //Here i need the model returned using ModelAndView
//I can get data from model and set into div elements.


});

Можно ли получить содержимое модели во внешнем файле сценария Java? Если возможно, как я могу это сделать?

Спасибо!

12
user755806

JavaScript запускается на стороне клиента. Ваша модель не существует на стороне клиента, она существует только на стороне сервера, пока вы визуализируете свой .jsp.

Если вы хотите, чтобы данные из модели были доступны для кода на стороне клиента (например, javascript), вам нужно будет сохранить их где-то на отображаемой странице. Например, вы можете использовать Jsp для написания JavaScript, присваивая вашу модель переменным JavaScript.

Обновление:

Простой пример

<%-- SomeJsp.jsp --%>
<script>var paramOne =<c:out value="${paramOne}"/></script>
26
Aurand

Другое решение может быть использовано в JSP: <input type="hidden" id="jsonBom" value='${jsonBom}'/>

и получить значение в Javascript с помощью jQuery:

var jsonBom = $('#jsonBom').val();

16
Alessandro Dionisi

Я недавно столкнулся с такой же необходимостью. Поэтому я попробовал способ Ауранда, но, похоже, в коде отсутствует $ {}. Итак, код внутри SomeJsp.jsp <head></head>is:

<script>
  var model=[];
  model.paramOne="${model.paramOne}";
  model.paramTwo="${model.paramTwo}";
  model.paramThree="${model.paramThree}";
</script>

Обратите внимание, что вы не можете назначить, используя var model = ${model}, так как он назначит ссылку на объект Java. Итак, чтобы получить доступ к этому во внешнем JS:

$(document).ready(function() {
   alert(model.paramOne);
});
7
Splash

Этот способ работает, и с этой структурой вы можете создать свой собственный фреймворк и сделать это с меньшими затратами.

Извините, если есть какая-то ошибка, я пишу это с мобильного телефона

Maven зависимость:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>1.7.1</version>
</dependency>

Джава:

Person.Java(Класс объекта Person)

Class Person {

    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

PersonController.Java(Персональный контроллер)

@RestController
public class PersonController implements Controller {

    @RequestMapping("/person")
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        Person person = new Person();
        person.setName("Person's name");
        Gson gson = new Gson();

        ModelAndView modelAndView = new ModelAndView("person");
        modelAndView.addObject("person", gson.toJson(person));

        return modelAndView;
    }
}

Посмотреть:

person.jsp

<html>
    <head>
        <title>Person Example</title>
        <script src="jquery-1.11.3.min.js"></script>
        <script type="text/javascript" src="personScript.js"></script>
    </head>
    <body>
        <h1>Person/h1>
        <input type="hidden" id="person" value="${person}">     
    </body>
</html>

Javascript:

personScript.js

function parseJSON(data) {
    return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))(); 
}

$(document).ready(function() {
    var personJson = $('#person');
    person = parseJSON(personJson.val());
    alert(person.name);
});
7
Juan Furattini

Вот пример того, как я сделал объект списка доступным для JavaScript:

var listForJavascript = [];
<c:forEach items="${MyListFromJava}" var="listItem">
  var arr = [];

  arr.Push("<c:out value="${listItem.param1}" />");
  arr.Push("<c:out value="${listItem.param2}" />");

  listForJavascript.Push(arr);
</c:forEach>
3
tObi

Вы не можете получить доступ к объектам Java из JavaScript, потому что на стороне клиента нет объектов. Он получает только простую HTML-страницу (скрытые поля могут помочь, но это не очень хороший подход).

Я предлагаю вам использовать ajax и @ResponseBody.

1
Patison