Struts2整合AJAX有2种方式:

  • 使用type="stream"类型的<result>
  • 使用JSON插件

使用type="stream"类型的<result>  获取text

前端

  1. <body>
  2. <form>
  3. 学号:<input type="text" id="no"><br />
  4. 姓名:<input type="text" id="name"><br />
  5. <button type="button" id="btn">查询成绩</button>
  6. </form>
  7. <p id="score"></p>
  8.  
  9. <script src="js/jquery-3.4.1.min.js"></script>
  10. <script>
  11. $("#btn").click(function () {
  12. $.ajax({
  13. url:"HandlerAction",
  14. type:"get",
  15. data:{"no":$("#no").val(),"name":$("#name").val()},
  16. dataType:"text",
  17. error:function () {
  18. console.log("ajax请求失败!")
  19. },
  20. success:function (data) {
  21. $("#score").text(data);
  22. }
  23. })
  24. });
  25. </script>
  26. </body>

url要和struts.xml中action的name、包的namespace对应。

action

  1. public class HandlerAction extends ActionSupport {
  2. private int no;
  3. private String name;
  4. private InputStream inputStream;
  5. public int getNo() {
  6. return no;
  7. }
  8.  
  9. public void setNo(int no) {
  10. this.no = no;
  11. }
  12.  
  13. public String getName() {
  14. return name;
  15. }
  16.  
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20.  
  21. public InputStream getInputStream() {
  22. return inputStream;
  23. }
  24.  
  25. public void setInputStream(InputStream inputStream) {
  26. this.inputStream = inputStream;
  27. }
  28.  
  29. @Override
  30. public String execute() throws Exception {
  31. //此处缺省连接数据库查询总分
  32. String result = name + "同学,你的总分是:680";
  33. //设置要返回的数据。我们传给浏览器的数据含有中文,需要设置utf-8编码,来解决中文乱码
  34. inputStream=new ByteArrayInputStream(result.getBytes("utf-8"));
  35. return SUCCESS;
  36. }
  37. }

前端向后台发送了2个字段:no、name

action需要设置2个同名的成员变量,并提供对应的getter、setter方法,才能接收到前端传来的数据。

需要一个InputStream类型的成员变量,并提供对应的getter、setter,用于向浏览器返回数据。

需要一个处理请求的方法(execute),设置返回给浏览器的数据。

struts.xml

  1. <struts>
  2. <package name="action" namespace="/" extends="struts-default">
  3. <action name="HandlerAction" class="action.HandlerAction">
  4. <result name="success" type="stream">
  5. <!-- 设置返回给浏览器的数据类型 -->
  6. <param name="contentType">text/html</param>
  7. <!--指定获取InputStream的方法,getInputStream(),约定:去掉get,后面部分使用camel写法 -->
  8. <param name="inputName">inputStream</param>
  9. </result>
  10. </action>
  11. </package>
  12. </struts>

流程分析

  • 前端向后台发送ajax请求,传递no、name2个字段
  • JVM创建action实例,调用no、name对应的setter方法把前端传过来的值赋给成员变量(会自动转换为目标类型),完成action的初始化
  • JVM调用action处理业务的方法execute,设置向浏览器返回的数据
  • JVM根据struts.xml中<result>指定的方法(getInputStream),获取InputSteam,将里面的数据传给浏览器。

使用type="stream"类型的<result>  获取json

前端

  1. <body>
  2. <form>
  3. 学号:<input type="text" id="no"><br />
  4. <button type="button" id="btn">查询学生信息</button>
  5. </form>
  6. <div id="show"></div>
  7.  
  8. <script src="js/jquery-3.4.1.min.js"></script>
  9. <script>
  10. $("#btn").click(function () {
  11. $.ajax({
  12. url:"HandlerAction",
  13. type:"post",
  14. data:{"no":$("#no").val()},
  15. dataType:"json",
  16. error:function () {
  17. console.log("ajax请求失败!")
  18. },
  19. success:function (data) {
  20. $("#show").append("姓名:" + data.name+",");
  21. $("#show").append("年龄:" + data.age+",");
  22. $("#show").append("成绩:" + data.score+"。");
  23. }
  24. })
  25. });
  26. </script>
  27. </body>

