Struts2整合AJAX有2種方式: 使用type="stream"類型的<result> 使用JSON插件 使用type="stream"類型的<result> 獲取text 前端 <body> <form> 學號:<input type="text" id="no"><br /> 姓名:<in ...
Struts2整合AJAX有2種方式:
- 使用type="stream"類型的<result>
- 使用JSON插件
使用type="stream"類型的<result> 獲取text
前端
<body> <form> 學號:<input type="text" id="no"><br /> 姓名:<input type="text" id="name"><br /> <button type="button" id="btn">查詢成績</button> </form> <p id="score"></p> <script src="js/jquery-3.4.1.min.js"></script> <script> $("#btn").click(function () { $.ajax({ url:"HandlerAction", type:"get", data:{"no":$("#no").val(),"name":$("#name").val()}, dataType:"text", error:function () { console.log("ajax請求失敗!") }, success:function (data) { $("#score").text(data); } }) }); </script> </body>
url要和struts.xml中action的name、包的namespace對應。
action
public class HandlerAction extends ActionSupport { private int no; private String name; private InputStream inputStream; public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public InputStream getInputStream() { return inputStream; } public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } @Override public String execute() throws Exception { //此處預設連接資料庫查詢總分 String result = name + "同學,你的總分是:680"; //設置要返回的數據。我們傳給瀏覽器的數據含有中文,需要設置utf-8編碼,來解決中文亂碼 inputStream=new ByteArrayInputStream(result.getBytes("utf-8")); return SUCCESS; } }
前端向後臺發送了2個欄位:no、name
action需要設置2個同名的成員變數,並提供對應的getter、setter方法,才能接收到前端傳來的數據。
需要一個InputStream類型的成員變數,並提供對應的getter、setter,用於向瀏覽器返回數據。
需要一個處理請求的方法(execute),設置返回給瀏覽器的數據。
struts.xml
<struts> <package name="action" namespace="/" extends="struts-default"> <action name="HandlerAction" class="action.HandlerAction"> <result name="success" type="stream"> <!-- 設置返回給瀏覽器的數據類型 --> <param name="contentType">text/html</param> <!--指定獲取InputStream的方法,getInputStream(),約定:去掉get,後面部分使用camel寫法 --> <param name="inputName">inputStream</param> </result> </action> </package> </struts>
流程分析
- 前端向後臺發送ajax請求,傳遞no、name2個欄位
- JVM創建action實例,調用no、name對應的setter方法把前端傳過來的值賦給成員變數(會自動轉換為目標類型),完成action的初始化
- JVM調用action處理業務的方法execute,設置向瀏覽器返回的數據
- JVM根據struts.xml中<result>指定的方法(getInputStream),獲取InputSteam,將裡面的數據傳給瀏覽器。
使用type="stream"類型的<result> 獲取json
前端
<body> <form> 學號:<input type="text" id="no"><br /> <button type="button" id="btn">查詢學生信息</button> </form> <div id="show"></div> <script src="js/jquery-3.4.1.min.js"></script> <script> $("#btn").click(function () { $.ajax({ url:"HandlerAction", type:"post", data:{"no":$("#no").val()}, dataType:"json", error:function () { console.log("ajax請求失敗!") }, success:function (data) { $("#show").append("姓名:" + data.name+","); $("#show").append("年齡:" + data.age+","); $("#show").append("成績:" + data.score+"。"); } }) }); </script> </body>
action
public class HandlerAction extends ActionSupport { private int no; private InputStream inputStream; public int getNo() { return no; } public void setNo(int no) { this.no = no; } public InputStream getInputStream() { return inputStream; } public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } @Override public String execute() throws Exception { //此處預設連接資料庫查詢得到學生信息 Student student = new Student(1, "張三", 20, 100); String jsonStr = JSON.toJSONString(student); //設置要返回的數據 inputStream=new ByteArrayInputStream(jsonStr.getBytes("utf-8")); return SUCCESS; } }
使用了阿裡的fastjson.jar,需要自己下載引入。
struts.xml
配置同上
使用JSON插件實現AJAX
前端
<body> <form> 學號:<input type="text" id="no"><br /> <button type="button" id="btn">查詢學生信息</button> </form> <div id="show"></div> <script src="js/jquery-3.4.1.min.js"></script> <script> $("#btn").click(function () { $.ajax({ url:"HandlerAction", type:"post", data:{"no":$("#no").val()}, dataType:"json", error:function () { console.log("ajax請求失敗!") }, success:function (data) { $("#show").append("姓名:" + data.student.name+","); $("#show").append("年齡:" + data.student.age+","); $("#show").append("成績:" + data.student.score+"。"); } }) }); </script> </body>
action
public class HandlerAction extends ActionSupport { private int no; private Student student; public int getNo() { return no; } public void setNo(int no) { this.no = no; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } @Override public String execute() throws Exception { //此處預設連接資料庫查詢得到學生信息 student = new Student(1, "張三", 20, 100); return SUCCESS; } }
需要設置同名的成員變數,並提供getter、setter方法,來接收前端傳來的數據。
此種方式是由JSON插件把action對象序列化為一個JSON格式的字元串,傳給瀏覽器。瀏覽器可以直接訪問action的所有成員變數(實質是調用對應的getter方法)。
我們只需要把ajax要請求的數據封裝為action的成員變數,並提供對應的getter、setter方法。需要在主調方法(execute)的return語句之前對請求的數據賦值。
success:function (data) { $("#show").append("姓名:" + data.student.name+","); $("#show").append("年齡:" + data.student.age+","); $("#show").append("成績:" + data.student.score+"。"); }
瀏覽器接受到的數據data本身就是action實例,可通過.訪問成員變數。
struts.xml
<struts> <package name="example" namespace="/" extends="json-default"> <action name="HandlerAction" class="action.HandlerAction"> <!--type="json"的result,可以預設name屬性,當然寫上也行--> <result type="json"> <param name="noCache">true</param> <!-- 設置返回給瀏覽器的數據類型 --> <param name="contentType">text/html</param> </result> </action> </package> </struts>
json-default包繼承了struts-default包的配置,所以不必再繼承struts-default。
說明
需要手動添加JSON插件 struts2-json-plugin.jar 。
上面的壓縮包含有struts的所有jar包,其中就包括了struts2-json-plugin.jar。
下麵的壓縮包只有struts核心的8個jar包。