在eclipse上边搭建一个最最最最最最最最最最最最最最最最最最最最最最最最简单的ssh框架spring4+struts2+hibernate5,然后实现从数据库中查询一个数据,在前端页面中显示出来

在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"  

这是后一篇,是部分使用了注解:主要是用来和这篇区别,用了注解和没有用注解的部分区别:https://blog.csdn.net/Handsome2013/article/details/86317473

猜你喜欢

转载自blog.csdn.net/Handsome2013/article/details/86301083