Struts中异步传送XML和JSON类型的数据

    昨天和今天学习了XML和JSON型在struts2中的用法,当然,这需要与ajax结合起来使用,在项目中可以用到用户注册验证用户唯一性、无需刷新页面即可刷新部分数据等操作。

    虽然就目前来说,JSON要比XML流行,但是可以预见的是,未来一段时间内,还是会有不少的企业依然会用到XML文件,故这里同时讲解了XML文件的生成和在JS中的解析。

    我想熟悉Web的人大多数应该都会使用AJAX来与服务器进行异步的交互数据而不影响前台用户的使用,改善了用户体验。

    关于用于生成XML和JSON格式数据的原理,我没有详细研究,后面随着学习的深入,我想我会进一步进行研究学习的。

    下面开始说明原理:

    前台页面通过ajax发请求到后台,根据请求数据创建要返回到前台的对象,然后将对象组装成XML或则JSON格式的数据,送回到前台,在JS中对返回的数据进行解析并显示到页面上。

    这两个东西是一起进行学习的,所以对XML和JSON数据格式的学习,放到了同一个工程内。

第一步,新建web工程struts2-ajax,首先加入对应的jar包,总体工程结构及jar包如下:




 
 第二步,配置web.xml文件,指定struts2的filter,配置文件信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
 xmlns=" http://java.sun.com/xml/ns/javaee"
 xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>*.action</url-pattern>
  </filter-mapping>
</web-app>

第三步,写界面,我这里为了省事期间,就直接在index.jsp中进行修改,代码如下:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <script type="text/javascript" src="scripts/jquery-1.4.4.js"></script> 
 <script type="text/javascript">
  function getInfo(){
  $.post("getXMLAction.action",
  {
   name: $("#name").val()
  },function(returnedData, status)
  {
   alert(returnedData + "," + status);
   var name = $(returnedData).find("name").text();
   var age = $(returnedData).find("age").text();
   var height = $(returnedData).find("height").text();
   var address = $(returnedData).find("address").text(); 
   var html = "<table width='60%' border='1'>" +
   "<tr><td>name</td>" +
   "<td>age</td>" +
   "<td>height</td>" +
   "<td>address</td></tr><tr><td>" + name + "</td><td>" + age + "</td><td>" + height + "</td><td>" + address + "</td></tr></table>";
   $("body table:eq(0)").remove();
   $("body").append(html);
  });  
  }
  function getJsonInfo() {
   $.post("getJSONAction.action", {name:$("#name").val()}, function(returnedData, status) {
    alert(returnedData);
    var html = "<table width='60%' border='1'>" +
   "<tr><td>name</td>" +
   "<td>age</td>" +
   "<td>height</td>" +
   "<td>address</td></tr><tr><td>" + returnedData.name + "</td><td>" + returnedData.age + "</td><td>" + returnedData.height + "</td><td>" + returnedData.address + "</td></tr></table>";
   $("body table:eq(0)").remove();
   $("body").append(html);
   });
  }
 
 </script>
  </head>
 
  <body>
   <select id="name">

 <option value="zhangsan">zhangsan</option>
 <option value="lisi">lisi</option>

   </select>  
    <input type="text" id="address"/>
 <input type="button" value="getXMLinformation" οnclick="getInfo();"><br>
 <input type="button" value="getJsonInformation" οnclick="getJsonInfo();"/>
  </body>
</html>

第四部,写对应的Action,由于在Action中用到了pojo类,故先编写pojo类,

People.java:

import java.io.Serializable;

public class Person implements Serializable {

 /**
  *
  */
 private static final long serialVersionUID = 4533675673212332584L;
 
 private String name;
 
 private int age;
 
 private int height;
 
 private String address;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public int getHeight() {
  return height;
 }

 public void setHeight(int height) {
  this.height = height;
 }

 public String getAddress() {
  return address;
 }

 public void setAddress(String address) {
  this.address = address;
 }
}
然后,XML的Action,GetXmlAction.java

package com.ajax.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import com.ajax.pojo.Person;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 通过AJAX获取xml文件的Action
 * @author xiaoyun 2013-07-29
 */
public class GetXMLAction extends ActionSupport {

 /**
  *
  */
 private static final long serialVersionUID = 4049585162336088777L;
 
 private String name;

