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文件中有映射类配置文件的头部信息
复制下来然后新建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文件中找到
然后配置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中并启动
最后登录成功执行结果为