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

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 }</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。



以上为笔者的粗浅见解,由于能力有限,不免谬误良多,欢迎指正批评。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值