Struts2和Ajax數(shù)據(jù)交互示例詳解
前言
我們從Web 2.0的隨波逐流,Ajax的大放異彩說起,Struts2框架自己整合了對(duì)Ajax的原生支持(struts 2.1.7+,之前的版本可以通過插件實(shí)現(xiàn)),框架的整合只是使得JSON的創(chuàng)建變得異常簡(jiǎn)單,并且可以簡(jiǎn)單的融入到Struts2框架中,當(dāng)然這只是在我們需要JSON的時(shí)候才會(huì)顯得流光溢彩。
ajax請(qǐng)求在項(xiàng)目中常常使用,今天就平時(shí)掌握的總結(jié)一下,關(guān)于使用ajax請(qǐng)求到Struts2中的action時(shí),前臺(tái)頁面與后臺(tái)action之間的數(shù)據(jù)傳遞交互問題。
這里我主要記錄下自己所掌握的幾種方式。可以根據(jù)自己平時(shí)項(xiàng)目的需求來進(jìn)行選擇。
1.使用stream類型的result
此種類型可以直接讓Struts2中的action向客戶端瀏覽器生成文本響應(yīng)。
示例:
jsp頁面:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax提交登錄信息</title>
<%--導(dǎo)入js插件--%>
<script src="${PageContext.request.contextPath}/demo/js/jquery-1.4.4.min.js" type="text/javascript"></script>
</head>
<body>
<h3>異步登錄</h3>
<s:form id="loginForm" method="POST">
<s:textfield name="username"/>
<s:textfield name="psw"/>
<input id="loginBtn" type="button" value="提交">
</s:form>
<div id="show" style="display:none;"></div>
</body>
<script type="text/javascript">
$("#loginBtn").click(function(){
$("#show").hide();
//發(fā)送請(qǐng)求login 以各表單里歌空間作為請(qǐng)求參數(shù)
$.get("login",$("#loginForm").serializeArray(),
function(data,statusText){
$("#show").height(80)
.width(240)
.css("border","1px solid black")
.css("border-radius","15px")
.css("backgroud-color","#efef99")
.css("color","#ff0000")
.css("padding","20px")
.empty();
$("#show").append("登錄結(jié)果:"+data+"<br/>");
$("#show").show(600);
},"html");//指定服務(wù)器響應(yīng)為html
});
</script>
</html>
處理邏輯的action:
/**
* Description:eleven.action
* Author: Eleven
* Date: 2018/1/26 18:09
*/
public class LoginAction extends ActionSupport{
private String username;
private String psw;
//輸出結(jié)果的二進(jìn)制流
private InputStream inputStream;
public String login() throws Exception{
if(username.equals("tom")&& psw.equals("123")){
inputStream = new ByteArrayInputStream("恭喜您,登錄成功".getBytes("UTF-8"));
}else{
inputStream = new ByteArrayInputStream("對(duì)不起,登錄失敗".getBytes("UTF-8"));
}
return SUCCESS;
}
//提供get方法
public InputStream getInputStream() {
return inputStream;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
}
action中除了接收頁面?zhèn)鬟f的用戶名、密碼外,還有一個(gè)InputStream類型的成員變量,并為它提供了對(duì)應(yīng)的get方法。get方法中返回的二進(jìn)制流將會(huì)直接輸出給客戶端瀏覽器。
struts.xml配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="eleven.action.LoginAction" method="login"> <result type="stream"> <!--指定stream流生成響應(yīng)的數(shù)據(jù)類型--> <param name="contentType">text/html</param> <!--指定action中由哪個(gè)方法去輸出InputStream類型的變量--> <param name="inputName">inputStream</param> </result> </action> </package> </struts>
在瀏覽器中瀏覽該頁面,并輸入相關(guān)信息,然后提交,可以看到后臺(tái)action直接將消息數(shù)據(jù)返回給頁面,而同時(shí)頁面也不需要進(jìn)行刷新,而是直接在局部進(jìn)行顯示,這是利用了ajax的異步發(fā)送請(qǐng)求。注意,此種方式需要在struts.xml文件中要配置類型為stream的流,并設(shè)置inputName屬性,并在action中提供InputStream對(duì)應(yīng)的get方法。
運(yùn)行截圖:

2.使用json類型的result
有個(gè)jar包struts2-json-plugin-2.3.16.3.jar,可以為Struts2增加JSON插件,即當(dāng)action中的result的類型設(shè)為json時(shí),也可以在客戶端js中異步調(diào)用action,并且action中返回的數(shù)據(jù),可以直接被JSON插件序列化成json格式的字符串,并將該字符串返回給客戶端瀏覽器。
示例:
jsp頁面:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax提交登錄信息</title>
<%--導(dǎo)入js插件--%>
<script src="${PageContext.request.contextPath}/demo/js/jquery-1.4.4.min.js" type="text/javascript"></script>
</head>
<body>
<h3>異步登錄</h3>
<s:form id="loginForm" method="POST">
<s:textfield name="username"/>
<s:textfield name="psw"/>
<input id="loginBtn" type="button" value="提交">
</s:form>
<div id="show" style="display:none;"></div>
</body>
<script type="text/javascript">
$("#loginBtn").click(function(){
$("#show").hide();
//發(fā)送請(qǐng)求login 以各表單里歌空間作為請(qǐng)求參數(shù)
$.get("login",$("#loginForm").serializeArray(),
function(data,statusText){
//此時(shí)的data中包含username,psw,age
$("#show").height(80)
.width(300)
.css("border","1px solid black")
.css("border-radius","15px")
.css("backgroud-color","#efef99")
.css("color","#ff0000")
.css("padding","20px")
.empty();
alert(data);
$("#show").append(data+"<br/>");
$("#show").show(600);
},"html");
});
</script>
</html>
action代碼:
public class LoginAction extends ActionSupport{
private String username;
private String psw;
private int age;
public String login() throws Exception{
age = 18;
return SUCCESS;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
struts.xml中配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default,json-default">
<action name="login" class="eleven.action.LoginAction" method="login">
<result type="json">
<param name="noCache">true</param>
<param name="contentType">text/html</param>
</result>
</action>
</package>
</struts>
在瀏覽器中瀏覽該頁面,并輸入相關(guān)信息,然后提交,可以看到后臺(tái)action直接將消息數(shù)據(jù)返回給頁面,而同時(shí)頁面也不需要進(jìn)行刷新,而是直接在局部進(jìn)行顯示,這是利用了ajax的異步發(fā)送請(qǐng)求。注意,此種方式需要在struts.xml文件中要配置package繼承json-default,且配置result類型為json,并在action中提供需要傳遞數(shù)據(jù)的對(duì)應(yīng)的get方法。當(dāng)然了前提是添加了struts2-json-plugin-2.3.16.3.jar,不然struts2是不會(huì)自動(dòng)將數(shù)據(jù)轉(zhuǎn)為json格式的數(shù)據(jù)的。
效果截圖:

故我們可以總結(jié)一下result類型為json的步驟:
1.導(dǎo)入jar包:struts2-json-plugin-2.3.7.jar
2.配置struts返回的結(jié)果集視圖 設(shè)置type=json
3.設(shè)置對(duì)應(yīng)action所在的package繼承自json-default
4.將要返回的數(shù)據(jù)提供get方法
5.在struts.xml中設(shè)置返回?cái)?shù)據(jù)的格式
對(duì)于第5步設(shè)置返回?cái)?shù)據(jù)的格式,可以根據(jù)自己項(xiàng)目的需要,去具體設(shè)置,這里只是簡(jiǎn)單舉例,并沒有拿復(fù)雜的數(shù)據(jù),如果是返回一個(gè)List集合,那么對(duì)于數(shù)據(jù)的格式可以進(jìn)行如下設(shè)置:
<result name="test" type="json">
<!-- 設(shè)置數(shù)據(jù)的來源從某個(gè)數(shù)據(jù)得到 -->
<!-- 過濾數(shù)據(jù)從gtmList集合中得到,且只獲取集合中對(duì)象的name,跟uuid屬性 --> <param name="root">gtmList</param>
<param name="includeProperties">
\[\d+\]\.name,
\[\d+\]\.uuid
</param>
</result>
上面這種方式外,還有下面這種方式
<result name="ajaxGetBySm" type="json">
<!-- 一般使用這種方式 先用來源過濾action默認(rèn)從整個(gè)action中獲取所有的(前提是此action中沒有g(shù)etAction()方法)
但是為了方便 一般不寫root:action這個(gè)
然后再用包含設(shè)置進(jìn)行過濾設(shè)置
-->
<param name="root">action</param>
<param name="includeProperties">
gtmList\[\d+\]\.name,
gtmList\[\d+\]\.uuid
</param>
</result>
上面兩種方式都是設(shè)置數(shù)據(jù)從gtmList集合中獲取且,只獲取對(duì)象的屬性為name與uuid的。這里只做簡(jiǎn)單的舉例,具體可自己下去深入研究。
附上json類型的Result允許指定的常用參數(shù):

