SSH框架的搭建+JPA接口
SSH它不是一個框架而是由 struts+spring+hibernate組成的的一個集成框架,也是目前較流行的一種Web應用程序開源框架。
成SSH框架的系統主要分為四層:表示層、業務邏輯層、數據持久層和域模塊層,以幫助開發人員在短期內搭建結構清晰、可復用性好、維護方便的Web應用程序。
在搭建SSH框架之前,我前幾天發表的博客就已經對SSH(Struts2,Spring,Hibernate)的三大框架都進行了說明,在這裏就不詳細的介紹SSH一些概念性的東西了。
接下來,簡單的介紹一下JPA吧!
JPA全稱(Java Persistence API.JPA)通過註解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。(本例是通過XML來描述對象-關系表的映射關系)
JPA的宗旨是為POJO提供持久化標準的一套規範。
1.1.JPA提供的技術
(1)ORM映射元數據 JPA支持XML和JDK 5.0註解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持 久化到數據庫表中;
(2)JPA 的API用來操作實體對象,執行CRUD操作,框架在後臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解 脫出來。
(3)查詢語言
通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。
2.JPA的文件結構
如上圖,我們需要建立一個POJO類,通過映射文件創建對應的表。把我們的配置信息存放在META-INF/persistence.xml文件中,註意目錄META-INF跟persistence.xml名字都是固定的,都不能更改為別的名字。(persistence .xml必須放在classpath(也就是src目錄下)路徑下的META-INF文件夾中)。
導包什麽的,在之前的文章都已經講解過了(把之前文章的jar包綜合一下就可以了),在這邊就不發jar包的截圖了。
本項目的搭建環境:
Windows 7-64位,Eclipse(開發工具),jdk1.8.0_91,Tomcat 8.0,struts-2.3.30-apps,spring-framework-4.2.2.RELEASE,hibernate-release-5.2.2.Final,sql sever2008.
現在開始搭建一個完整的SSH框架項目
在我們搭建項目前,需要在我們WebContent/WEB-INF/lib目錄下導入我們三大框架(Struts2,Spring,Hibernate
(1.導入Struts2的jar包(在這邊我們下載的是Struts2-2.3.30版本的war包)導包步驟如下圖:
a.需要在我們war包路徑下找到我們的jar包
(2. 導入Spring的jar的包(spring-framework-4.2.2.RELEASE版本的war包)
a. 解壓war包
b.在D:\SSH\spring-framework-4.2.2.RELEASE\libs路徑下找到我們的jar包
(c.因為上圖沒有顯示所有Spring要導進lib的包,下圖補上:
(2. 導入Hibernate的jar包(hibernate-release-5.2.2.Final版本的war包)
註意:hibernate跟c3p0的jar包都是在D:\SSH\hibernate-release-5.2.2.Final\lib lib的路徑下
(a.解壓war包
(b.在D:\SSH\hibernate-release-5.2.2.Final\lib\required路徑下找到我們的jar包
(c.連接數據庫還需要在D:\SSH\hibernate-release-5.2.2.Final\lib\optional\c3p0目錄下導入c3p0的jar包
第一招:導完包後就需要配置我們的web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>SSH</display-name> <welcome-file-list> <welcome-file>index.action</welcome-file> </welcome-file-list> <!-- Struts2過濾器的配置 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- spring監聽器配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
第二招:在src目錄下創建四個包(package)進行分層。
第三招:根據數據庫表的字段編寫BookJava(實體類)和BookJava.hbm.xml(映射文件)放到java_entity包裏。
分解一:實體類(BookJava)
package java_entity; import java.math.BigDecimal; import java.sql.Date; public class BookJava { private int cid; private String name; private Date BookDate; private BigDecimal deposit; public BookJava() { super(); } public BookJava(int cid, String name, Date bookDate, BigDecimal deposit) { super(); this.cid = cid; this.name = name; BookDate = bookDate; this.deposit = deposit; } public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBookDate() { return BookDate; } public void setBookDate(Date bookDate) { BookDate = bookDate; } public BigDecimal getDeposit() { return deposit; } public void setDeposit(BigDecimal deposit) { this.deposit = deposit; } }
分解二:映射文件(BookJava.hbm.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-8-30 10:28:51 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <!-- 實體類class和數據庫表table的映射 table寫的是表名--> <class name="java_entity.BookJava" table="bookJava"> <!-- id元素對應了表中的主鍵,持久化生成一個對象標識符來建立內存中的對象和數據表中的對應關系 --> <id name="cid" type="int"> <column name="cid"></column> <generator class="increment"></generator> </id> <!-- 普通屬性的映射 name 表示類中的屬性名稱;type 表示表中數據的類型;column 表示表中的列名稱--> <property name="name" type="java.lang.String"> <column name="name"></column> </property> <property name="BookDate" type="java.sql.Date"> <column name="BookDate"></column> </property> <property name="deposit" type="java.math.BigDecimal"> <column name="deposit"></column> </property> </class> </hibernate-mapping>
第四招:在java_service包裏編寫JavaService(接口類)和JavaServiceImpl(實現類)。
分解一:接口類(JavaService)
package java_service; import java.util.List; import java_entity.BookJava; //創建JavaService(接口類) public interface JavaService { public List<BookJava> getAllJavaBook(); }
分解二:實現類(JavaServiceImpl)
package java_service; import java.util.List; import java_dao.JavaBookDao; import java_entity.BookJava; //業務邏輯層 public class JavaServiceImpl implements JavaService { //註入(spring)dao包裏實現類的實例 private JavaBookDao jd; public void setJd(JavaBookDao jd) { System.out.println("註入dao的實例"+jd); this.jd = jd; } public List<BookJava> getAllJavaBook() { List<BookJava> JavaBook=jd.getAllJavaBookDao(); return JavaBook; } }
第五招:在java_action包編寫javaBookAction類。
package java_action; import java.text.DecimalFormat; import java.util.List; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import java_entity.BookJava; import java_service.JavaService; public class JavaBookAction extends ActionSupport { //註入service實例 private JavaService jsi; public void setJsi(JavaService jsi) { this.jsi = jsi; } public String execute(){ List<BookJava> javaList=jsi.getAllJavaBook(); System.out.println("結果集:"+javaList.size()); ActionContext ac=ActionContext.getContext(); ac.put("javaList",javaList); return SUCCESS; } //輸出人民幣符號 public String formatDouble(double s){ DecimalFormat df=new DecimalFormat("\u00A4##.0"); return df.format(s); } }
第五招:struts配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 將所有的實現類都交給spring托管 --> <constant name="struts.objectFactory" value="spring"></constant> <package name="javaPackage" extends="struts-default" namespace="/"> <action name="index" class="javaBookAction" method="execute"> <result name="success">/WEB-INF/jsp/javaIndex.jsp</result> </action> </package> </struts>
第六招:applicationContext配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> <bean id="javaBookAction" class="java_action.JavaBookAction" scope="prototype"> <property name="jsi" ref="javaService"></property> </bean> <bean id="javaService" class="java_service.JavaServiceImpl" scope="prototype"> <property name="jd" ref="javaBookdaoImpl"></property> </bean> <bean id="javaBookdaoImpl" class="java_dao.JavaBookDaoImpl" scope="prototype"> <!-- JPA是Hibernate跟mybatis公用的接口,所以JPA就擁有獨立的EntityManagerFactory實例--> <!-- 給javaBookdaoImpl註入 EntityManagerFactory實例--> <property name="emf" ref="EntityManagerFactory"></property> </bean> <bean id="EntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="myjpa"></property> </bean> </beans>
第七招:JPA的配置文件(persistence.xml)
註意:(1)目錄META-INF跟persistence.xml名字都是固定的,都不能更改為別的名字。
(2)persistence .xml必須放在classpath(也就是src目錄下)路徑下的META-INF文件夾中。
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sum.com/xml/ns/presistence/persistence_2_0.xsd"> <!-- Name屬性用於定義持久化單元的名字 (name必選,空值也合法);transaction-type 指定事務類型(可選) --> <persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL"> <!-- hibernate驅動的實現類,入口類 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <!-- 導入映射文件的路徑--> <mapping-file>java_entity/BookJava.hbm.xml</mapping-file> <properties> <!-- 數據庫加載的驅動 --> <property name="hibernate.connection.driver_class" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <!-- 數據庫url地址 --> <property name="hibernate.connection.url" value="jdbc:sqlserver://localhost:1433;DatabaseName=SSH"/> <!-- 數據庫登錄名 --> <property name="hibernate.connection.user" value="sa"/> <!-- 數據庫登錄密碼 --> <property name="hibernate.connection.password" value="123"/> <!-- 在控制臺顯示sql語句(值為true則為顯示,為false則不顯示) --> <property name="hibernate.show_sql" value="true"></property> <!-- 設置值為update會自動判斷表是否存在,若表存在時則更新表,表不存在時則新建表 --> <property name="hibernate.hbm2ddl.auto" value="update"></property> </properties> </persistence-unit> </persistence>
第八招:創建一個javaiIndex.jsp頁面將所有數據取出來顯示到頁面上。
註意:用Struts2標簽必須在jsp頁面添加如下定義:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <table border="1px"> <tr> <th>編號</th> <th>書名</th> <th>出版日期</th> <th>課本價格</th> </tr> <s:iterator value="javaList"> <tr> <td><s:property value="cid"/></td> <td><s:property value="name"/></td> <td><s:date name="BookDate" format="yyyy-MM-dd"></s:date></td> <td><s:property value="%{formatDouble(deposit)}" /></td> </tr> </s:iterator> <s:if test="javaList.size()==0"> <tr> <td colspan="7">沒有查找到數據</td> </tr> </s:if> </table> </body> </html>
最後輸出結果:
總結:ssh框架最主要的本質是:“高內聚、低耦合”。在ssh中使用Struts是作為系統的整體基礎架構,主要負責MVC的分離,在Struts框架的模型部分,控制業務跳轉,利用Hibernate框架對持久層提供支持,Spring做管理層,管理struts和hibernate。具體做法是:用面向對象的分析方法根據需求提出一些模型,將這些模型實現為基本的Java對象,然後編寫基本的DAO(Data Access Objects)接口,並給出Hibernate的DAO實現,采用Hibernate架構實現的DAO類來實現Java類與數據庫之間的轉換和訪問,最後由Spring做管理,管理struts和hibernate。
JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成是Hibernate HQL的等價物。JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關系數據庫的持久化。
SSH框架的搭建+JPA接口