A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我采用的四  struts + hibernate
jsp页面一加载即显示数据库信息(需要联合查询)
我先后采用了两种办法
第一种 直接从jsp页面访问数据层(这么做是否不安全呢)
  1. IPasternService pasterService=new PasternService();
  2.      List<Pastern> result=pasterService.findAll();
  3.      int img=0;
  4.      //循环遍历所有的系别
  5.    for(Pastern p:result)
  6.    {
  7.      img++;
  8.      int id=p.getPid();
  9.    %>
  10.    <table class="a1">
  11.   <tr>
  12.     <td class="td1"><img src="indeximages/<%=img%>.jpg" width="260" height="120" /></td>
  13.     <td class="td2">
  14.         <!-- 存放系名称 -->
  15.      <a class="pasternName"><%=p.getPname() %></a>
  16.      <div class="professionName" >
  17.       
  18.      <!--存放专业名称-->
  19.      
  20.             <%
  21.                IProfessionService professionService =new ProfessionService();
  22.                List<Profession> res=professionService.findById<STRONG><EM><U>(<FONT color=darkred>id</FONT></U></EM></STRONG>);
  23.                for(Profession pr:res)       //在for循环中嵌套专业名称的for循环  id   为上一个for循环查询出的条件  
  24.                {
  25.                %>
  26.                  <a href="#"><%=pr.getPrName() %></a>
  27.                <% }
  28.                  }
  29.              %>
  30.         
  31.      </div>     
复制代码
第二种 通过action访问数据层 (这么做联合查询的时候比较麻烦 不知道有没有什么好的解决办法
<a href="queryTopic.do?id=<%=rs.getId() %>">
数据层代码
  1. public List getTopicById(Long id)
  2. {
  3. String hql="from Topic t join t.users u where t.id="+id;
  4. return TopicInfoDAO.getTopic(hql);
  5. }
复制代码
action代码
  1. Long id=Long.parseLong(request.getParameter("id"));
  2. System.out.println("topic ID 是:"+id);
  3. List list=new GetTopic().getTopicById(id);
  4. Object obj[]=null;
  5. obj=(Object[])list.get(0);
  6. Topic topic=(Topic)obj[0];  //Topic、Users是持久化类
  7. Users users=(Users)obj[1];
  8. /*List<TopicUser> list=new GetList().getListInfoBycondition(condition); */
  9. mark="success";
  10. request.setAttribute("topic", topic);
  11. request.setAttribute("users", users);
  12. return mapping.findForward(mark);
复制代码
jsp页面代码
  1. <%
  2. Topic topic = (Topic)request.getAttribute("topic");
  3. Users users = (Users) request.getAttribute("users");
  4. %>
  5. <ul>
  6. <li><%=topic.getTitle() %></li>
  7. <li><%=topic.getCreatedate() %></li>
  8. <li><%=users.getUsername() %></li>
  9. <li><%=topic.getContent() %></li>
  10. </ul>
复制代码

5 个回复

倒序浏览
本帖最后由 鲍永章 于 2012-6-21 23:18 编辑

先纠正个名词错误,不应该叫联合查询吧,联合查询是union,应该是连接查询

直接从jsp页面访问数据层安不安全的问题,我认为这个不存在安全问题,分层是为了低耦合,可维护可扩展性强,把数据访问代码放到jsp也可以,但是太乱了,而且一个地方修改会影响其他地方

你既然用了struts,jsp页面使用struts标签比较好
我大概看了一下,没看太明白,你用的是struts1.X吧,我struts2还行,sturts1会点皮毛
String hql="from Topic t join t.users u where t.id="+id;
这个hql写错了吧,连接查询是多表的,你明明只有一个实体类,怎么还写join呢
好吧,你是不是把t.users当作一个表了呢,hql是写实体类的类名,所以要写Users,不能写t.users

以上都是个人观点,希望对你有帮助,多多交流
回复 使用道具 举报
鲍永章 发表于 2012-6-21 23:10
先纠正个名词错误,不应该叫联合查询吧,联合查询是union,应该是连接查询

直接从jsp页面访问数据层安不安 ...

t.users 是hibernate里面独有的一种外键建立的模式 在Topic里面 存储了一个Users类类型变量 users
所以在这里连接查询的时候是这样子的
回复 使用道具 举报
鲍永章 发表于 2012-6-21 23:10
先纠正个名词错误,不应该叫联合查询吧,联合查询是union,应该是连接查询

直接从jsp页面访问数据层安不安 ...

您说使用struts标签,该用什么呢?这里我确实不是很清楚
能详细的跟我说一下吗  非常感谢
回复 使用道具 举报
安路凤 发表于 2012-6-22 12:50
t.users 是hibernate里面独有的一种外键建立的模式 在Topic里面 存储了一个Users类类型变量 users
所以在 ...

我知道是外键关联,既然是两个表连接查询,当然要写实体类的名字,我没这么写过。。。
回复 使用道具 举报
安路凤 发表于 2012-6-22 12:57
您说使用struts标签,该用什么呢?这里我确实不是很清楚
能详细的跟我说一下吗  非常感谢 ...

不好意思,struts1我不太了解,struts2的我知道,可以用标签来遍历集合,不用写java代码,你去网上找点资料吧,毕竟不是几句话能说清楚的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马