文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Struts2和Ajax怎么实现数据交互

2023-06-08 06:24

关注

Struts2和Ajax怎么实现数据交互?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1.使用stream类型的result

此种类型可以直接让Struts2中的action向客户端浏览器生成文本响应。

示例:

jsp页面:

<%@ taglib prefix="s" uri="/struts-tags" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>ajax提交登录信息</title> <%--导入js插件--%> <script src="${PageContext.request.contextPath}/demo/js/jquery-1.4.4.min.js" type="text/javascript"></script></head><body><h4>异步登录</h4><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" ></div></body><script type="text/javascript"> $("#loginBtn").click(function(){ $("#show").hide(); //发送请求login 以各表单里歌空间作为请求参数 $.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("登录结果:"+data+"<br/>");  $("#show").show(600); },"html");//指定服务器响应为html });</script></html>

处理逻辑的action:

public class LoginAction extends ActionSupport{ private String username; private String psw; //输出结果的二进制流 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("对不起,登录失败".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中除了接收页面传递的用户名、密码外,还有一个InputStream类型的成员变量,并为它提供了对应的get方法。get方法中返回的二进制流将会直接输出给客户端浏览器。

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流生成响应的数据类型-->  <param name="contentType">text/html</param>  <!--指定action中由哪个方法去输出InputStream类型的变量-->  <param name="inputName">inputStream</param>  </result> </action> </package></struts>

在浏览器中浏览该页面,并输入相关信息,然后提交,可以看到后台action直接将消息数据返回给页面,而同时页面也不需要进行刷新,而是直接在局部进行显示,这是利用了ajax的异步发送请求。注意,此种方式需要在struts.xml文件中要配置类型为stream的流,并设置inputName属性,并在action中提供InputStream对应的get方法。

运行截图:

Struts2和Ajax怎么实现数据交互

2.使用json类型的result

有个jar包struts2-json-plugin-2.3.16.3.jar,可以为Struts2增加JSON插件,即当action中的result的类型设为json时,也可以在客户端js中异步调用action,并且action中返回的数据,可以直接被JSON插件序列化成json格式的字符串,并将该字符串返回给客户端浏览器。

示例:

jsp页面:

<%@ taglib prefix="s" uri="/struts-tags" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>ajax提交登录信息</title> <%--导入js插件--%> <script src="${PageContext.request.contextPath}/demo/js/jquery-1.4.4.min.js" type="text/javascript"></script></head><body><h4>异步登录</h4><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" ></div></body><script type="text/javascript"> $("#loginBtn").click(function(){ $("#show").hide(); //发送请求login 以各表单里歌空间作为请求参数 $.get("login",$("#loginForm").serializeArray(),  function(data,statusText){  //此时的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>

在浏览器中浏览该页面,并输入相关信息,然后提交,可以看到后台action直接将消息数据返回给页面,而同时页面也不需要进行刷新,而是直接在局部进行显示,这是利用了ajax的异步发送请求。注意,此种方式需要在struts.xml文件中要配置package继承json-default,且配置result类型为json,并在action中提供需要传递数据的对应的get方法。当然了前提是添加了struts2-json-plugin-2.3.16.3.jar,不然struts2是不会自动将数据转为json格式的数据的。

效果截图:

Struts2和Ajax怎么实现数据交互

故我们可以总结一下result类型为json的步骤:

  1.导入jar包:struts2-json-plugin-2.3.7.jar  

  2.配置struts返回的结果集视图 设置type=json

  3.设置对应action所在的package继承自json-default

  4.将要返回的数据提供get方法

  5.在struts.xml中设置返回数据的格式

对于第5步设置返回数据的格式,可以根据自己项目的需要,去具体设置,这里只是简单举例,并没有拿复杂的数据,如果是返回一个List集合,那么对于数据的格式可以进行如下设置:

<result name="test" type="json">  <!-- 设置数据的来源从某个数据得到 -->   <!-- 过滤数据从gtmList集合中得到,且只获取集合中对象的name,跟uuid属性 -->      <param name="root">gtmList</param>  <param name="includeProperties">    \[\d+\]\.name,    \[\d+\]\.uuid  </param> </result>

上面这种方式外,还有下面这种方式

<result name="ajaxGetBySm" type="json">   <!-- 一般使用这种方式 先用来源过滤action默认从整个action中获取所有的(前提是此action中没有getAction()方法)    但是为了方便 一般不写root:action这个    然后再用包含设置进行过滤设置   -->       <param name="root">action</param>   <param name="includeProperties">     gtmList\[\d+\]\.name,     gtmList\[\d+\]\.uuid   </param> </result>

上面两种方式都是设置数据从gtmList集合中获取且,只获取对象的属性为name与uuid的。这里只做简单的举例,具体可自己下去深入研究。

附上json类型的Result允许指定的常用参数:

Struts2和Ajax怎么实现数据交互

另外,除了以上两种是struts2支持的ajax外,其实如果单纯的只是可以让服务器端可以跟客户端浏览器进行数据交互,可以使用response.getWrite()这种方式。

PrintWriter printWriter =response.getWriter();printWriter.print("success");

选择哪种方式?

对于我,如果只是对增删改功能是否成功的一个flag判断的数据,则可优先选择response.getWriter().print("xxx")与设置result类型为stream的方式,但是如果是需要返回大量对象数据,在页面接收然后进行数据展示,例如页面通过ajax请求,需要后台action返回一个list集合,则就要选择配置result类型为json的方式了。

看完上述内容,你们掌握Struts2和Ajax怎么实现数据交互的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