通常我们需要利用Action返回用户需要的一些信息,当然一些信息可能很简单,但一些信息则会很复杂;现在以一个具体事例来探讨一些复杂信息的封装。
这里所说的封装是针对于Struts标签,是为了Action返回的数据能够更好的,更方便的在用户端得到展示;比如说list,这就是个很好的信息表现方式;因为很多数据标签都为其提供了很好的支持;下面对Action中得到的复杂原始信息封装成最终的List对象,便于在JSP中利用标签进行显示。
我想实现这样一个功能:用户单击相应的链接可以得到这样一个列表:论坛类别,此类别文章数目,所有文章留言数目以及所有文章那个回复数目。
涉及到的数据表有四个:cate_forumup,cate_forum,topic_blog,leftwd,reply_leftwd;它们之间的关系是一次一对多的关系;但reply_leftwd与topic_blog是一对多的关系。
利用Hibernate数据持久化框架进行数据业务层的交互,不过为缩短篇幅直接将数据业务层代码写在Action中。
第一种方法中利用最原始的SQL语句进行查询,大家看过之后就知道原始SQL居于在某些情况下的优势啦;
public String showforum()throws Exception{
log.info("begain!");
List<foruminfos> list=new ArrayList();
List qq;
HttpServletRequest re=ServletActionContext.getRequest();
int cateforumupid=Integer.parseInt(re.getParameter("cateforumupid"));
Session session=new BaseHibernateDAO().getSession();
Transaction tx=null;
try{
SQLQuery q1=session.createSQLQuery("select b.name,sum(distinct a.times) as times,count(distinct a.ID) as topic ,count(distinct l.ID) as le,count(distinct r.ID) as r,b.ID as id from cate_forumup c
left outer join cate_forum b on b.cate_forumup_ID=c.ID left outer join topic_blog a on b.ID=a.cate_forum_ID left outer join leftwd l on a.ID=l.topic_blog_ID
left outer join reply_leftwd r on a.ID=r.topic_blog_ID where c.ID=1 group by b.name");
//q1.setInteger("cateforumid",1);
q1.addScalar("name",Hibernate.STRING);
q1.addScalar("times",Hibernate.LONG);
q1.addScalar("topic",Hibernate.LONG);
q1.addScalar("le",Hibernate.LONG);
q1.addScalar("r",Hibernate.LONG);
q1.addScalar("id",Hibernate.INTEGER);
Iterator iter1=q1.list().iterator();
log.info(q1.list().size());
while(iter1.hasNext()){foruminfos inf=new foruminfos();
Object[] obj=(Object[])iter1.next();
String name=(String)obj[0];
Long times=(Long)obj[1];
Long topic=(Long)obj[2];
Long left=(Long)obj[3];
Long reply=(Long)obj[4];
Integer id=(Integer)obj[5];
//log.info(name);
//log.info(times);
//log.info(topic);
//log.info(left);
//log.info(reply);
inf.setName(name);
inf.setNum_leftwd(left);
inf.setNum_reply(reply);
inf.setNum_topic(topic);
inf.setNum_times(times);
inf.setCateforumid(id);
list.add(inf);}
}
catch(Exception e){}
finally{
session.close();
}
setForuminfos(list);
return "main_forum.jsp";
}
大家可以看到利用原始语句,完成上述目的只需一个语句。
第二种方法中仅仅利用HQL查询技术。
实现上述功能的Action中的showforum()方法如下:
public String showforum()throws Exception{
log.info("begain!");
List<foruminfos> list=new ArrayList();
List qq;
int reply=0;
int left=0;
HttpServletRequest re=ServletActionContext.getRequest();
int cateforumupid=Integer.parseInt(re.getParameter("cateforumupid"));
Session session=new BaseHibernateDAO().getSession();
Transaction tx=null;
try{
Query q=session.createQuery("from CateForum as a where a.cateForumupId like:cateforumupid");//
q.setInteger("cateforumupid",cateforumupid);
qq=q.list(); Iterator iter=qq.iterator();
while(iter.hasNext()){
foruminfos fo=new foruminfos();
CateForum up=(CateForum)iter.next();
fo.setName(up.getName());
fo.setCateforumid(up.getId());
Query q1=session.createQuery("from TopicBlog as a where a.cateForumId like:cateforumid");
q1.setInteger("cateforumid",up.getId());
Iterator iter1=q1.list().iterator();
fo.setNum_topic(q1.list().size());
while(iter1.hasNext()){TopicBlog topic1=(TopicBlog)iter1.next();
log.info("I am here");
Query q4=session.createQuery("from Leftwd as a where a.topicBlogId like:id");
q4.setInteger("id",topic1.getId());
List list1=q4.list();
left+=list1.size();
Query q5=session.createQuery("from ReplyLeftwd as a where a.topicBlogId like:id");
q5.setInteger("id",topic1.getId());
List list2=q5.list();
reply+=list2.size();
// q1.setInteger("cateforumid",topic1.getId());
}
fo.setNum_leftwd(left);
fo.setNum_leftwd(reply);
list.add(fo);
log.info(fo.name);
log.info(fo.num_leftwd);
log.info(fo.num_reply);
log.info(fo.num_topic);
log.info(fo.cateforumid);
}
}
catch(Exception e){}
finally{
session.close();
}
setForuminfos(list);
return "main_forum.jsp";
}
在上述的方法中,我把得到的信息组装到对象foruminfos中,然后返回这样一个数据类型:List<foruminfos>,最后在JSP页面中进行展示:
<table width="700" cellpadding="0" cellspacing="0"id="table">
<tr>
<th width="25%" scope="col">论坛分类</th>
<th width="25%" scope="col">文章数量</th>
<th width="25%" scope="col">留言数量</th>
<th width="25%" scope="col">回复数量</th>
</tr>
<s:iterator value="foruminfos">
<tr>
<td><a href="showforumtopic.action?cateforumid=${cateforumid}"><s:property value="name"/></a></td>//获取此论坛类别的所有文章列表
<td><s:property value="num_topic"/></td>
<td><s:property value="num_leftwd"/></td>
<td><s:property value="num_reply"/></td>
</tr>
</s:iterator>
</table>
</div>
接着我们利用第三种方法:我们对上述表进行关联设置,然后再利用Hibernate提供的级联查询进行解决。
待续。。。。。。。
分享到:
相关推荐
本文主要探讨的是如何使用Vue自定义组件来封装数据字典,以下拉列表为例。 首先,使用Element UI的`el-select`组件可以直接创建下拉列表,但这种方式在处理多个字典数据时会变得复杂。因为每个字典都需要单独请求...
【视音频数据PS封装文件】涉及的是数字媒体处理中的一种重要技术,主要针对MPEG2-PS(Program Stream)的封装方法。PS是一种用于合并数字音频、视频等多路复用数据的容器格式,尤其适合于稳定存储媒介,如光盘。与...
在表单数据封装过程中,这些方法会被用来设置和获取属性值。 4. **前端框架集成**: 当前,许多Web应用采用前端框架(如Angular、React或Vue.js)进行视图层的构建。这些框架同样支持数据绑定,可以与后端的...
网络数据帧封装程序是计算机网络通信中的一个关键过程,它涉及到如何将上层协议的数据转换成可以在物理介质上传输的格式。在这个过程中,数据通过不同的网络层次进行包装,添加额外的信息,以便在网络中正确地传输和...
标题“echartsJava后台封装数据”暗示我们要讨论的是如何在Java后端处理并封装数据,以便于ECharts在前端进行渲染。在SpringMVC这个流行的轻量级Java Web框架中,我们可以利用其控制器(Controller)、模型(Model)...
Api接口调用封装,实现POSt,GET等数据请求,Api接口调用封装,实现POSt,GET等数据请求,Api接口调用封装,实现POSt,GET等数据请求,Api接口调用封装,实现POSt,GET等数据请求,Api接口调用封装,实现POSt,GET等数据请求,...
在研究制造网格中产品数据资源的封装技术时,首先要了解制造网格的概念。制造网格是网络化制造研究中的一个热点领域,它主要通过计算协议实现分布式资源的透明共享。由于制造网格中存在大量的异构和复杂的制造资源,...
在数据访问架构中,封装通常体现在数据访问对象(DAO)的设计上,DAO作为数据存取的接口,隐藏了数据库连接、SQL查询等具体实现,只提供增删查改等基本操作。 可扩展性则是架构设计的另一个关键要素。一个可扩展的...
"再按PKCS#10格式封装证书请求数据",则涉及到了数据的打包过程。在生成PKCS#10请求时,通常需要使用特定的库或工具,如OpenSSL,将证书请求的各个部分按照PKCS#10的标准结构组合起来,然后使用私钥进行签名。这个...
在Python中,处理JSON格式的数据是一种常见的数据封装和解析的方式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python中处理JSON数据的库主要有...
IP数据报的封装的动画演示,供大家更容易学习ip数据报的封装过程
"db 数据封装"这一主题涉及到将数据库操作进行抽象化和模块化的技术,目的是提高代码的复用性、可维护性和性能。这里,我们讨论的是一个由开发者自定义的数据源封装,它支持多数据库访问,并且内部实现了线程池,...
在本部分中,我们将详细介绍当PC1尝试通过Telnet协议连接到同一子网内的PC2时的数据封装与解封装流程。 **1. 应用层发起请求** - **步骤描述**:用户在PC1的应用层发起一个Telnet连接请求,目的是与PC2建立会话。 ...
标题提到的“c#全部数据操作的封装类”就是一个这样的工具,它提供了对不同数据库系统(如Oracle、MySQL、Access)的支持。这个压缩包中的"DBUtility"很可能是一个包含了各种数据库操作方法的静态类或者实例类。 ...
"ios-AF数据请求封装.zip"是一个针对iOS平台的网络请求库,它利用了著名的第三方库AFNetworking进行封装,使得数据请求变得更加便捷高效。AFNetworking是Objective-C中最受欢迎的HTTP客户端库,它的强大功能和易用性...
随着先进制造技术以及先进计算机技术的不断发展,网络化制造的某些不足得到一定程度的弥补,在此基础上提出了"制造网格"的概念,文章主要针对制造数据资源封装结构设计几点技术问题进行探讨,对于我国制造网络化发展具有...
本文将深入探讨如何利用QSerialPort进行串口通信,并且着重讲解如何在阻塞模式下发送数据后等待读取缓冲区的数据结果,以及如何在多线程环境中初始化串口和读取数据。 首先,QSerialPort类提供了一系列的方法用于...
数据手册则是FMC封装的技术文档,其中详细介绍了FMC封装的技术参数和使用方法,对于使用FMC封装的人员来说,数据手册是必不可少的参考资料。 FMC封装全称为"Foxconn Microelectronics Connector",是由富士康公司...
Newtonsoft.Json已经足够强大,易用性也没得说。但是在使用过程中存在着一个问题,如果数据不存在...JsonObject类和JsonArray类可以相互嵌套,支持原生类的JsonPath检索能力,满足Json数据解析和Json数据封装常见需求。