您的位置:首页 > 编程语言 > Java开发

关于如何实现在整合struts2和hibernate4框架下实现many-to-one级联数据表在JSP页面中的输出

2017-05-12 09:50 696 查看
struts2在struts1的基础上结合了WebWork,进一步实现了MVC,简化了使用的纯JSP,Servlet,JavaBean实现MVC的难度性。

hibernate4引入持久化的理念实现Java Web对数据库的操作,而不需手工编写复杂的JDBC代码。

笔者近一阵整合这两个框架进行项目开发,遇到一个问题,即如何实现many-to-one级联数据表在JSP页面的输出。

下面提出我粗浅的解决方案:

显而易见,由hibernate完成遍历数据库的操作,封装在action的方法中。

ConsultJob.java

public class ConsultApp {
Session session = HibernateSessionFactory.getSession(); //获取Session对象
private String id; //ID值
private List<Edu> elist; //教育背景List

public String getId(){
return id;
}
public void setId(String id){
this.id = id;
}
public List<Edu> getElist(){
return elist;
}
public void setElist(List<Edu> elist){
this.elist = elist;
}

/**
* @Description 获取全部简历信息
* @return 与result相关的字符串
*/
public String getWholeAppMessage(){
Person person = this.getPerson(id); //获取ID值对应的Person对象
String userID = person.getUser().getId(); //获取与Person对象级联的User对象的ID值
this.getWholeEduMessage(userID); //取得全部教育经历信息
return "success";
}

/**
* @Description 获取全部教育经历信息
* @param userID 级联ID
*/
private void getWholeEduMessage(String userID){
final String hql = "from Edu e inner join fetch e.user u where u.id= :userID";
Query query = session.createQuery(hql); //创建Query
query.setString("userID", userID);
elist = query.list(); //返回获取结果
}
/**
* @Description 获取用户个人信息
* @param id ID值
* @return 用户个人信息对象
*/
private Person getPerson(String ID){
Transaction trans = session.beginTransaction(); //开启一个事务
Person person = (Person) session.get(Person.class, ID); //获取指定的Person对象
trans.commit(); //提交事务
return person;
}
}

笔者在这里建立了List对象作为查询的结果,该对象会随着action一同跳转回JSP页面。同时使用了HQL的预先抓取内连接实现对级联表的遍历。由于USER表与PERSON表和EDU表均实现了many-to-one级联关系,因此传入上述代码的ID值为Person的ID值时,通过getPerson方法取得对应的Person对象,之后使用预先抓取内连接where u.id= :userID即可获取与该Person对象对应的同一User的ID的Edu对象。

同时也要配置好struts.xml文件

struts.xml
<!-- 管理员对用户简历的操作 -->
<action name="consultapp" class="com.application.message.action.ConsultApp" method="{1}">
<result name="success">/checkApp.jsp</result>
</action>

接下来在前台JSP页面中使用struts2的iterator标签实现迭代输出

<s:iterator value="list" id="personlist" status="st">
<tr <s:if test="#st.odd">style="background-color:#e1eae6"</s:if>>
<td id="listfirst">${personlist.name }</td>
<td>${personlist.sex }</td>
<td>${personlist.date }</td>
<td>${personlist.status }</td>
<td>${personlist.edu }</td>
<td>${personlist.pos }</td>
<s:iterator value="elist" id="edulist">
<s:iterator value="plist" id="pralist">
<s:iterator value="shlist" id="shplist">
<s:iterator value="sklist" id="skilist">
<s:iterator value="selist" id="sellist">
<tr class="content">
<td style="border:4px outset #b9c5c4">身份证号码:${personlist.idCard }</td>
<td style="border:4px outset #b9c5c4">电话:${personlist.tel }</td>
<td style="border:4px outset #b9c5c4">邮箱:${personlist.mail }</td>
<td style="border:4px outset #b9c5c4">住址:${personlist.address }</td>
</tr>
<tr class="content">
<td style="border:4px outset #b9c5c4">毕业时间:${edulist.endTime }</td>
<td style="border:4px outset #b9c5c4">学校:${edulist.school }</td>
<td style="border:4px outset #b9c5c4">专业:${edulist.major }</td>
<td style="border:4px outset #b9c5c4">学位:${edulist.degree }</td>
<td style="border:4px outset #b9c5c4">主修课程:${edulist.subject }</
97d6
td>
</tr>
<tr class="content">
<td style="border:4px outset #b9c5c4">实习单位:${pralist.porgan }</td>
<td style="border:4px outset #b9c5c4">实习岗位:${pralist.ppos }</td>
<td style="border:4px outset #b9c5c4">实习内容:${pralist.pcontent }</td>
</tr>
<tr class="content">
<td style="border:4px outset #b9c5c4">实践单位:${shplist.sorgan }</td>
<td style="border:4px outset #b9c5c4">实践职务:${shplist.sduty }</td>
<td style="border:4px outset #b9c5c4">实践内容:${shplist.scontent }</td>
</tr>
<tr class="content">
<td colspan="4" rowspan="4" style="border:4px outset #b9c5c4">技能证书:${skilist.skcontent }</td>
</tr>
<tr class="content">
<td colspan="4" rowspan="4" style="border:4px outset #b9c5c4">自我评价:${sellist.secontent }</td>
</tr>
</s:iterator>
</s:iterator>
</s:iterator>
</s:iterator>
</s:iterator>
</tr>
</s:iterator>

使用iterator标签的value承接返回到前台的List对象,id值作为该标签的对象,下面实现迭代输出。由于笔者在这里实现了多个级联表的输出,所以使用了多个iterator标签。

最后一个问题就是如何在JSP中调用action。

目前常用的方法有两种:

1. form表单指定action的值为要调用的action

2. 动态action。使用超链接,指定href的值为(调用的action!指定的action方法?传递的参数)

笔者个人比较青睐于使用动态action调用。因为form表单方法要求必须建立表单,并且设置提交按钮,局限性很大,代码量也至少有三行。相比之下,动态action只需要一个超链接,一行代码即可解决,十分简便。

使用动态action,首先要在struts.xml中开启动态方法调用

struts.xml
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

其次在JSP中设置超链接
<span style="margin-left: 100px;margin-right: 20px;">
<a href="consultapp!getWholeAppMessage.action?id=<s:property value="id"/>">更多</a>
</span>


笔者在这里将id值作为参数传递给action。

以上为笔者的粗浅见解,由于能力有限,不免谬误良多,欢迎指正批评。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: