action中怎么获取请求参数值,并返回json格式的数据
配置struts.xml文件(struts2)
<package name="api" extends="json-default">
<action name="account" class="com.api.accountAction">
<result type="json">
<param name="root">ajaxResult</param>
</result>
</action>
</package>
- package extends属性写“json-default”,但是要先把struts2开发包中的struts2-json-plugin-2.2.3这个jar包导进自己的工程
- 添加action,name即action的名字,class为对应的java类
- result标签 type属性设为"json"
- <param></param>之间的值就是ajaxResult就是最终返回的数据,即在action中,要返回的json数据都要设置给ajaxresult.
编写action
image.pngaction中定义一个名字为 ajaxResult的JSONObject,和前面struts.xml配置文件中<param></param>中的ajaxResult对应
获取请求参数
1.通过Servlet API来获取(这种方法有很多,我只提到一个).
这种方法你可以理解成通过request.getParameter("key")来获取
但是在action中,不能够直接获取request对象,必须通过ActionContext这个类,看代码
ActionContext ctx=ActionContext.getContext();
Map<String,Object> parameters=ctx.getParameters();
其中getParameters()这个方法会返回一个包含所有HttpServletRequest参数信息的Map对象,不过要注意你通过这个map.get("key")得到的是一个String object.此外ActionContext还有很多其他方法,如获得session,application等,需要的自行查阅文档。
2.通过实现ModelDriven接口获取
当我们提交的数据比较少时,我们可以通过servlet API一个个获取,但是当数据比较多的时候,这种方法就不是很好了,这时候我们可以用struts2给我们提供的ModelDriven接口来实现。
假如我传递的参数有俩个一个是page,一个是limit,用于实现返回分页的数据
第一步:定义一个PageModel
设定俩个private属性,page,limit.并分别实现setter和getter方法,代码比较简单,就不贴了。
第二步:实现ModelDriven接口
让我们的action implements ModelDriven<PageModel>,既然实现了人家的接口,那么就要按要求实现人家的方法。
private PageModel pageModel=new PageModel(); //要先实例化
public PageModel getModel(){
return this.pageModel;
}
第三步:接收参数
通过上面简单的俩步,就实现了自动接收参数,即当请求交给这个action处理的时候,所带的page和limit参数就会自动赋值给这个PageModel.需要用的时候,只需要从PageModel中get就可以了。
返回json数据
首先要知道,有俩种做法,一种返回的是json字符串,前端拿到后需要解析字符串,还有一种做法是直接返回json对象,我采用的是第二种。
然后我用了阿里的fastjson这个json库,真的非常好用,速度也很快,推荐给大家。前面的ajaxResult是一个JSONObject,所以我们只需要给这个对象里put就可以。
先引入com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONObject;
public String queryAccount() {
int page=Integer.parseInt(pageModel.getPage());
int limit=Integer.parseInt(pageModel.getLimit());
try {
res=DAOFactory.getIAccountDAOInstance().findSome((page-1)*limit, page*limit);
int totalCount=DAOFactory.getIAccountDAOInstance().getCount();
ajaxResult.put("code", 0);
ajaxResult.put("msg", "");
ajaxResult.put("count", totalCount);
ajaxResult.put("data", res);
return SUCCESS
} catch (Exception e) {
System.out.println(e);
return SUCCESS;
}
}
然后访问account!queryAccount?page=1&limit=15,前台拿到的数据如下图
image.png