action

  1. public class HandlerAction extends ActionSupport {
  2. private int no;
  3. private InputStream inputStream;
  4.  
  5. public int getNo() {
  6. return no;
  7. }
  8.  
  9. public void setNo(int no) {
  10. this.no = no;
  11. }
  12.  
  13. public InputStream getInputStream() {
  14. return inputStream;
  15. }
  16.  
  17. public void setInputStream(InputStream inputStream) {
  18. this.inputStream = inputStream;
  19. }
  20.  
  21. @Override
  22. public String execute() throws Exception {
  23. //此处缺省连接数据库查询得到学生信息
  24. Student student = new Student(1, "张三", 20, 100);
  25. String jsonStr = JSON.toJSONString(student);
  26. //设置要返回的数据
  27. inputStream=new ByteArrayInputStream(jsonStr.getBytes("utf-8"));
  28. return SUCCESS;
  29. }
  30. }

使用了阿里的fastjson.jar,需要自己下载引入。

struts.xml

配置同上


使用JSON插件实现AJAX

前端

  1. <body>
  2. <form>
  3. 学号:<input type="text" id="no"><br />
  4. <button type="button" id="btn">查询学生信息</button>
  5. </form>
  6. <div id="show"></div>
  7.  
  8. <script src="js/jquery-3.4.1.min.js"></script>
  9. <script>
  10. $("#btn").click(function () {
  11. $.ajax({
  12. url:"HandlerAction",
  13. type:"post",
  14. data:{"no":$("#no").val()},
  15. dataType:"json",
  16. error:function () {
  17. console.log("ajax请求失败!")
  18. },
  19. success:function (data) {
  20. $("#show").append("姓名:" + data.student.name+",");
  21. $("#show").append("年龄:" + data.student.age+",");
  22. $("#show").append("成绩:" + data.student.score+"。");
  23. }
  24. })
  25. });
  26. </script>
  27. </body>

action

  1. public class HandlerAction extends ActionSupport {
  2. private int no;
  3. private Student student;
  4. public int getNo() {
  5. return no;
  6. }
  7.  
  8. public void setNo(int no) {
  9. this.no = no;
  10. }
  11.  
  12. public Student getStudent() {
  13. return student;
  14. }
  15.  
  16. public void setStudent(Student student) {
  17. this.student = student;
  18. }
  19.  
  20. @Override
  21. public String execute() throws Exception {
  22. //此处缺省连接数据库查询得到学生信息
  23. student = new Student(1, "张三", 20, 100);
  24. return SUCCESS;
  25. }
  26. }

需要设置同名的成员变量,并提供getter、setter方法,来接收前端传来的数据。

此种方式是由JSON插件把action对象序列化为一个JSON格式的字符串,传给浏览器。浏览器可以直接访问action的所有成员变量(实质是调用对应的getter方法)。

我们只需要把ajax要请求的数据封装为action的成员变量,并提供对应的getter、setter方法。需要在主调方法(execute)的return语句之前对请求的数据赋值。

  1. success:function (data) {
  2. $("#show").append("姓名:" + data.student.name+",");
  3. $("#show").append("年龄:" + data.student.age+",");
  4. $("#show").append("成绩:" + data.student.score+"。");
  5. }

浏览器接受到的数据data本身就是action实例,可通过.访问成员变量。

struts.xml

  1. <struts>
  2. <package name="example" namespace="/" extends="json-default">
  3. <action name="HandlerAction" class="action.HandlerAction">
  4. <!--type="json"的result,可以缺省name属性,当然写上也行-->
  5. <result type="json">
  6. <param name="noCache">true</param>
  7. <!-- 设置返回给浏览器的数据类型 -->
  8. <param name="contentType">text/html</param>
  9. </result>
  10. </action>
  11. </package>
  12. </struts>

