10 05Hibernate之联合Struts 2.x开发

Hibernate是属于数据层的工具类,所以在所有的开发之中,Hibernate只能够在数据层上编写代码。

1 开发业务层

1、建立一个SHProject;
2、数据库脚本如下:

-- 删除数据库
DROP DATABASE IF EXISTS hedb;
-- 创建数据库
CREATE DATABASE hedb;
-- 使用数据库
USE hedb;
-- 删除数据表
DROP TABLE IF EXISTS `member`;
-- 创建数据表
CREATE TABLE `member`(
	mid VARCHAR(50),
	mname VARCHAR(50),
	mage INT,
	msalary DOUBLE,
	mbirthday DATE,
	mnote TEXT,
	CONSTRAINT pk_mid PRIMARY KEY(mid)
);

3、为项目添加Hibernate支持与Struts 2.x支持;
4、添加完Hibernate项目之后,考虑设置几个属性;

<property name="show_sql">true</property>
<property name="format_sql">true</property>

5、本次使用Annotation的配置方式;

<filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
   <init-param>
   	<param-name>actionPages</param-name>
   	<param-value>org.lks.action</param-value>
   </init-param>
 </filter>
 <filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>*.action</url-pattern>
 </filter-mapping>

6、要生成POJO类以及对应的Member.hbm.xml文件;
(1)现在相当于免去了DatabaseConnection(数据库连接类)、以及VO类的编写。

7、Hibernate就是数据层的操作,那么依然要定义IMemberDAO接口;

package org.lks.dao;

import org.lks.pojo.Member;

public interface IMemberDAO {

	public boolean doCreate(Member vo) throws Exception;
}

package org.lks.dao.impl;

import org.lks.dao.IMemberDAO;
import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.Member;

public class MemberDAOImpl implements IMemberDAO {

	@Override
	public boolean doCreate(Member vo) throws Exception {
		//如果保存的时候成功会返回当前的数据ID,如果不为空表示增加成功
		return HibernateSessionFactory.getSession().save(vo) != null;
	}

}

8、要创建DAOFactory工厂类

package org.lks.factory;

import org.lks.dao.IMemberDAO;
import org.lks.dao.impl.MemberDAOImpl;

public class DAOFactory {

	private DAOFactory(){}
	
	public static IMemberDAO getIMemberDAOInstance(){
		return new MemberDAOImpl();
	}
}

由于存在由HibernateSessionFactory类,所以这块的连接对象就没有必要传递了。

9、定义业务层接口——IMemberService;

package org.lks.service;

import org.lks.pojo.Member;

public interface IMemberService {

	public boolean insert(Member vo) throws Exception;
}

package org.lks.service.impl;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.factory.DAOFactory;
import org.lks.pojo.Member;
import org.lks.service.IMemberService;

public class MemberServiceImpl implements IMemberService{

	@Override
	public boolean insert(Member vo) throws Exception {
		try{
			boolean flag = DAOFactory.getIMemberDAOInstance().doCreate(vo);
			HibernateSessionFactory.getSession().beginTransaction().commit();  //事务提交
			return flag;
		}catch(Exception e){
			throw e;
		}finally{
			HibernateSessionFactory.closeSession();
		}
	}

}

所有复杂的引用关系全部忽略了。

10、定义业务层工厂类

package org.lks.factory;

import org.lks.service.IMemberService;
import org.lks.service.impl.MemberServiceImpl;

public class ServiceFactory {

	private ServiceFactory(){}
	
	public static IMemberService getIMemberServiceInstance(){
		return new MemberServiceImpl();
	}
}

与直接使用JDBC相比,此时的代码更加的简化。

2 开发控制层及显示层

1、定义一个MemberAction,同时本处使用分发处理;

package ork.lks.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.lks.factory.ServiceFactory;
import org.lks.pojo.Member;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
@Namespace("/")
@Action("MemberAction")
public class MemberAction extends ActionSupport {

	private Member member = new Member();
	
	public Member getMember() {
		return member;
	}
	
	public void insert(){
		try {
			System.out.println(ServiceFactory.getIMemberServiceInstance().insert(this.member));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

2、定义member_insert.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String insertUrl = basePath + "MemberAction!insert.action" ;
%>

<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>Struts 2.x + Hibernate</title>
  </head>
  	<form action="<%=insertUrl%>" method="post">
  		ID:&nbsp;<input type="text" name="member.mid" value="31713011021"><br>
  		Name:&nbsp;<input type="text" name="member.mname" value="hhy"><br>
  		Age:&nbsp;<input type="text" name="member.mage" value="20"><br>
  		Salary:&nbsp;<input type="text" name="member.msalary" value="2000.0"><br>
  		Birthday:&nbsp;<input type="text" name="member.mbirthday" value="1999-08-21"><br>
  		Note:&nbsp;<input type="text" name="member.mnote" value="big fool!"><br>
  		<input type="submit" value="add">
  		<input type="reset" value="reset">
  	</form>
  <body>
  </body>
</html>

整个的操作变化,Strusts 2.x基本上不关心数据层。

使用了Hibernate之后,整个的MVC设计模式上,数据层的代码开发一下子减少了许多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章