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 sever.
现在开始搭建一个完整的SSH框架项目
在我们搭建项目前,需要在我们WebContent/WEB-INF/lib目录下导入我们三大框架(Struts2,Spring,Hibernate)的依赖包(jar包)
(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文件
SSH
index.action
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
第二招:在src目录下创建四个包(package)进行分层。
第三招:根据数据库表的字段编写BookJava(实体类)和BookJava.hbm.xml(映射文件)放到java_entity包里。
分解一:实体类(BookJava)
packagejava_entity;importjava.math.BigDecimal;importjava.sql.Date;public classBookJava {private intcid;privateString name;privateDate BookDate;privateBigDecimal deposit;publicBookJava() {super();
}public BookJava(intcid, String name, Date bookDate, BigDecimal deposit) {super();this.cid =cid;this.name =name;
BookDate=bookDate;this.deposit =deposit;
}public intgetCid() {returncid;
}public void setCid(intcid) {this.cid =cid;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicDate getBookDate() {returnBookDate;
}public voidsetBookDate(Date bookDate) {
BookDate=bookDate;
}publicBigDecimal getDeposit() {returndeposit;
}public voidsetDeposit(BigDecimal deposit) {this.deposit =deposit;
}
}
分解二:映射文件(BookJava.hbm.xml)
/p>
"/hibernate-mapping-3.0.dtd">
第四招:在java_service包里编写JavaService(接口类)和JavaServiceImpl(实现类)。
分解一:接口类(JavaService)
packagejava_service;importjava.util.List;importjava_entity.BookJava;//创建JavaService(接口类)
public interfaceJavaService {public ListgetAllJavaBook();
}
分解二:实现类(JavaServiceImpl)
packagejava_service;importjava.util.List;importjava_dao.JavaBookDao;importjava_entity.BookJava;//业务逻辑层
public class JavaServiceImpl implementsJavaService {//注入(spring)dao包里实现类的实例
privateJavaBookDao jd;public voidsetJd(JavaBookDao jd) {
System.out.println("注入dao的实例"+jd);this.jd =jd;
}public ListgetAllJavaBook() {
List JavaBook=jd.getAllJavaBookDao();returnJavaBook;
}
}
第五招:在java_action包编写javaBookAction类。
packagejava_action;importjava.text.DecimalFormat;importjava.util.List;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;importjava_entity.BookJava;importjava_service.JavaService;public class JavaBookAction extendsActionSupport {//注入service实例
privateJavaService jsi;public voidsetJsi(JavaService jsi) {this.jsi =jsi;
}publicString execute(){
List javaList=jsi.getAllJavaBook();
System.out.println("结果集:"+javaList.size());
ActionContext ac=ActionContext.getContext();
ac.put("javaList",javaList);returnSUCCESS;
}//输出人民币符号
public String formatDouble(doubles){
DecimalFormat df=new DecimalFormat("\u00A4##.0");returndf.format(s);
}
}
第五招:struts配置文件
/p>
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"/dtds/struts-2.3.dtd">
/WEB-INF/jsp/javaIndex.jsp
第六招:applicationContext配置文件
/schema/aop /schema/aop/spring-aop-4.2.xsd
/schema/beans /schema/beans/spring-beans-4.2.xsd
/schema/context /schema/context/spring-context-4.2.xsd
/schema/jee /schema/jee/spring-jee-4.2.xsd
/schema/tx /schema/tx/spring-tx-4.2.xsd">
第七招:JPA的配置文件(persistence.xml)
注意:(1)目录META-INF跟persistence.xml名字都是固定的,都不能更改为别的名字。
(2)persistence .xml必须放在classpath(也就是src目录下)路径下的META-INF文件夹中。
/xml/ns/presistence/persistence_2_0.xsd">
org.hibernate.jpa.HibernatePersistenceProvider
java_entity/BookJava.hbm.xml
第八招:创建一个javaiIndex.jsp页面将所有数据取出来显示到页面上。
注意:用Struts2标签必须在jsp页面添加如下定义:
Insert title here编号书名出版日期课本价格
没有查找到数据
最后输出结果:
总结: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 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。