在eclipse上边搭建一个最最最简单的ssh框架spring4+struts2+hibernate5,然后实现从数据库中查询一个数据,在前端页面中显示出来
需要的包和工具链接如下:
jar包:https://download.csdn.net/download/handsome2013/10911122
tomcat:https://download.csdn.net/download/handsome2013/10430635
mysql+eclipse+navicate等:https://download.csdn.net/download/handsome2013/10747713
一:数据库
我这里使用了mysql5.7,以及Navicate软件工具
数据库和数据表设计如下:
添加数据如下:
二,ssh三层的介绍:直接百度百科如下
三.搭建ssh环境,
spring4+struts2+hibernate5
然后是导包:包括了spring4+struts2+hibernate5各自的包以及整合包。把包放入到WebContent/WEB-INF/lib下所有的包到https://download.csdn.net/download/handsome2013/10911122下载
然后建立包名和配置文件名(根据不同的功能,分不同的包,同时三个配置文件对应三层的一个配置applicationContext.xml对应的是spring, hibernate.cfg.xml对应的是hibernate层。 struts.xml对应的就是struts2的配置)
四:建立 数据表对应的一个实体类,以及映射配置
首先的Students.java如下:
package cqupt.ssh.entity;
public class Students {
//和数据库对应的实体类
Integer s_id;
String s_name;
Integer s_age;
//get和set一波
public Integer getS_id() {
return s_id;
}
public void setS_id(Integer s_id) {
this.s_id = s_id;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public Integer getS_age() {
return s_age;
}
public void setS_age(Integer s_age) {
this.s_age = s_age;
}
@Override
public String toString() {
return "Students [s_id=" + s_id + ", s_name=" + s_name + ", s_age=" + s_age + "]";
}
}
然后是实体类和数据库的映射配置Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cqupt.ssh.entity" >
<class name="Students" table="students" ><!-- 类和表的对应 -->
<id name="s_id" ><!-- 主键 -->
<generator class="assigned"></generator><!-- 这里是主键生成策略 -->
</id>
<!-- 下边是除主键外的其他属性,下边是由于我数据表和实体类的属性名字一样,所以写的少点,要是数据库和实体的属性写的不一样,比如,name和s_name,就需要做一些其他处理 -->
<property name="s_name" ></property>
<property name="s_age" ></property>
</class>
</hibernate-mapping>
五:然后是开始dao层
在dao层中需要一个工具类,来获取session,简便了dao中的代码
工具类如下:
工具类代码:
package cqupt.ssh.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sf;
// static代码块里面是用类加载器来读取,类加载器里面有个缓冲区,会把读取到的内容缓存起来
static {// 这个static块里面的两条语句,一个web项目只执行一次,不会因为多次调用程序据多次执行
// 1 创建,调用空参构造
Configuration conf = new Configuration().configure();
// 2 根据配置信息,创建 SessionFactory对象
sf = conf.buildSessionFactory();
}
// 获得session => 获得全新session
public static Session openSession() {
// 3 获得session
Session session = sf.openSession();
return session;
}
// 获得session => 获得与线程绑定的session
public static Session getCurrentSession() {
// 3 获得session
Session session = sf.getCurrentSession();
return session;
}
public static void main(String[] args) {
System.out.println(HibernateUtils.openSession());
}
}
首先是接口SSHDao.java
package cqupt.ssh.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import cqupt.ssh.entity.Students;
public interface SSHDao {
List<Students> getStudents();
}
然后是实现类
package cqupt.ssh.daoImpl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cqupt.ssh.dao.SSHDao;
import cqupt.ssh.entity.Students;
import cqupt.ssh.utils.HibernateUtils;
public class SSHDaoImpl implements SSHDao {
@Override
public List<Students> getStudents() {
// 1获得session
Session session = HibernateUtils.openSession();
// 2控制事务
Transaction tx = session.beginTransaction();
// 3.执行操作
// 书写hql
String hql = "from Students";
Query query = session.createQuery(hql);
List<Students> list = query.list();
// System.out.println(list);
// 4.提交事务,关闭资源
tx.commit();
session.close();
return list;
}
}
六:开始Service层
首先是接口:
package cqupt.ssh.service;
import java.util.List;
import org.springframework.stereotype.Service;
import cqupt.ssh.entity.Students;
public interface SSHService {
public List<Students> getStudents();
}
然后是实现类
package cqupt.ssh.serviceImpl;
import java.util.List;
import cqupt.ssh.dao.SSHDao;
import cqupt.ssh.entity.Students;
import cqupt.ssh.service.SSHService;
public class SSHServiceImpl implements SSHService {
// 下边查询方法要调用dao层,这里声明了dao后,还需要一个set方法,这样和applicationContext中的配置结合,才可以把这个类交给spring管理,使用了这set方法,就把这个的实现类注入到service中
private SSHDao sSHDao ;
public void setsSHDao(SSHDao sSHDao) {
this.sSHDao = sSHDao;
}
@Override
public List<Students> getStudents() {
// TODO Auto-generated method stub
return sSHDao.getStudents();
}
}
七:开始web层
(web)action层的代码如下:
package cqupt.ssh.action;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
import cqupt.ssh.entity.Students;
import cqupt.ssh.service.SSHService;
import cqupt.ssh.serviceImpl.SSHServiceImpl;
public class SSHAction {//其实为了更加规范这里需要继承ActionSupport类,然后实现一个execute方法,来作为主方法。
//下边需要使用到service层,这里声明过后也需要是哟个set方法,来配合applicationContext中的配置,通过这个方法把service层注入到action(web)层
private SSHService sSHService ;
public void setsSHService(SSHService sSHService) {
this.sSHService = sSHService;
}
public String getStudents() {
List<Students> list = sSHService.getStudents();
/*通过ActionContext.getContext().put("message",message);
* 直接放入将数据request域中,不获取request本身,获取其 中的Map;*/
ActionContext.getContext().put("message", list.get(0).getS_name());
return "success";//根据这个返回的”success"到struts配置中可以找到对应的页面。
}
}
八:开始配置文件:
第一个是applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 配置Dao -->
<bean name="sSHDao" class="cqupt.ssh.daoImpl.SSHDaoImpl"></bean>
<!-- 配置Service -->
<bean name="sSHService" class="cqupt.ssh.serviceImpl.SSHServiceImpl">
<!-- 下边要注入set方法,要求在CustomerServiceImpl中添加setter方法之后,下边的才可以进行 -->
<property name="sSHDao" ref="sSHDao"></property>
</bean>
<bean name="sSHAction" class="cqupt.ssh.action.SSHAction">
<!-- 下边要注入set方法,要求在CustomerServiceImpl中添加setter方法之后,下边的才可以进行 -->
<property name="sSHService" ref="sSHService"></property>
</bean>
</beans>
第二个是hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:mysql:///ssh_students</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">mysql</property>
<!-- 数据库方言 不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成. sql99标准:
DDL 定义语言 库表的增删改查 DCL 控制语言 事务 权限 DML 操纵语言 增删改查 注意: MYSQL在选择方言时,请选择最短的方言. -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- #hibernate.show_sql true #hibernate.format_sql true -->
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!-- ## auto schema export 自动导出表结构. 自动建表 #hibernate.hbm2ddl.auto create
自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用) #hibernate.hbm2ddl.auto create-drop
自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用) #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败. -->
<!-- <property name="hibernate.hbm2ddl.auto">update</property> -->
<!-- 引入orm元数据 路径书写: 填写src下的路径 -->
<!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8 0001
1 读未提交 0010 2 读已提交 0100 4 可重复读 1000 8 串行化 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 指定session与当前线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="cqupt/ssh/entity/Students.hbm.xml" />
</session-factory>
</hibernate-configuration>
第三个配置是struts.xml:
<?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>
<!-- 指定struts2是否以开发模式运行 1.热加载主配置.(不需要重启即可生效) 2.提供更多错误信息输出,方便开发时的调试 -->
<constant name="struts.devMode" value="true"></constant>
<package name="cqupt" namespace="/" extends="struts-default"><!--是一个斜杠"/"表示后边访问CustomerAction的时候网址上不需要加中间命名空间。 -->
<action name="sSHAction_*" class="cqupt.ssh.action.SSHAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
九:补充两个前端页面jsp,一个是用于访问的页面,一个跳转页面。
首先是开始访问的页面index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>
<form action="${pageContext.request.contextPath}/sSHAction_getStudents"
method="post">
<input type="submit" value="查询" />
</form>
</body>
</html>
然后是成功访问数据库后,获取数据之后,把数据放入到另一个页面success.jsp:
<%@ 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>
<tr>
<td>${message}<td>
</tr>
</body>
</html>
10,开始启动项目后然后访问网页:
十一:注意事项:
a.实体类中的类型只能是类类型,不能是简单类型,比如我里面使用Integer,而不是int,如果那个地方是int,运行 的时候就会报错should be mapped with insert="false" update="false"