Как передать ответ JSON из класса действий struts 2 на HTML-страницу

Я работаю над struts 2 с ответом JSON
Ниже приведен мой код

АКЦИОНЕРНЫЙ КЛАСС

public class JSONDataAction implements ServletRequestAware{

    private String firstName;
    private String lastName;

    protected HttpServletRequest request;

    public String execute() {

        System.out.println("FIRST NAME IN ACTION CLASS IS::"+firstName);
        System.out.println("LAST NAME IN ACTION CLASS IS::"+lastName);      

        request.setAttribute("temp", "temp data");  

        return "success";
   }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }

    public HttpServletRequest getServletRequest() {
        return request;
    }
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />

    <package name="jsonView" namespace="/" extends="struts-default,json-default">

       <action name="getJSONResult" class="com.javatechig.struts2web.actions.JSONDataAction">
           <result name="success" type="json">/pages/details.html</result>
       </action>

   </package>
</struts>

employee.html

<html>
    <body>
        <h4>
            Struts 2 HTML5 Example
        </h4>

        <form action="getJSONResult" method="post">
            Enter first name: <input type = "text" name="firstName"><br>
            Enter last name : <input type = "text" name="lastName"><br> 
            <input type="submit">
        </form>
    </body>
</html>

details.html

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Details</title>
</head>
<body>
      EMPLOYEE DETAILS :::  
</body>
</html>  

Я добавил struts2-json-plugin-2.3.24.jar в папку lib по мере необходимости

Когда я отправляю форму (employee.html), данные формы фиксируются в классе действий (JSONDataAction), и я вижу ответ json в браузере, как показано ниже

{lastName":"User", firstName: "Test"}
У меня есть следующие сомнения

  1. Почему details.html не отображается в браузере (в браузере я вижу только json-ответ).
  2. Атрибут запроса — temp отсутствует в ответе json. Как передать атрибут запроса в ответ json.
  3. Как обрабатывать ответ json в файле details.html.
  4. Как передать ответ JSON в разные представления (HTML5) на основе типа результата, возвращаемого из класса действий.

person Karthik    schedule 19.08.2015    source источник


Ответы (1)


Прежде всего, я предлагаю вам прочитать официальную документацию по плагину JSON и этот учебник

Почему details.html не отображается в браузере (в браузере я вижу только json-ответ).

Поскольку вы возвращаете <result name="success" type="json">, Struts2 будет возвращать только те параметры, которые вы решите вернуть в формате JSON.

Атрибут запроса - temp отсутствует в ответе json. Как передать атрибут запроса в ответ json.

Ответ JSON, как я писал ранее, формируется из всех переменных вашего класса действия, у которого есть геттер и сеттер

Как обработать ответ json в details.html.

Если вам нужно обработать некоторые данные на странице html, вы должны использовать теги Struts2. как <s:property value="lastName" /> и <s:property value="firstName" />. Для такого рода действий вообще не нужен JSON. Если вы хотите отправить форму с вызовом Ajax, ответ JSON может быть полезен, но в этом случае вам просто нужно <result name="success">/pages/details.html</result>.

Я также предлагаю вам использовать JSP вместо HTML-страниц. Таким образом, страница результатов будет:

details.jsp

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Details</title>
</head>
<body>
    <s:property value="lastName" />
    <s:property value="firstName" />
</body>
</html>  
person IlGala    schedule 19.08.2015
comment
Спасибо за ответ. Моя цель - не использовать теги struts 2, а использовать html 5 и связать его с ответом JSON от класса действий, поскольку производительность будет лучше. Поэтому я хотел бы знать, как передать ответ JSON на разные представления (HTML5) на основе типа результата, возвращаемого из класса действий. - person Karthik; 19.08.2015
comment
Картик, вы не можете вернуть представление из действия, которое имеет ответ JSON. Плагин JSON предоставляет тип результата json, который сериализует действия в JSON. Процесс сериализации является рекурсивным, что означает, что весь граф объектов, начиная с класса действия (базовый класс не включен), будет сериализован. - person IlGala; 19.08.2015
comment
Ok. Пожалуйста, могу ли я узнать, что нужно сделать, чтобы получить ответ JSON в представлении (details.html) (мне нужно сделать вызов Ajax/записать функцию Jquery в том же представлении (details.html), чтобы получить JSON из класса действий). - person Karthik; 19.08.2015
comment
Да, лучший способ достичь своей цели - отправить форму через вызов AJAX, создать результат внутри действия и представить результат. - person IlGala; 19.08.2015
comment
Спасибо за разъяснения. Я понял, в каких сценариях требуется ответ JSON от класса действия (в сценариях, где требуется ответ без обновления страницы). Было бы полезно, если бы я мог получить пример для отправки формы через вызов AJAX, создания результата внутри действия и представления результата. - person Karthik; 19.08.2015
comment
Нет проблем дружище! www.google.com и выполните поиск Struts2 JSON и JQuery :). Вот пример как заполнить выбор (первый результат, который я нашел) - person IlGala; 19.08.2015
comment
Мне нужно еще одно уточнение. Если я хочу, чтобы атрибуты моего запроса были установлены в классе действий в ответе JSON. Должен ли я объявить их как переменные-члены в моем классе действий или есть ли другой способ передать их в ответе JSON. - person Karthik; 19.08.2015
comment
Давайте продолжим обсуждение в чате. - person IlGala; 19.08.2015