json-default包继承了struts-default包的配置,所以不必再继承struts-default。

说明

需要手动添加JSON插件 struts2-json-plugin.jar 。

上面的压缩包含有struts的所有jar包,其中就包括了struts2-json-plugin.jar。

下面的压缩包只有struts核心的8个jar包。

Struts2 处理AJAX请求的更多相关文章

  1. extjs ajax请求与struts2进行交互

    sencha extjs 5 增加一个struts2的配置,这样可以在设置好前台布局之后,与后台交互获取数据显示.现在有一个问题是struts2对于url的跳转action支 持比较良好,但是对于像E ...

  2. Struts2处理(jQuery)Ajax请求

    1. Ajax     Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)时一种创建交互式网页应用的网页开发技术,它并不是一项新的技术,其产生 ...

  3. Struts2 在登录拦截器中对ajax请求的处理

    前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...

  4. struts2响应AJAX

    1发送ajax请求使用stream进行响应 Result的type属性的stream取值. 1.1定义Action public class UserAction { private String u ...

  5. 关于struts2中action请求会执行两次的问题

    关于struts2中action请求会执行两次的问题     在struts2中发现,调用action中的方法,方法会被执行两次,后来发现调用的方法是get开头的,把它改为其他名称开头的后,就不会执行 ...

  6. Struts2之ajax初析

    Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单, ...

  7. Jquery progressbar通过Ajax请求获取后台进度演示

    项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...

  8. Struts2结合Ajax实现登录

    前言:Struts2作为一款优秀的MVC框架,和Ajax结合在一起,用户就会有良好的体验,本篇博文我们来模拟一个简单的登录操作,实现Ajax的异步请求,其中Struts2进行的是链接处理,Action ...

  9. Struts2与Ajax数据交互

    写在前面: ajax请求在项目中常常使用,今天就平时掌握的总结一下,关于使用ajax请求到Struts2中的action时,前台页面与后台action之间的数据传递交互问题. 这里我主要记录下自己所掌 ...

随机推荐

  1. Vue 高德地图 路径规划 画点

    CDN 方式 <!--引入高德地图JSAPI --> <script src="//webapi.amap.com/maps?v=1.4.13&key=您申请的ke ...

  2. 自己常用的Linux命令和Hadoop命令

    记录自己常用的Linux命令: ss的启动命令:ssserver -c /etc/shadowsocks.json jupyter notebook的启动命令:jupyter notebook --a ...

  3. SVN代码迁移到GITlab

    ==================================================================================================== ...

  4. Linux centos7 shell 介绍、 命令历史、命令补全和别名、通配符、输入输出重定向

    一.shell介绍 shell脚本是日常Linux系统管理工作中必不可少的,不会shell,就不是一个合格管理员. shell是系统跟计算机硬件交互使用的中间介质,一个系统工具.实际上在shell和计 ...

  5. Django - 后台admin不显示带auto_now, auto_now_add选项的字段

    https://stackoverflow.com/questions/6386172/datetimefield-doesnt-show-in-admin-system 解决办法 class Rat ...

  6. 解决linux乱码问题

    echo "LANG="zh_CN.UTF-8" >> /etc/sysconfig/i18n yum -y install kde-l10n-Chinese ...

  7. BZOJ 3262: 陌上花开 (cdq分治,三维偏序)

    #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; c ...

  8. 树莓派3B 安装gcc和g++

    转:https://blog.csdn.net/zhuming3834/article/details/81946707 安装 如果不是root 用户,请自行加上sudo apt-get instal ...

  9. TensorFlow:使用inception-v3实现各种图像识别

    程序来自博客: # https://www.cnblogs.com/felixwang2/p/9190740.html上面这个博客是一些列的,所以可以从前往后逐一练习. # https://www.c ...

  10. windows C++ 网络编程

    转载:https://blog.csdn.net/yao_hou/article/details/91400832  https://blog.csdn.net/Ctrl_qun/article/li ...