SSH框架入门搭建

手动搭建一个基本的SSH项目

这是一个最基础的ssh项目框架搭建,比较适合新手入门
实现了员工的登录功能和员工的全查功能

步骤分析

  • 数据库建表
  • xml文件配置
    – 数据库表映射配置
    – web.xml文件配置
    – spring配置文件
    – struts2配置文件
  • 业务逻辑实现
  • 测试

开始搭建

创建数据库和表并插入测试数据


CREATE DATABASE test;

USE test;

CREATE TABLE emp(
	eid INT PRIMARY KEY AUTO_INCREMENT,
	ename VARCHAR(50) NOT NULL ,
	epsd VARCHAR(50) NOT NULL,
	erealname VARCHAR(50) NOT NULL,
	esex INT NOT NULL,
	eage INT NOT NULL,
	did INT NOT NULL REFERENCES dept(did)
);
CREATE TABLE dept(
	did INT PRIMARY KEY AUTO_INCREMENT,
	dname VARCHAR(50),
	description VARCHAR(150)
);

INSERT INTO dept VALUES(NULL,'人事部','人员管理');
INSERT INTO dept VALUES(NULL,'财务部','财务管理');

INSERT INTO emp VALUES(NULL,'zs','123','张三',1,19,1);
INSERT INTO emp VALUES(NULL,'ls','123','李四',0,18,2);
INSERT INTO emp VALUES(NULL,'ww','123','王五',1,20,1);

然后创建一个web工程,首先导入jar包
web.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>SSHDemo</display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<!-- spring配置文件路径设置 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<!-- spring启动监听器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- struts2核心过滤器 -->
	<filter>
		<filter-name>struts</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 
	web.xml的配置中<context-param>配置作用
	1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
	2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
	3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
	4.容器创建<listener></listener>中的类实例,即创建监听.
	5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
	context-param的值 = ServletContext.getInitParameter("context-param的键");
	6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
	换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.
	7.举例.你可能想在项目启动之前就打开数据库.
	那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接.
	8.这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭.
	 -->

</web-app>

然后创建数据库表的映射类,并配置相应的一对多或多对一关系
我们这里配置采用双向一对多配置。

这是多方,多方持有一方的对象

package org.hua.entity;

public class Emp {
	
	private Integer eId;
	private String eName;
	private String ePsd;
	private String eRealName;
	private Integer eSex;
	private Integer eAge;
	//一方对象
	private Dept dept;
	
	public Emp() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Emp(Integer eId, String eName, String ePsd, String eRealName, Integer eSex, Integer eAge, Dept dept) {
		super();
		this.eId = eId;
		this.eName = eName;
		this.ePsd = ePsd;
		this.eRealName = eRealName;
		this.eSex = eSex;
		this.eAge = eAge;
		this.dept = dept;
	}
	
	//getter,setter方法省略
	//注意如果重写toString()方法不要输出一方对象否则会出现stackOverFlowError异常
}

一对多的一方持有多方的数据库表的映射类的集合并直接初始化

package org.hua.entity;

import java.util.HashSet;
import java.util.Set;

public class Dept {

	private Integer dId;
	private String dName;
	private String description;
	//多方对象的集合,注意尽管new的是HashSet但是必须声明Set
	private Set<Emp> empSet=new HashSet<>();
	
	public Dept() {
		
	}

	public Dept(Integer dId, String dName, String description, Set<Emp> empSet) {
		super();
		this.dId = dId;
		this.dName = dName;
		this.description = description;
		this.empSet = empSet;
	}
	
	//getter,setter方法省略

创建实体类的映射配置文件
打开hibernate-core.jar 进入org.hibernate包,最下边hibernate-mapping-3.0.dtd文件中有映射类配置文件的头部信息

SSH框架入门搭建
复制下来然后新建xml文件,文件名应该是"映射类类名.hbm.xml"直接粘贴上去
两张表的配置文件
emp表

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="org.hua.entity.Emp" table="EMP">
		<id name="eId">
			<column name="EID"></column>
			<generator class="native"></generator>
		</id>
		<property name="eName" column="ENAME"></property>
		<property name="ePsd" column="EPSD"></property>
		<property name="eRealName" column="EREALNAME"></property>
		<property name="eSex" column="ESEX"></property>
		<property name="eAge" column="EAGE"></property>
		
		<many-to-one name="dept" class="org.hua.entity.Dept">
			<column name="DID"></column>
		</many-to-one>
	</class>
</hibernate-mapping>

dept表

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="org.hua.entity.Dept" table="DEPT">
		<id name="dId">
			<column name="DID"></column>
			<generator class="native"></generator>
		</id>
		<property name="dName" column="DNAME"></property>
		<property name="description" column="DESCRIPTION"></property>
		
		<set name="empSet">
			<key column="DID" >
			</key>
			<one-to-many class="org.hua.entity.Emp"/>
		</set>
	</class>
</hibernate-mapping>

创建spring配置文件,通常我们会取名为applicaionContext.xml
然后在里边配置各个bean,包括hibernate的连接数据库配置,所以不需要hibernate的配置文件首先是数据库连接相关的配置
我们采用数据库连接池的方式连接数据库,数据库连接池有很多种包括出c3p0,dbcp等
这里使用c3p0数据库连接池。

<?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:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

	<!-- 数据库连接池数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
		<property name="user" value="root"></property>
		<property name="password" value="123456"></property>
	</bean>
	