 public String execute() {
  try {
   Person person = null;
   if("zhangsan".equalsIgnoreCase(name)) {
    person = new Person();
    person.setName("zhangsan");
    person.setAge(20);
    person.setHeight(160);
    person.setAddress("北京");
   } else {
    person = new Person();
    person.setName("lisi");
    person.setAge(11);
    person.setHeight(170);
    person.setAddress("山东菏泽");
   }
   HttpServletResponse response = ServletActionContext.getResponse();
   // 指定response返回类型为xml格式,并以utf-8格式编码
   response.setContentType("text/xml;charset=utf-8");
   response.setHeader("cache-control", "no-cache");
   PrintWriter pw = response.getWriter();
   // 组织文档结构
   Document doc = this.orderDoc(person);
   // 规定文件传输格式
   OutputFormat format = OutputFormat.createPrettyPrint();
   format.setEncoding("utf-8");
   // 将doc以指定格式放到输出流(通过XMLWriter)
   XMLWriter xw = new XMLWriter(pw, format);
   // 写出到输入流
   xw.write(doc);
   // 刷新缓冲
   pw.flush();
   // 将流关闭并释放其关联的所有系统资源
   pw.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  return null;
 }
 
 /**
  * 根据People对象创建xml文件
  * @param person
  * @return
  * @throws UnsupportedEncodingException
  */
 private Document orderDoc(Person person) throws UnsupportedEncodingException {
  // 创建doc文档
  Document doc = DocumentHelper.createDocument();
  // 创建根节点
  Element rootElement = doc.addElement("persons");
  // 增加注释说明
  rootElement.addComment("This is comment,这是注释说明");
  // 增加二级子节点
  Element e = rootElement.addElement("person");
  // 为二级子节点增加子节点(属性)
  Element nameElement = e.addElement("name");
  Element ageElement = e.addElement("age");
  Element heightElement = e.addElement("height");
  Element addressElement = e.addElement("address");
  // 为三级子节点赋值
  nameElement.setText(person.getName());
  ageElement.setText(Integer.toString(person.getAge()));
  heightElement.setText(Integer.toString(person.getHeight()));
  //String add = new String(person.getAddress().getBytes("utf-8"), "ISO8859-1");
  addressElement.setText(person.getAddress());
  return doc;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
}
接着,组装JSON数据的Action,GetJSONAction.java

 

package com.ajax.action;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.ajax.pojo.Person;
import com.google.gson.Gson;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 传输JSON格式的字符串
 *
 * @author XiaoYun 2013-07-30
 */
public class GetJSONAction extends ActionSupport {

 /**
  *
  */
 private static final long serialVersionUID = -8368751107393347647L;
 
 private String name;
 
 @Override
 public String execute() throws Exception {
  // 实例化person对象
  Person person = new Person();
  person.setName(name);
  person.setAge(10);
  person.setHeight(160);
  person.setAddress("中国人名");
  // 通过Gson将对象转换为json字符串
  Gson gson = new Gson();
  String result = gson.toJson(person);
  // 获取response对象
  HttpServletResponse response = ServletActionContext.getResponse();
  // 指定文件格式为json类型,编码类型为utf-8
  response.setContentType("application/json; charset=utf-8");
  response.setHeader("cache-control", "no-cache");
  PrintWriter pw = response.getWriter();
  pw.write(result);
  pw.flush();
  pw.close();
  return null;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
}
第五步,写struts.xml配置文件

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
 <package name="ajax" extends="struts-default">
  <action name="getXMLAction" class="com.ajax.action.GetXMLAction">
  </action>
  <action name="getJSONAction" class="com.ajax.action.GetJSONAction">
  </action>
 </package>
</struts>

 

好,总体文件就配置完毕,接着部署到tomcat5.5,启动,运行,没有问题,运行截图如下所示,我这里使用的是火狐浏览器,使用web控制台查看的返回信息。

下面个这个是xml类型的数据,红色的框框中为返回的报文: 

 

 

下面这个是json类型的数据,红色框框中为返回的报文:



 至此,项目告一段路,当然了,其实在struts2中也有与json类型整合的插件,在返回类型中指定返回类型type=result,如果要指定要出去的成员变量,可以使用<param name="excludeProperties">xxx,xxx</param>,当然也可以指定返回的变量,这个你可以自行查看源代码,使用struts2提供的插件时,struts.xml继承的struts-defalut要变为json-default。

       以上者前几天学习的内容,有不完整和讲解不透彻的地方请各位同行批评指正。下次将发表使用spring在一个工程中连接多个数据库的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值