2014-01-25 1 views
1

Я использую Struts2-json-plugin-2.3.16 с той же версией фреймворка. Я получаю пустой ответ от JSON.Как использовать JSON-RPC в Struts 2

Функция JavaScript/jQuery.

var timeout; 
var request; 

function getUsers() 
{ 
    if(!request) 
    {      
     request = $.ajax({ 
      datatype:"json", 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      url: "testJsonAction.action", 
      success: function(response) 
      { 
       var user= response.user; 
       alert(user); 
      }, 
      complete: function() 
      { 
       timeout = request = null; 
      }, 
      error: function(request, status, error) 
      { 
       if(status!=="timeout"&&status!=="abort") 
       { 
        alert(status+" : "+error); 
       } 
      } 
     }); 
     timeout = setTimeout(function() { 
      if(request) 
      { 
       request.abort(); 
       alert("The request has been timed out."); 
      } 
     }, 30000); 
    } 
} 

Эта функция вызывается, когда нажимается кнопка.

<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm"> 

    <input type="button" name="btnUser" id="btnUser" value="Click" onclick="getUsers();"/> 

</s:form> 

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

@Namespace("/admin_side") 
@ResultPath("/WEB-INF/content") 
@ParentPackage(value = "json-default") 
public final class TestAction extends ActionSupport { 

    private User user; 
    private static final long serialVersionUID = 1L; 

    public TestAction() { 
    } 

    @JSON(name = "user") 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @Action(value = "testJsonAction", 
    results = { 
     @Result(type = "json", name = ActionSupport.SUCCESS, params = {"enableSMD", "true", "enableGZIP", "true", "excludeNullProperties", "true"})}) 
    public String executeAction() throws Exception { 
     try { 
      user = new User(); 
      user.setName("Tiny"); 
      user.setDob(new SimpleDateFormat("dd-MMM-YYYY").parse("29-Feb-2000")); 
      user.setLocation("India"); 
     } catch (ParseException ex) { 
      Logger.getLogger(TestAction.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     return ActionSupport.SUCCESS; 
    } 

    @Action(value = "Test", 
    results = { 
     @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"), 
     @Result(name = ActionSupport.INPUT, location = "Test.jsp")}, 
    interceptorRefs = { 
     @InterceptorRef(value = "defaultStack", params = {"params.acceptParamNames", "", "params.excludeMethods", "load", "validation.validateAnnotatedMethodOnly", "true"})}) 
    public String load() throws Exception { 
     return ActionSupport.SUCCESS; 
    } 
} 

User класс:

public class User 
{ 
    private String name; 
    private Date dob; 
    private String location; 

    public String getName() { 
     return name; 
    } 

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

    public Date getDob() { 
     return dob; 
    } 

    public void setDob(Date dob) { 
     this.dob = dob; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public void setLocation(String location) { 
     this.location = location; 
    } 
} 

Метод executeAction() в TestAction класса вызывается, когда данная кнопка нажата, но я не получаю объект пользователя как ответ JSON. Он всегда кажется пустым.

Что здесь отсутствует? Нужны ли другие библиотеки в дополнение к библиотеке Struts2-json-plugin-2.3.16?


Используя прямую связь, как в данном случае, http://localhost:8080/TestStruts/admin_side/testJsonAction.action, я получаю следующую строку.

{"methods":[],"serviceType":"JSON-RPC","serviceUrl":"\/TestStruts\/admin_side\/testJsonAction.action","version":".1"} 
+0

Вы хотите использовать JSON-RPC с запросом? –

+0

Извините, я этого не понимаю. Я впервые увидел «JSON-RPC»! – Tiny

+0

'enableSMD = true', используемый для запросов [JSON-RPC] (http://en.wikipedia.org/wiki/JSON-RPC). Он позволяет передавать объекты в действие для выполнения методов и возвращать результаты, поэтому один и тот же объект может использоваться на клиенте и на сервере, все кажется прозрачным. –

ответ

1

Что следует делать, если вам нужно использовать JSON-RPC с Struts2:

Настройка действия, который возвращает JSON-RPC службы

@Action(value = "testJsonAction", 
    results = @Result(type = "json", params = {"enableSMD", "true"}), 
    interceptorRefs = @InterceptorRef(value="json", params={"enableSMD", "true"})) 
public String executeAction() throws Exception { 
    return SUCCESS; 
} 

создать метод

@SMDMethod 
public User getUser() { 

    user = new User(); 
    user.setName("Tiny"); 
    user.setLocation("India"); 

    try { 
     user.setDob(new SimpleDateFormat("dd-MMM-YYYY").parse("29-Feb-2000")); 
    } catch (ParseException ex) { 
     Logger.getLogger(TestAction.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return user; 
} 

Теперь вам нужен клиент JSON-RPC, чтобы сделать запрос, или попробуйте $.ajax

<s:url var="testJsonUrl" action="testJsonAction"/> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
    $("#btnUser").click(function(){ 
     $.ajax({ 
     type:"POST", 
     url: "<s:property value='#testJsonUrl'/>", 
     dataType:"json",    
     data: JSON.stringify({jsonrpc:'2.0', method:'getUser', id:'jsonrpc'}), 
     contentType: "application/json-rpc; charset=utf-8", 
     success: function(response) { 
      var user= response.result; 
      alert(JSON.stringify(user)); 
     } 
     }); 
    }); 
    }); 
</script> 
+0

Я пробовал точно такую ​​же вещь, но ответ всегда пуст.Может быть, у меня будет следующий вопрос :). Он работает без 'JSON-RPC'. – Tiny

+0

Сегодня утром я обновил код рабочим решением, я не проверял, что 'ParseException' связано с инициализацией' User'. –

+0

Исключение синтаксического разбора не выбрасывается. Я получаю эту строку как ответ, '{" methods ": [{" name ":" getUser "," parameters ": []}]," serviceType ":" JSON-RPC "," serviceUrl ":" \/TestStruts \/admin_side \ /testJsonAction.action "," version ":". 1 "}' с прямой ссылкой в ​​адресной строке. – Tiny