① struts2中的json返回方式
直接response返回的那一堆json字元串有什麼用? 那一般都是書上做例子的。
你可以先在struts.xml里配置result類型是json,
實際應用裡面,用json一般都是用ajax請求的,所以你在jsp里用ajax的請求a.action,然後根據返回結果動態更新頁面。
比如用jQuery,就是
$.ajax({
url: "a.action",
}).done(function() {
// 更新頁面。
});
② struts2 action中從資料庫讀出來的記錄,怎麼封裝成json格式傳給客戶端啊
Ajax
json格式:
{key:value,key1:value1....}
如果返回的數據包含多個對象:
[{key1:value1...},{key2:value2....}]
③ struts2 怎麼配置 json
第一步: 添加struts2-json-plugin-2.3.1.2.jar
第二部: 在struts配置文件中
第五部 : js中可以測試接受結果
④ struts2怎麼返回json數據
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.1//EN"
"
<struts>
<packagename=""extends="json-default"namespace="">
<actionname=""class=""method="">
<resulttype="json">
以下是變數名為loginUser對象的某些指定屬性
<paramname="includeProperties">
loginUser.id,
loginUser.loginName,
loginUser.name,
loginUser.roleNames
</param>
以下是變數名為loginUser對象的全部屬性,多個對象用逗號
<paramname="includeProperties">
loginUser.*,
loginUser1.*
</param>
以下是集合里的某些指定屬性
<paramname="includeProperties">
weekScheles[d+].id,
weekScheles[d+].startDate,
weekScheles[d+].endDate,
weekScheles[d+].title,
weekScheles[d+].scheleCount
</param>
</result>
</action>
</package>
</struts>
注意package標簽,extends要寫成json-default
Struts2處理JSON只需要在xml文件里就可以完成,但是要注意,能夠直接作為JSON返回的必須是Action類里的屬性,方法中的屬性不能使用此方式直接返回
⑤ struts2 怎樣讀取json數據
一.認識JSON
JSON是一種輕量級、基於文本、與語言無關的數據交換格式,可以用文本格式的形式來存儲或表示結構化的數據。
二.POST請求與Content-Type: application/json
常用的HTTP請求方法有GET, POST, PUT, DELETE等。在提交POST請求時,請求數據放在消息體(Body)中,請求數據的格式及編碼方式用Content-Type來指定。如我們常用的表單<form>提交,其Content-Type默認為application/x-www-form-urlencoded,提交的數據按照key1=val1&key2=val2進行編碼,伺服器端也能很容易地解析K-V值。
JSON的出現,讓交換的數據不再僅限於簡單的K-V結構,而可以有更加復雜的層級,特別適合於RESTful介面。在發送請求時,指定Content-Type為application/json,即可使用JSON字元串作為請求的數據。而在伺服器端接收到該請求後,將按照JSON字元串對請求數據進行處理。
三.Struts2接收JSON請求
在Struts2的Action中提取Content-Type為application/x-www-form-urlencoded的POST參數,我們非常熟悉:在Action中定義屬性及其getter, setter方法,接收到請求時,默認會將與屬性同名的參數值賦予該屬性。
但是對Content-Type為application/json的請求數據,Struts2默認無法解析。因為請求的JSON數據需從輸入流中讀取出來,無法直接從ServletRequest的請求參數中解析。很容易想到,要讀取JSON請求數據,最直接的方式就是從輸入流讀取。而同時,Struts2的strus2-json-plugin也提供了有關的攔截器,對JSON請求數據進行解析。下面將對兩種方案進行分析:
1.從輸入流中讀取JSON請求數據,以下是在Action中實現的一個讀取輸入流數據的方法
解析得到JSON對象後,遍歷JSON對象,取出K-V,通過反射的V設置給予K相同的屬性
開發者可根據自己的需求進行選擇:從輸入流直接讀取JSON請求數據,或使用struts2-json-plugin對JSON請求數據進行處理。
⑥ JSP在Struts 2中使用JSON Ajax支持
JSON插件提供了一種名為json的ResultType,一旦為某個Action指定了一個類型為json的Result,則該Result無需映射到任何視圖資源。因為JSON插件會負責將Action里的狀態信息序列化成JSON格式的數據,並將該數據返回給客戶端頁面的JavaScript。
簡單地說,JSON插件允許我們在JavaScript中非同步調用Action,而且Action不再需要使用視圖資源來顯示該Action里的狀態信息,而是由JSON插件負責將Action里的狀態信息返回給調用頁面——通過這種方式,就可以完成Ajax交互。
Struts2提供了一種可插拔方式來管理插件,安裝Struts2的JSON插件與安裝普通插件並沒有太大的區別,一樣只需要將Struts2插件的JAR文件復制到Web應用的WEB-INF/lib路徑下即可。
安裝JSON插件按如下步驟進行:
(1)登陸
(2)將下載到的jsonplugin-0.7.jar文件復制到Web應用的WEB-INF路徑下,即可完成JSON插件的安裝。
實現Actio邏輯
假設wo,en輸入頁面中包含了三個表單域,這三個表單域對於三個請求參數,因此應該使用Action來封裝這三個請求參數。三個表單域的name分別為field1、field2和field3。
處理該請求的Action類代碼如下:
public class JSONExample
{
//封裝請求參數的三個屬性
private String field1;
private transient String field2;
private String field3;
//封裝處理結果的屬性
private int[] ints = {10, 20};
private Map map = new HashMap();
private String customName = "custom";
//三個請求參數對應的setter和getter方法
public String getField1()
{
return field1;
}
public void setField1(String field1)
{
this.field1 = field1;
}
//此處省略了field1和field2兩個欄位的setter和getter方法
...
//封裝處理結果的屬性的setter和getter方法
public int[] getInts()
{
return ints;
}
public void setInts(int[] ints)
{
this.ints = ints;
}
public Map getMap()
{
return map;
}
public void setMap(Map map)
{
this.map = map;
}
//使用注釋語法來改變該屬性序列化後的屬性名
@JSON(name="newName")
public String getCustomName()
{
return this.customName;
}
public String execute()
{
map.put("name", "yeeku");
return Action.SUCCESS;
}
}
在上面代碼中,宏蔽派使用了JSON注釋,注釋時指定了name域,name域指定Action屬性被序列化成JSON對象的屬性名。除此之外,JSON注釋還支持如下幾個域:
serialize:設置是否序列化該屬性
deserialize:設置是否反序列化該屬性。
format:蔽賀設置用於格式化輸出、解析日期表單域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。
配置該Action與並叢配置普通Action存在小小的區別,應該為該Action配置類型為json的Result。而這個Result無需配置任何視圖資源。
配置該Action的struts.xml文件代碼如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="example" extends="json-default">
<action name="JSONExample" class="lee.JSONExample">
<result type="json"/>
</action>
</package>
</struts>
在上面配置文件中有兩個值得注意的地方:
第一個地方是配置struts.i18n.encoding常量時,不再是使用GBK編碼,而是UTF-8編碼,這是因為Ajax的POST請求都是以UTF-8的方式進行編碼的。
第二個地方是配置包時,自己的包繼承了json-default包,而不再繼承默認的default包,這是因為只有在該包下才有json類型的Result。
⑦ Struts2 如何獲得action中傳到jsp頁面的json格式集合對象。。。。求解
樓上的這種辦法,因為response寫入的是字元串,需要你在前台js使用eval函數將字元串轉換成回json對象,才可以使用答data.results的調用
使用struts2的話,可以考慮使用struts2集成的返回json功能,不用寫入到response:
1、在配置文件中,定義package的extends,<package name="ajaxAction" extends="json-default">;
2、下面的infoDxt就是我在infoDxtAction中的一個bean,struts2會自動的將該對象轉換成json,而且bean裡面還可以使用@JSON(format="yyyy-MM-dd") 這種標注方式,指定json中的格式
<action name="AjaxDxtShow" class="infoDxtAction" method="show">
<result type="json">
<param name="root">infoDxt</param>
</result>
</action>
3、針對上面的配置,在action中寫下show方法就好了,不能是void方法,需要返回值
⑧ 在struts2中,接受ajax傳的json對象集合,接受不到
不知道你解決了沒有。我剛好遇到這個問題,基本上和你差不多。
你這個實際上是復雜數據傳遞。
因為你的json中又包含了JsonArray,array中又存儲了json對象......
因為你是採用jquery的Ajax進行傳遞的,但是jquery的ajax和struts並不是很兼容,傳遞過去的值,根本無法被被正確的解析。那麼如何解決這個問題呢?
這樣改
var myparam = var myparam = JSON.stringify(
{
'userName' : '薛軍軍',
'sex' : '男',
'others' : '其他值',
'jsonTest':[{'t_id':'sd','t_name':'trs'},{'t_id':'sd','t_name':'trs'}]
},
);
$.ajax({
type:"POST",
async:false,
url :"<%=basePath%>pages/User/getUserObj.action",
data : myparam,
dataType : "text",
success : function(data) {
alert(data);
}
});
這樣就向後台傳遞了正確的json對象。
但是現在後台還無法正確接收對象,還需要配置struts.xml,在你的包中,action前面加上攔截器
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="json"></interceptor-ref>
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack" />
好了,這樣就應該可以了