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設計模式上,數據層的代碼開發一下子減少了許多。

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