另外,除了以上兩種是struts2支持的ajax外,其實(shí)如果單純的只是可以讓服務(wù)器端可以跟客戶端瀏覽器進(jìn)行數(shù)據(jù)交互,可以使用response.getWrite()這種方式。
PrintWriter printWriter =response.getWriter();
printWriter.print("success");
選擇哪種方式?
對(duì)于我,如果只是對(duì)增刪改功能是否成功的一個(gè)flag判斷的數(shù)據(jù),則可優(yōu)先選擇response.getWriter().print("xxx")與設(shè)置result類型為stream的方式,但是如果是需要返回大量對(duì)象數(shù)據(jù),在頁面接收然后進(jìn)行數(shù)據(jù)展示,例如頁面通過ajax請(qǐng)求,需要后臺(tái)action返回一個(gè)list集合,則就要選擇配置result類型為json的方式了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ajax 返回值自動(dòng)添加pre標(biāo)簽的解決方法
ajax返回的內(nèi)容,居然自動(dòng)添加了pre標(biāo)簽,解決方法是修改一般處理程序的返回類型,遇到類似情況的可以參考下2014-07-07
利用ajax傳遞數(shù)組及后臺(tái)接收的方法詳解
這篇文章主要給大家介紹了關(guān)于利用ajax傳遞數(shù)組及后臺(tái)接收的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
結(jié)合AJAX進(jìn)行PHP開發(fā)之入門
結(jié)合AJAX進(jìn)行PHP開發(fā)之入門...2006-12-12
AJAX POST數(shù)據(jù)中有特殊符號(hào)(轉(zhuǎn)義字符)導(dǎo)致數(shù)據(jù)丟失的解決方法
這篇文章主要介紹了Ajax發(fā)送轉(zhuǎn)義字符 、>、<、"接收數(shù)據(jù)不全問題,需要的朋友可以參考下2023-06-06
通過Ajax方式綁定select選項(xiàng)數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇通過Ajax方式綁定select選項(xiàng)數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
關(guān)于異步請(qǐng)求ajax原理以及原生Ajax、$.ajax的基本使用詳解
這篇文章主要介紹了關(guān)于異步請(qǐng)求ajax原理以及原生Ajax、$.ajax的基本使用詳解,ajax現(xiàn)在是前后端交互的重要工具,可以說,只要從事于it行業(yè),ajax那就是必須要掌握的一名技術(shù),下面我們就來對(duì)ajax進(jìn)行介紹,需要的朋友可以參考下2023-05-05
Ajax調(diào)用restful接口傳送Json格式數(shù)據(jù)的方法
這篇文章主要介紹了Ajax調(diào)用restful接口傳送Json格式數(shù)據(jù)的方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-07-07
AJAX下的請(qǐng)求方式以及同步異步的區(qū)別小結(jié)
AJAX中的請(qǐng)求方式以及同步異步的區(qū)別小結(jié),學(xué)習(xí)ajax處理請(qǐng)求的朋友可以參考下。2010-08-08
JQuery的ajax的用法在asp中使用$.ajax()實(shí)現(xiàn)
ajax的出現(xiàn)解決了很多的疑難問題,同時(shí)帶來了很多的方便,本文講述一下JQuery的ajax的用法在asp中使用$.ajax()來表示,感興趣的朋友可以了解下,或許本文對(duì)你有所幫助2013-01-01

