Как передать объекты из Java в JavaScript, используя JSON? - PullRequest
1 голос
/ 31 июля 2010

Некоторое время назад мне был дан ответ об использовании JSON для передачи данных из моего приложения в JavaScript.Что я не понимаю, так это то, как я на самом деле передаю объект в JavaScript. Я вижу, что вы должны использовать файл .json.

И что потом?Я могу конвертировать мои Java-объекты в JSON-объекты, но, как ни странно, я не могу разобраться.Я использую JSP и сервлеты для написания своего приложения.

Ответы [ 2 ]

1 голос
/ 01 августа 2010

Расширение файла .json не так актуально. Все дело в заголовке HTTP Content Type . Пока он application/json, веб-браузер прекрасно знает, что с ним делать. В терминах JSP / Servlet вам в основном необходимо создать класс сервлета, который прослушивает определенный url-pattern, обрабатывает параметры запроса или pathinfo соответственно и записывает строку JSON в ответ в методе doGet().

Вот вымышленный пример сервлета, который возвращает пары значений / меток опции города на основе выбранного значения раскрывающегося списка страны. Он использует Google Gson для преобразования полноценных объектов Java в JSON в oneliner:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String country = request.getParameter("country");
    Map<String, String> cities = cityDAO.find(country);
    String json = new Gson().toJson(cities);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
}

Отобразите такой сервлет на url-pattern из /cities в web.xml (или, если вам нужен более дружественный подход к SEO, отобразите его на /cities/* и используйте вместо него request.getPathInfo()).

Наконец, в коде JS, который выполняется во время замены раскрывающегося списка стран, вы просто позволяете ему запускать асинхронный (аяксический) запрос к этому сервлету с выбранной страной в качестве параметра (или pathinfo). Я приведу пример на основе jQuery , поскольку он безумно облегчает запуск запросов ajax и обход / манипулирование HTML DOM (в противном случае «сырой» код JS был бы в 5 раз длиннее).

$(document).ready(function() {
    $('#country').change(function() {
        var selectedCountry = $(this).val();
        var servletUrl = 'cities?country=' + selectedCountry;

        $.getJSON(servletUrl, function(options) {
            var city = $('#city');
            $('>option', city).remove(); // Clean old options first.
            if (options) {
                $.each(options, function(value, label) {
                    dropdown2.append($('<option/>').val(value).text(label));
                });
            } else {
                dropdown2.append($('<option/>').text("Please select country"));
            }
        });
    });
});

Вот соответствующий пример HTML JSP:

<select id="country" name="country">
    <c:forEach items="${countries}" var="country">
        <option value="${country.key}">${country.value}</option>
    </c:forEach>
</select>
<select id="city" name="city">
    <option>Please select country</option>
</select>

(при условии, что ${countries} является Map<String, String> в области применения)

Надеюсь, это очистит и то, и другое:)

Смотри также:

1 голос
/ 01 августа 2010

JSON - это в основном формат хранения объектов Javascript. Итак, он родной для Javascript.

Загрузка файла JSON

Вы можете загрузить файл JSON, когда ваша веб-страница загружена так, как любой файл .js:

<html>
<head>
<script type="text/javascript" src="myfile.json"></script>
</head>

—clipped—

Также важно иметь функцию обратного вызова или функцию, которая вызывается при загрузке JSON. Например, содержимое «myfile.json» должно выглядеть следующим образом:

anz([arbitrary JSON here]);

, где anz() определяется где-то как:

function anz(JSONdata) {
    //process data here
}


JSON также может быть динамически загружен или загружен после отображения / загрузки страницы.


Получение данных из файла JSON

Итак, когда у вас есть файл JSON, который каким-то образом загружен и вызывает вашу функцию обратного вызова с данными JSON, вы можете читать ее - как и любой другой объект Javascript .

Если это было передано вашей функции обратного вызова ...

{"data":{"user_name":"Joe", "user_id":"97304239042", "user_rank":3}}

… Чтобы получить имя пользователя:

function anz(JSONdata) {
    var userName = JSONdata.data.user_name;
    // userName returns "Joe"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...