2014-10-21 4 views
1

안녕하세요, JSON을 Ajax에서 Struts2 액션 클래스 메서드로 게시하려고합니다. 좀 더 자세한 정보 : WAMP 서버와 Eclipse Tomcat의 Struts2에서 클라이언트를 실행하고 있습니다.JSON을 ajax에서 Struts2로 게시 조치

내 클라이언트 측 코드 :

<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
var dataObj = { 
"data": [{ 
    "id": "1", 
    "name": "Chris" 
}, { 
    "id": "2", 
    "name": "Kate" 
}, { 
    "id": "3", 
    "name": "Blade" 
}, { 
    "id": "4", 
    "name": "Zack" 
}] 
}; 

var data1 = JSON.stringify(dataObj); 
$(document).ready(function(){ 
$("button").click(function(){ 
$.ajax({url:"http://localhost:8080/Core/add",type: "post", data: data1, dataType: 'json',  contentType:"application/json;charset=utf-8",async: true,success:function(result){ 
    $("#div1").html(result); 
}}); 
}); 
}); 
</script> 
</head> 
<body> 

<div id="div1"><h2>Let jQuery AJAX Change This Text</h2></div> 
<button>Get External Content</button> 

</body> 
</html> 

그리고 이것은 내 Java 응용 프로그램 물건입니다 :

struts.xml :

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
"http://struts.apache.org/dtds/struts-2.1.7.dtd"> 



<struts> 

     <package name="addMenu" namespace="/" extends="json-default"> 

     <action name="registrate" class="com.coreRestaurant.menu.MenuAction"> 
      <result type="json" > 
      <param name="root">json</param> 
      </result> 
     </action> 

     <action name="read" class="com.coreRestaurant.menu.MenuAction" method="readMenuById"> 
      <result type="json" > 
      <param name="root">json</param> 
      </result> 
     </action> 

     <action name="add" class="com.coreRestaurant.menu.MenuAction" method="addMenu"> 
     <result type="json" > 
     <param name="root">data</param> 
     </result> 
     </action> 

    </package> 

</struts> 

그리고 이것은 내 자바 코드 (MenuAction.java)입니다 :

package com.coreRestaurant.menu; 

    import java.io.Serializable; 
    import java.util.ArrayList; 
    import java.util.List; 

    import com.google.gson.Gson; 
    import com.opensymphony.xwork2.ActionSupport; 
    import com.opensymphony.xwork2.ModelDriven; 

    public class MenuAction extends ActionSupport implements ModelDriven<Menu>, Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private Menu menu = new Menu(); 

    private String json; 

    private List<Menu> data = new ArrayList<Menu>(); 



    public String execute(){ 
     MenuService menuService = new MenuService(); 
     setJson(new Gson().toJson(menuService.getMenuNames())); 
     if(menuService.isDatabaseConnectionDown()==false){ 
      return SUCCESS; 
     }else{ 
      setJson(new Gson().toJson("Failed to connect to Database")); 
      return ERROR; 
     } 
    } 

    public String readMenuById(){ 
     MenuService menuService = new MenuService(); 
     setJson(new Gson().toJson(menuService.getSpecificalMenuNameById(menu.getId()))); 
     return SUCCESS; 

    } 

    public String addMenu(){ 
     MenuService menuService = new MenuService(); 
     System.out.println(data); 
     for(int i=0; i<data.size(); i++){ 
      System.out.println(data.get(i)); 
     } 
     menu.setName("Postitus"); 
     menuService.addMenu(menu); 
     return SUCCESS; 
    } 

    public String getJson() { 
     return json; 
    } 


    public void setJson(String json) { 
     this.json = json; 
    } 


    @Override 
    public Menu getModel() { 
     return menu; 
    } 

    public List<Menu> getData() { 
     System.out.println("Getter Call"); 
     return data; 
    } 

    public void setData(List<Menu> data) { 
     System.out.println("Setter Call Flow"); 
     this.data = data; 
    } 

} 

그리고 Menu.java 자체 : 내 클라이언트 측 코드를 실행

package com.coreRestaurant.menu; 

import java.io.Serializable; 

public class Menu implements Serializable{ 


private static final long serialVersionUID = 1L; 
private String name; 
private int id; 

public String getName() { 
    return name; 
} 

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

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

} 

모든 시간, 난 단지 이클립스 콘솔에서 다음과 같은 입력을 볼 수

[] 
Getter Call 

왜 비어? JSON 배열을 클라이언트 측에서 가져 왔지만 성공하지는 못했습니다.

+0

modeldriven 사용을 중지하십시오. 스택에'JSONInterceptor'를 포함시켜야합니다. –

+0

Gson에서 배열을 가져 오시겠습니까? –

+0

"데이터"변수에 클라이언트 쪽에서 오는 정보가 포함되기를 원합니다. 나중에 다른 용도로 gson을 사용합니다. – user4080732

답변

1

JSON 데이터를 Ajax를 통해 보내려면 Struts2 json 인터셉터로 구문 분석해야합니다. 또한 액션 객체의 데이터 속성을 채우지 만 액션 클래스에는 ModelDriven을 제거해야합니다. 모델에서 json 인터셉터의 목록 데이터를 채우는 속성을 정의하지 않으면 json으로 구동되는 모델을 사용할 수 없습니다. 액션 설정에 json 인터셉터를 추가하려면 인터셉터를 오버라이드 할 수 있습니다.

<action name="add" class="com.coreRestaurant.menu.MenuAction" method="addMenu"> 
    <interceptor-ref name="json"/> 
    <result type="json" > 
    <param name="root">data</param> 
    </result> 
</action>