关于如何实现在整合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 elist;     //教育背景List
	
	public String getId(){
		return id;
	}
	public void setId(String id){
		this.id = id;
	}
	public List getElist(){
		return elist;
	}
	public void setElist(List 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



	/checkApp.jsp

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



	style="background-color:#e1eae6">
		${personlist.name }
		${personlist.sex }
		${personlist.date }
		${personlist.status }
		${personlist.edu }
		${personlist.pos }
		
		
		
		
		
			
				身份证号码:${personlist.idCard }
				电话:${personlist.tel }	
				邮箱:${personlist.mail }
				住址:${personlist.address }
			
			
				毕业时间:${edulist.endTime }
				学校:${edulist.school }
				专业:${edulist.major }
				学位:${edulist.degree }
				主修课程:${edulist.subject }
			
			
				实习单位:${pralist.porgan }
				实习岗位:${pralist.ppos }
				实习内容:${pralist.pcontent }
			
			
				实践单位:${shplist.sorgan }
				实践职务:${shplist.sduty }
				实践内容:${shplist.scontent }
			
			
				技能证书:${skilist.skcontent }
			
			
				自我评价:${sellist.secontent }
			
		
		
		
		
		
	

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


最后一个问题就是如何在JSP中调用action。
目前常用的方法有两种:
1. form表单指定action的值为要调用的action
2. 动态action。使用超链接,指定href的值为(调用的action!指定的action方法?传递的参数)


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


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


其次在JSP中设置超链接

	">更多

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



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

你可能感兴趣的:(SSH)