SSH框架在线商城项目之战7中Struts2和Json的集成
在前一篇文章中,我们在DataGrid中完成了json数据的显示,但是并没有和后台连接,只是简单的显示了自己制作的json数据。在这一部分中,我们集成了json和Struts2,以打开EasyUI和Struts2之间的交互。
1.json环境构建json环境构建非常简单,只需导入json的jar包,如下图:
(注:JSON-lib-2.4 jar包下载地址:http://xiaozai.jb51.net/201605/yuanma/JSON-LIB-2.4(jb51.net)。rar)
2.完美动作在DataGrid控件中有一个属性,那就是url,它可以指定请求数据的url地址。在前一节中,我们直接将这个地址设置为一个具体的json文件,在这里我们将这个url设置为一个操作,例如URL 3360 ' category _ queryjoincount . action '。表示请求categoryAction的queryJoinAccount方法(query.jsp的代码将在文章末尾给出)。因此,我们需要在categoryAction中完成queryJoinAccount方法。在Struts2和json集成之前,我们先来看看json数据之前显示一次时发送了哪些请求:
类型是Category类的一个属性,我们已经在BaseAction中实现了ModelDrivenCategory接口,所以这个类型将被封装在模型中。我们不需要关心它,但是我们可以通过模型得到它,但是我们需要自己获取EasyUI自动发送的页面和行参数。因此,我们可以在BaseModel中添加两个成员变量page和行,并实现get和set方法。最后,我们要考虑的是,在得到所有这些参数之后,我们会根据这些参数查询数据库中的数据,那么我们应该把发现的数据放在哪里呢?并且必须以json格式打包并发送到前台才能被DataGrid显示。我们不考虑如何将查询的数据打包成json格式。我们首先考虑将数据放在一个地方,自然会想到使用Map,因为json格式的数据是键值形式的。考虑到这一点,我们继续改进基本行动:
@ Controller(' base action ')@ Scope(' prototype ')公共类BaseActionT扩展ActionSupport实现了RequestAware、SessionAware、ApplicationAware,ModelDrivenT {//页面和行与分页相关。pageMap存储查询的数据,然后将其打包成json格式。//Page和row实现get和set方法。pageMap只需要实现get方法,因为pageMap不接收前台参数,而是一个由struts获取的受保护的Integer页面。受保护的整数行;受保护的映射字符串,对象页面映射=空;//让不同的Actions自己实现//省略get和set方法./* * * * * * * * * * * * * * * * * * * * *,仍然是原来的BaseAction部分。@受资源保护的帐户服务帐户服务;//域对象protectedmapstring,objectrequest受保护的映射字符串,对象会话;受保护的映射字符串,对象应用程序;@ Override public void set application(MapString,Object application){ this . application=application;} @ Override public void setSession(MapString,Object session){ this . session=session;} @ Override public void setRequest(MapString,Object request){ this . request=request;} //ModelDriven保护的T模型;@ Override public T getModel(){ parameter zed type=(parameter zed type)this . getclass()。getGenericSuperclass();Class clazz=(Class)type . GetAdactualTYPearguments()[0];尝试{ model=(T)clazz . NewInstance();} catch (Exception e) {抛出新的RuntimeException(e);}退货模式;}}好的,在完善了BaseCategory之后,我们可以在categoryAction中编写queryJoinAccount方法,我们会删除categoryaaction中所有的原始方法,因为之前构建环境的时候都是用来测试的,它们都是无用的。现在我们真正开始项目代码:
@ controller(' categoryaaction ')@ scope(' prototype ')公共类categoryaaction扩展了base action category { public string queryjoincound(){//用于存储pagemap=new hashmap string,object();//根据关键字和分页参数查询对应的数据。当级联查询列表类别列表=category Service . query joinaccount(model . gettype()、page、row)完成时,该方法写入Servicepage map . put(' row ',categoryList);//以json格式存储。从上一节的JSON文件中可以看出,一个键是total,另一个键是row。这里,首先存储行。//根据关键字查询记录总数。long total=categoryservice . getcount(model . gettype());//这个方法不写。稍后我们将转到服务层进行改进。//System.out.println(合计);pageMap.put('total ',total);//以JSON格式存储,然后在return 'jsonMap '中存储合计;}}所以我们写了《行动》。现在,Action从前台获取参数,然后根据参数查询指定类型的记录总数和指定类型的所有商品,并根据json中指定的键(即total和row)将它们存储在HashMap中。之后,这个HashMap中的数据可以由DataGrid通过打包成json格式并发送到前台来显示。我们先把这个HashMap放在这里,先改进Service层代码,然后把数据打包到这个HashMap中。
3.改进categoryService从上面的categoryAction,需要在categoryService中增加一个getCount方法,应该在具体的实现类中实现,如下所示:
//CategoryService接口公共接口类别服务扩展baseservicecategory {//查询类别信息,级联管理员公共列表类别查询joinaccount(字符串类型,int page,int size);//使用类别的名称进行查询//根据关键字查询总记录数public Long getCount(字符串类型);} //CategoryServiceImpl实现类@ suppresswarnings('未选中')@ service ('categoryservice ')。公共类CategoryServiceImpl扩展BaseServiceImplCategory实现CategoryService { @ Override public list Category query join account(String ty PE,int page,int size) { String hql='从Category c left join fetch c . account,其中c.type像: type ';Getsession()。createquery (hql)。setstring ('type ',' %' type'% ')。setfirst result((page-1)* size)//从中显示。setMaxResults(size) //来显示几个。list();} @覆盖公共Long getCount(字符串类型){ String hql='从c类中选择count(c),其中c.type类似: type ';返回(长)getSession()。createQuery(hql)。setString('type ',' %' type '% ')。uniqueResult();//以:条总记录返回一条记录}}截至目前,该数据库的数据采集之路已经开启。前两个步骤完成了前台数据库的数据采集。接下来,存储在HashMap中的数据将被打包并发送到前台。
4.配置struts.xml指定的数据可以通过在struts.xml中配置来打包。
struts常量名称='struts.devMode '值='true' /包名称='shop' extends='json-default '!- jason-default继承struts-default-global-results结果名称=' ain dex '/web-INF/main/ain dex . JSP/result/global-results!- class对应于Spring中配置的Action的id值,因为它应该交给Spring进行管理-action名称=' category _ * ' class=' category Action '方法=' {1} '!-必须先添加json包,然后继承JSON-default-result name=' JSON map ' type=' JSON '!-要转换为json对象的数据-param name=' root' pagemap/param!-配置黑名单,过滤不必要的选项,支持json格式的正则表达式:{total:3,row :[{ account 3360 { id :2,login3360' user ',name:' customer service a ',pass:' user'},hot: true。-row[0]. account . pass-!-这里不能显示正则表达式,这是CSDN的bug。下面我就一一放出来-/param/result/action action name=' account _ * ' class=' account action ' method=' { 1 } ' result name=' index '/index . JSP/result/action!-用于完成系统请求转发的操作,所有请求都被移交给执行-操作名称=' send _ * _ * '类=' sendaction '结果名称=' send'/web-INF/{1}/{2}。JSP/result/action/package/struts(9502 . 163.com)。
从上面的配置可以看出,首先package应该继承json-default,因为json-default继承了struts-default,因为JSON jar包里面有一个struts 2-JSON-plugin-2 . 3 . 24 . 1 . jar,打开的时候可以看到里面有一个struts-plugin.xml,打开的时候可以看到json-default继承了struts-default:
接下来,我配置result,name是操作刚刚返回的字符串,type必须与json匹配。然后是结果中的参数。首先,它必须与名为root的参数匹配。这个参数应该与只需要转换的HashMap对象相匹配,也就是我们定义的页面映射。有了这个参数配置,struts将把pageMap中的数据打包成json格式。然后配置黑名单,也就是告诉struts哪些字段不需要打包,比如管理员密码。从上面注释中的jason格式可以看出,row[0]. account . pass代表密码字段,但是必须有多条数据,所以我们要用正则表达式来表示,这样所有的密码就不会打包在json中了。
5.修改query.jsp的内容后,我们将数据打包成json格式。接下来,我们可以改进前景query.jsp的内容,使数据网格正确显示:
“% @”页面语言=“Java”导入=“Java”。乌提尔。* "页面编码=' UTF-8 ' %!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' HTML head % @ include file='/PUBLIC/head。jspf ' % script type=' text/JavaScript ' $(function(){ $(' # DG ')).datagrid({ //url地址改为请求类别操作URL : '类别_查询joinaccount。操作',loadMsg: '正在加载. ',queryParams: { type: ' ' },//type参数,这里不需要传具体的类型,因为我们要显示所有的//width:300,fitColumns:true,striped:true,nowrap:true,singleSelect:true,pagination:true,rowStyler:函数(索引,行){ console.info('index' index ',' row)if(index % 2==0){ return ' background-color : # fff;';} else { return '底色: # ff0';} },frozen columns 3360[[{ field : ' checkbox ',checkbox:true},{field:'id ',title: '编号,宽度:200} //这里的领域字段要和数据库中的一样,也就是要跟数据数据中的一样]],列:[[ {field:'type ',title: '类别名称,宽度:100,//字段formatter:类型函数(值、行、索引){ return ' span title=' value ' ' value '/span ';} },{field:'hot ',title: '热卖,宽度:100,//字段热格式化程序:函数(值、行、索引){ if(值){ //如果是很热,该值为真值是布尔型变量返回"输入类型="复选框已选中="已选中"已禁用="真";//勾选} else { return '输入类型='复选框' disable=' true//不勾选} } },{field:'account.login ',title: '所属管理员,width:200,//account.login管理员登录名formatter:函数(值、行、索引){ if(row.account!=null row.account.login!=null){返回行。账户。登录;//如果登录名不为空,显示登录名} else { return '此类别没有管理员;} } } ]] });});/script/head body table id=' DG '/table/body/html 6 .测试显示结果最后我们测试一下数据网格的显示结果,如下:
到这里,我们成功整合了结构2和json,现在可以和前台传输数据格式的数据了。(注:到最后我会提供整个项目的源码下载!欢迎大家收藏或分享)原文地址:http://博客。csdn。net/eson _ 15/article/details/51332758以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:SSH框架在线商城项目之战7中Struts2和Json的集成是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。