	<!-- hibernate sessionFactory bean -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 引入数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- hibernate配置, -->
		<property name="hibernateProperties">
			<props>
				<!-- 数据库方言,使用哪种数据库就需要引入哪种数据库的数据库方言,这里使用mysql数据库,必须配置 -->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
				<!-- 显示执行的sql语句并格式化显示 -->
				<prop key="hibernate.show_show">true</prop>
				<prop key="hibernate.sql_format">true</prop>
			</props>
		</property>
		
		<!-- 配置数据库表的映射类的映射配置文件路径 -->
		<property name="mappingResources">
			<list>
				<value>org/hua/entity/Emp.hbm.xml</value>
				<value>org/hua/entity/Dept.hbm.xml</value>
			</list>
		</property>
		
	</bean>
	
</beans>

然后就是三层的业务逻辑
dao层接口和实现类

package org.hua.dao;

import java.util.List;

import org.hua.entity.Emp;

public interface EmpDao {

	Emp empLogin(String name,String psd);
	
	List<Emp> empQueryAll();
	
}

package org.hua.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hua.dao.EmpDao;
import org.hua.entity.Emp;

public class EmpDaoImpl implements EmpDao {
	//声明sessionFactory但是不初始化,使用spring注入,所以需要给与set方法
	private SessionFactory sessionFactory;
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public Emp empLogin(String name, String psd) {
		
		Session session=sessionFactory.openSession();
		Query query = session.createQuery("from Emp where eName=? and ePsd=?");
		query.setParameter(0, name);
		query.setParameter(1, psd);
		List list = query.list();
		session.close();
		if(list.size()!=0) {
			return (Emp) list.get(0);
		}
		
		return null;
	}

	@Override
	public List<Emp> empQueryAll() {
		Session session=sessionFactory.openSession();
		List list = session.createQuery("from Emp").list();
		
		return list;
	}

}

service层接口和实现类

package org.hua.service;

import java.util.List;

import org.hua.entity.Emp;

public interface EmpService {
	
	Emp empLogin(String name,String psd);
	
	List<Emp> empQueryAll();
	
}

同样声明DAO层对象使用spring注入

package org.hua.service.impl;

import java.util.List;

import org.hua.dao.impl.EmpDaoImpl;
import org.hua.entity.Emp;
import org.hua.service.EmpService;

public class EmpServiceImpl implements EmpService {
	
	private EmpDaoImpl edi;

	public void setEdi(EmpDaoImpl edi) {
		this.edi = edi;
	}

	@Override
	public Emp empLogin(String name, String psd) {
		
		return edi.empLogin(name, psd);
	}

	@Override
	public List<Emp> empQueryAll() {
		// TODO Auto-generated method stub
		return edi.empQueryAll();
	}

}

最后是action层

package org.hua.action;

import java.util.List;

import org.hua.entity.Emp;
import org.hua.service.impl.EmpServiceImpl;
import com.opensymphony.xwork2.ActionSupport;

public class EmpAction extends ActionSupport {

	private EmpServiceImpl esi;
	private String name;
	private String psd;
	private List<Emp> list;
	
	public void setEsi(EmpServiceImpl esi) {
		this.esi = esi;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setPsd(String psd) {
		this.psd = psd;
	}
	
	public List<Emp> getList() {
		return list;
	}
	
	public String empLogin() {
		Emp emp = esi.empLogin(name, psd);
		if(emp!=null) {
			list=esi.empQueryAll();
			
			return SUCCESS;
		}
		
		return INPUT;
	}
	
}

业务逻辑写完之后我们需要在spring配置文件中配置相应业务层的bean并给属性注入值

	<bean id="empDao" class="org.hua.dao.impl.EmpDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="empService" class="org.hua.service.impl.EmpServiceImpl">
		<property name="edi" ref="empDao"></property>
	</bean>
	
	<bean id="empAction" class="org.hua.action.EmpAction">
		<property name="esi" ref="empService"></property>
	</bean>
	

struts.xml,新建xml文件一般取名struts.xml
头部信息可以在struts-core.jar 中struts-2.3.dtd文件中找到SSH框架入门搭建
然后配置action

<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="first" extends="struts-default" namespace="/">
		<action name="loginAction" class="empAction" method="empLogin">
			<result name="success">/empShow.jsp</result>
			<result name="input">/index.jsp</result>
		</action>
	</package>
</struts>

最后是前台页面,登录成功直接进入员工的全查页面,失败则返回
登陆页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="loginAction" method="post" style="margin-left: 40%">
		账号:<input type="text" name="name"><br>
		密码:<input type="password" name="psd"><br>
		<input type="submit" value="确定">
	</form>
</body>
</html>

登陆成功后的全查页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table style="margin: auto">
		<tr align="center">
			<td>编号</td>
			<td>姓名</td>
			<td>性别</td>
			<td>年龄</td>
			<td>部门</td>
			<td>部门说明</td>
		</tr>
		<c:forEach items="${list}" var="emp">
			<tr>
				<td> ${emp.eId} </td>
				<td> ${emp.eRealName} </td>
				<td> ${emp.eSex} </td>
				<td> ${emp.eAge} </td>
				<td> ${emp.dept.dName} </td>
				<td> ${emp.dept.description} </td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

到处登录全查功能就已经实现,项目发布到tomcat中并启动
最后登录成功执行结果为
SSH框架入门搭建