• type属性表明了本次应答结果的类型。该属性的取值可使用struts-default.xml
中预定义的result-type:
dispatcher //(默认值)转发到jsp页面;
stream //文件流
redirect //重定向(可以转到jsp或action)
redirectAction //重定向到另一Action
• redirect与redirectAction的使用区别:
1、使用redirect时url需要.action后缀名,使用redirectAction不需要后缀名;
2、redirect可以转到其它命名空间下的action或其它网址,而redirectAction只能转到同一命名空间下的 action
• 如果要返回JSON文本,可定义action类的execute()方法返回void,在代码中直接使用HttpServletResponse输出JSON字符串即可。
【示例代码】
HttpServletResponse resp=ServletActionContext.getResponse();
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/json");
resp.getWriter().println(array.toString());
生成JSON字符串方法一
• 使用json-lib.jar帮助生成JSON字符串,它依赖ezmorph.jar,所以在想要利用这两个jar包,需要将他们的jar文件拷贝到webContent下的lib文件夹中,当然也可以使用其他两个jar文件jackson-core-asl-1.9.2.jar和jackson-mapper-asl-1.9.2.jar,用法上稍有区别
单个java对象的转换
JSONObject.fromObject(bean).toString();
若要返回数组:
JSONArray.fromObject(bean).toString();
JSONArray.fromObject(array).toString();
其中的array参数可以为java数组对象,也可以是java的集合对象
注:java.util.Date对象返回到客户端后是普通的javascript对象。
private Date productDate = new Date();
public Date getProductDate() {
return productDate;
}
public void setProductDate(Date productDate) {
this.productDate = productDate;
}
/**
* 商品检索返回json格式的数据
*/
public void prdSearch() {
String prdName = super.getParameter("prdName", String.class);
Float lowPrice = super.getParameter("lowPrice", Float.class);
Float highPrice = super.getParameter("highPrice", Float.class);
//将客户端提交的参数装载到Map集合中
HashMap<String, Object> condition = new HashMap<String, Object>();
if (prdName != null) {
condition.put("prdName",prdName);
}
if (lowPrice != null) {
condition.put("lowPrice",lowPrice);
}
if (highPrice != null) {
condition.put("highPrice",highPrice);
}
//获得检索的商品信息
List<ProductInfo> prdList = this.productService.searchByCondition(condition);
//以JSON格式返回给客户端
HttpServletResponse resp = ServletActionContext.getResponse();
//服务器响应的字符集
resp.setCharacterEncoding("utf-8");
//服务器响应的内容类型
resp.setContentType("application/json");
//将服务器包装的数据应答到客户端
try {
JSONArray.fromObject(prdList).write(resp.getWriter());
} catch (IOException e) {
e.printStackTrace();
}
}
生成JSON字符串方法二
• 配置<result type=“json”>方式返回json结果,以符合struts工作流程的方式来返回json数据
1、添加 struts2-json-plugin-2.3.x.jar
2、Action中将需要返回的java对象放入值栈中,并返回”success”
3、在struts.xml中配置:
<package extends="json-default" ...>
<result type="json">
<param name="root">object key</param>
</result>
</package>
【示例】
/**
* 根据条件检索商品,返回json格式的数据
*
* @return
*/
public String prdSearch2() {
String prdName = super.getParameter("prdName", String.class);
Float lowPrice = super.getParameter("lowPrice", Float.class);
Float highPrice = super.getParameter("highPrice", Float.class);
//将客户端提交的参数装载到Map集合中
HashMap<String, Object> condition = new HashMap<String, Object>();
if (prdName != null) {
condition.put("prdName",prdName);
}
if (lowPrice != null) {
condition.put("lowPrice",lowPrice);
}
if (highPrice != null) {
condition.put("highPrice",highPrice);
}
//获得检索的商品信息
List<ProductInfo> prdList = this.productService.searchByCondition(condition);
//将服务器返回的信息放入值栈中,让客户端来获取
super.add2ValueStack("prdList", prdList);
return SUCCESS;
}
struts.xml配置
<action name="prdSearch2" class="com.xixi.struts_demo.action.ProductAction" method="prdSearch2">
<result type="json">
<param name="root">prdList</param>
</result>
</action>
jsp页面获取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="/struts_demo/js/jquery-3.2.1.js"></script>
<script type='text/javascript'>
jQuery(function(){
$("input[value='检索']").click(function(){
var prdName = $("input[name='prdName']").val();
var lowPrice = $("input[name='lowPrice']").val();
var highPrice = $("input[name='highPrice']").val();
var data={};
if (prdName) {
data.prdName = prdName;
}
if (lowPrice) {
data.lowPrice = lowPrice;
}
if (highPrice) {
data.highPrice = highPrice;
}
// $.post("/struts_demo/prd/prdSearch.action",data,function(r){
$.post("/struts_demo/prd/prdSearch2.action",data,function(r){
if (r) {
console.info(r);
var prd = null;
var tbody = $("#tbody1");
tbody.empty();
var row = null ;
for (var i=0; i<r.length; i++) {
prd = r[i];
console.info(prd.productDate);
row = "<tr><td>" + prd.prdId+"</td><td>"+prd.typeId+"</td><td>"+prd.prdName+"</td><td>"+prd.prdDesc+"</td><td>"+prd.price+"</td></tr>";
tbody.append(row);
}
}
},"json");
});
});
</script>
</head>
<body>
<h3>商品检索</h3>
商品名称:<input type="text" name="prdName"/><br/>
价格范围:<input type="text" name="lowPrice"/>~<input type="text" name="highPrice"/><br/>
<input type="button" value="检索"/>
<hr/>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>类别</th>
<th>名称</th>
<th>描述</th>
<th>价格</th>
</tr>
</thead>
<tbody id="tbody1">
</tbody>
<tr>
</table>
</body>
</html>
注: java.util.Date对象返回到客户端后是String对象,若要控制该字符串格式,可在java类的相关属性get方法上添加@JSON注解。如下:
@JSON(format = "yyyy-MM-dd HH:mm:ss")
网友评论