$.getJSON не извлекает данные из класса действий Struts 2 на страницу JSP

#java #struts2 #struts2-jquery #struts2-json-plugin

#java #struts2 #struts2-jquery #struts2-json-плагин

Вопрос:

Я хочу получить поля из Struts2 класса действий на моей странице jsp.

Мой JavaScript-код JSP способен запускать его класс действий, но не отображает значение заданного поля из класса действий на страницу jsp при вызове идентификатора предполагаемого элемента через JavaScript.

Моя консоль показывает все нормально. Я просмотрел различные примеры и не знаю, почему я все время сталкиваюсь с одной и той же проблемой. Я не могу понять точную проблему.

Вот мой код:

В new.jsp :

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!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>getJSON example</title>
 <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>

<s:select label="Category" id="category" name="category" list="{'Select','Animal','Bird'}"></s:select><br/>

<s:textfield label="Field1" id="field1" name="field1" ></s:textfield>

<script type="text/javascript">
$(document).ready(function(){
$(document).on('change','#category',function(){
var JScategory=$(this).val();
$.getJSON("getfield",
{category:JScategory},
function(data){
$('#field1').html(field);
});
}
);

});
</script>
</body>
</html>
  

В struts.xml :

  <package name="jsonpack" namespace="/" extends="json-default">
 
<action name="getfield" class="com.mobile.TestDropDown">
<result type="json" name="success"></result>
</action>

</package>
  

Класс действий:

 package com.mobile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.db.AdDAO;
import com.opensymphony.xwork2.ActionSupport;

public class TestDropDown  extends ActionSupport{
    

        private String category;
        private String field;

        public String getCategory() {
        return category;
        }

        public void setCategory(String category) {
        this.category = category;
        }

        public String getField() {
        return field;
        }

        public void setField(String field) {
        this.field = field;
        }
@Override
public String execute() throws Exception {
System.out.println("cat:" category);
if(category.equals("Animal")){
field="Tiger";
}else if(category.equals("Bird")){
field="Eagle";
}
return SUCCESS;
}
}
  

Комментарии:

1. Почему вы используете текстовое поле? Вы хотите показать tiger в текстовом поле?

2.Пожалуйста, обратитесь к этому примеру для загрузки динамического содержимого. Технологии.learnerandtutor.com/…tech .learnerandtutor.com /…

Ответ №1:

Я не вижу, где вы инициализируете свою field переменную JS в строке:

 $('#field1').html(field);
  

В чем здесь ценность field ?

Комментарии:

1. Это должно произойти при выборе значений из выпадающего списка, и соответствующее значение должно быть установлено из метода выполнения класса действий.

Ответ №2:

Значение из категории, которое вы должны получить как

 var JScategory=$("#category").val();
  

и используйте

 $.getJSON("<s:url namespace='/' action='getfield'/>", { category: JScategory })
.done(function(json) {
  console.log( "JSON Data: "   json );
  $("#field1").val(json.field);
})
.fail(function( jqxhr, textStatus, error ) {
  var err = textStatus   ", "   error;
  console.log( "Request Failed: "   err );
});
  

Комментарии:

1. Сделано, но по-прежнему нет значения, которое я получаю в поле.

2. Что выводится на консоль?

3. Он показывал только cat:Animal, cat:Bird при выборе значения из выпадающего списка, но после изменения var JScategory=$(«#category»).val(); на var JScategory=$(«#category»).serialize(); и {category:JScategory} на {JScategory} Я получил консольные сообщения типа cat: Animal Tiger, распечатав его. Но все равно ничего не получается на моей желаемой странице.

4. Выведите, какие данные json вы получаете в консоли.

Ответ №3:

Все в порядке, просто используйте это

  $('#field1').val(data.field);
  

Вместо

  $('#field1').html(field);
  

Поскольку json возвращается с url

http://localhost:8083/yourProjectName/getfield?category=Bird является

{«категория»: «Птица», «поле»: «Орел»}

Итак, чтобы получить Eagle в текстовом поле, мы получаем доступ к переменной data.field

  <script type="text/javascript">
      $(document).ready(function(){
           $(document).on('change','#category',function(){
                var JScategory=$(this).val();
                $.getJSON("getfield",
                {category:JScategory},
                function(data){
                     $('#field1').val(data.field);
                });
                }
           );
      });
 </script>
  

Также сообщите нам, если вы получите какую-либо ошибку или она не работает.

Комментарии:

1. Нет, это ничего не решает.

2. Тот же код, который вы опубликовали, запущен на моем компьютере. Вместо $('#field1').html(field); этого я изменил его на $('#field1').val(data.field); и я получаю Tiger и Eagle в текстовом поле на моем компьютере. Что не так в вашем коде?

3. Убедитесь, что вы не изменили код. Убедитесь, что вы используете тот же код, что и в этом вопросе . Потому что я протестировал его, и он работает на моем ПК. Попробуйте опубликовать URL-адрес в браузере и посмотреть данные json. опубликуйте здесь, какие json данные у вас есть.

Ответ №4:

он возвращает объект json, поэтому вам следует выполнить следующие шаги, он работает нормально.

Объект json содержит ключ и значение, поэтому необходимо выполнить итерацию ваших данных.затем установите в свое поле.

      function(data) {
       //it is Json Data
        $.each(data,function(key,value){
               $('#field1').val(value);
          });
      });
  

Ответ №5:

Вам не хватает вашего суффикса действия? По умолчанию .action

Попробуйте

 $.getJSON("getfield.action",
     {category:JScategory},
      function(data){
        $('#field1').html(field);
 });