1.建立一个web项目

2.导入SSH框架所需jar包

3.配置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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SSHDemo</display-name> <!--直接访问项目时,依次查找下面的jsp进行显示 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!--上下文配置名字和路径配置-->
<context-param>
<!-- 上下文参数名字 -->
<param-name>contextConfigLocation</param-name>
<!--上下文全局配置文件的位置,以根路径作为开始找 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <!-- 定义监听事件 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener> <!-- 定义过滤的名字及其所在的地方 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter> <!--定义需要拦截的后缀,只要满足.action就会去查找对应过滤器名字的拦截器实现类-->
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> <!--定义struts的过滤器名字和实现类-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter> <!--定义struts满足路径/*条件,就进入到filter-name为struts2的filter-class进行实现 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 定义会话超时时间 -->
<session-config>
<session-timeout>25</session-timeout>
</session-config> </web-app>

4.配置applicationContext.xml文件

<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- 加载Hibernate配置 -->
<!-- <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean> -->
<!-- 定义dbcp数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 指定JDBC驱动类 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<!-- 提供连接数据库的URL地址 -->
<property name="url" value="jdbc:mysql://localhost/spring?useSSL=false&amp;serverTimezone=UTC">
</property>
<!-- 提供连接数据库的用户名和密码 -->
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean> <!-- 定义SessionFactory Bean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 为LocalSessionFactoryBean注入定义好的数据源 -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 添加Hibernate配置参数 -->
<property name="hibernateProperties">
<props>
<!-- 定义方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!-- 定义运行时,是否在控制台进行将sql输出 -->
<prop key="hibernate.show_sql">true</prop>
<!-- 定义运行时,是否在控制台输出的sql语句进行格式化 -->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 添加对象关系映射文件 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/sshdemo/entity/</value>
</list>
</property>
</bean> <!-- 配置DAO -->
<bean id="employeeDao" class="com.sshdemo.dao.hibimpl.EmployeeDaoHibImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置业务层 -->
<bean id="employeeService" class="com.sshdemo.service.impl.EmployeeServiceImpl">
<property name="employeeDao" ref="employeeDao"></property>
</bean> <!-- 定义事务管理器 -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- read-only是表示调用这个方法时是否是子读状态,一般只用于查询,涉及更改时不要使用否则操作数据库时会抛出异常并且不能对数据更改 -->
<tx:method name="find*" read-only="true" />
<tx:method name="search*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="do*" propagation="REQUIRED" />
<tx:method name="register*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 定义切入点,表示当执行com.sshdemo.service包下面所有的类的所有方法及其各种参数的方法时切入事务管理 -->
<aop:pointcut id="serviceMethod"
expression="execution(* com.sshdemo.service.*.*(..))" />
<!-- 将事务通知与切入点组合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
</aop:config>
<tx:annotation-driven transaction-manager="txManager"/> <!-- 控制层 (id为struts.xml中的class) 以下每个bean必须都要增加scope="prototype"属性 -->
<bean id="userAction" class="com.sshdemo.action.UserAction"
scope="prototype">
<property name="employeeService" ref="employeeService"></property>
</bean> </beans>

5.建立实体类及其对应的xml文件

package com.sshdemo.entity;

/**
* 员工 实体类。
*/
public class Employee implements java.io.Serializable { // Fields private static final long serialVersionUID = 5106663630382037556L;
private String sn;
private Position position;
private Department department;
private String password;
private String name;
private String status; // Constructors /** default constructor */
public Employee() {
} /** full constructor */
public Employee(Position position, Department department, String password,
String name, String status) {
this.position = position;
this.department = department;
this.password = password;
this.name = name;
this.status = status;
} // Property accessors
/**
* @return 工号
*/
public String getSn() {
return this.sn;
} public void setSn(String sn) {
this.sn = sn;
}
/**
* @return 职务
*/
public Position getPosition() {
return this.position;
} public void setPosition(Position position) {
this.position = position;
}
/**
* @return 部门
*/
public Department getDepartment() {
return this.department;
} public void setDepartment(Department department) {
this.department = department;
} /**
* @return 密码
*/
public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} /**
* @return 姓名
*/
public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
} /**
* @return 状态
*/
public String getStatus() {
return this.status;
} public void setStatus(String status) {
this.status = status;
}
}

创建employee对应的xml文件:Employee.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sshdemo.entity">
<class name="Employee" table="sys_employee">
<id name="sn" type="string">
<column length="20" name="sn" />
<generator class="assigned" />
</id>
<many-to-one class="Position" fetch="select" name="position">
<column name="position_id" not-null="false">
<comment>职务编号</comment>
</column>
</many-to-one>
<many-to-one class="Department" fetch="select" name="department">
<column name="department_id" not-null="false">
<comment>部门</comment>
</column>
</many-to-one>
<property lazy="false" name="password"
type="string">
<column length="45" name="password" not-null="true">
<comment>密码</comment>
</column>
</property>
<property lazy="false" name="name" type="string">
<column length="45" name="name" not-null="true">
<comment>姓名</comment>
</column>
</property>
<property lazy="false" name="status" type="string">
<column length="20" name="status" not-null="true">
<comment>状态</comment>
</column>
</property>
</class>
</hibernate-mapping>

创建部门的实体表和xml文件

package com.sshdemo.entity;

/**
* 部门 实体类。
*/
public class Department implements java.io.Serializable { // Fields private static final long serialVersionUID = 5073258499319872911L;
private Integer id;
private Employee manager;
private String name; // Constructors /** default constructor */
public Department() {
} /** minimal constructor */
public Department(String name) {
this.name = name;
} /** full constructor */
public Department(Employee manager, String name) {
this.manager = manager;
this.name = name;
} // Property accessors
/**
* @return 部门编号
*/
public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
} /**
* @return 部门经理
*/
public Employee getManager() {
return this.manager;
} public void setManager(Employee manager) {
this.manager = manager;
} /**
* @return 部门名称
*/
public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!--package指定的是映射的实体类的位置路径 -->
<hibernate-mapping package="com.sshdemo.entity">
<!-- name指定实体类的名字,table定义数据库中建立的表的名字 -->
<class name="Department" table="sys_department">
<id name="id" type="integer">
<!-- 这个地方定义的是数据库中对应实体类的列名,可以不定义,它的生成就会和实体类一样 -->
<column name="id" />
<!-- 主键的增长方式,native表示自增长 -->
<generator class="native" />
</id> <many-to-one name="manager" class="Employee" fetch="select">
<column name="manager_sn" length="20">
<comment>部门经理</comment>
</column>
</many-to-one>
<property name="name" type="string">
<column name="name" length="45" not-null="true">
<comment>部门名称</comment>
</column>
</property>
</class>
</hibernate-mapping>

创建Dictionary

package com.sshdemo.entity;

/**
* 数据字典 实体类。
*/
public class Dictionary implements java.io.Serializable { // Fields private static final long serialVersionUID = -3482598030856972288L;
private long id;
private String type;
private String item;
private String value; // Constructors /** default constructor */
public Dictionary() {
} /** full constructor */
public Dictionary(String type, String item, String value) {
this.type = type;
this.item = item;
this.value = value;
} // Property accessors
/**
* @return 编号
*/
public long getId() {
return this.id;
} public void setId(long id) {
this.id = id;
} /**
* @return 类型
*/
public String getType() {
return this.type;
} public void setType(String type) {
this.type = type;
} /**
* @return 条目
*/
public String getItem() {
return this.item;
} public void setItem(String item) {
this.item = item;
} /**
* @return 值
*/
public String getValue() {
return this.value;
} public void setValue(String value) {
this.value = value;
} }
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.sshdemo.entity">
<class name="Dictionary" table="sys_dictionary">
<id name="id" type="long">
<column name="id" />
<generator class="native" />
</id>
<property name="type" type="string">
<column name="type" length="20" not-null="true" />
</property>
<property name="item" type="string">
<column name="item" length="20" not-null="true" />
</property>
<property name="value" type="string">
<column name="value" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>

创建positon类和xml

package com.sshdemo.entity;

/**
* 职务 实体类。
*/
public class Position implements java.io.Serializable { // Fields private static final long serialVersionUID = 4107962667586915867L;
private Integer id;
private String nameCn;
private String nameEn; // Constructors /** default constructor */
public Position() {
} /** minimal constructor */
public Position(String nameCn, String nameEn) {
this.nameCn = nameCn;
this.nameEn = nameEn;
} // Property accessors /**
* @return 职务编号
*/
public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
}
/**
* @return 职务名称(中文)
*/
public String getNameCn() {
return this.nameCn;
} public void setNameCn(String nameCn) {
this.nameCn = nameCn;
}
/**
* @return 职务名称(英文)
*/
public String getNameEn() {
return this.nameEn;
} public void setNameEn(String nameEn) {
this.nameEn = nameEn;
} }
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.sshdemo.entity">
<class name="Position" table="sys_position">
<id name="id" type="integer">
<column name="id" />
<generator class="native" />
</id>
<property name="nameCn" type="string">
<column name="name_cn" length="45" not-null="true">
<comment>职务名称(中文)</comment>
</column>
</property>
<property name="nameEn" type="string">
<column name="name_en" length="45" not-null="true">
<comment>职务名称(英文)</comment>
</column>
</property>
</class>
</hibernate-mapping>

创建CheckResult类和xml文件

package com.sshdemo.entity;

import java.util.Date;

/**
* 审核结果 实体类。
*/
public class CheckResult implements java.io.Serializable { // Fields private static final long serialVersionUID = 8366759716422180617L;
private long id;
private String sheetType;
private long sheetId;
private Date checkTime;
private String type;
private Employee checker;
private String result;
private String comment; // Constructors /** default constructor */
public CheckResult() {
} /** minimal constructor */
public CheckResult(String sheetType, long sheetId, Date checkTime,
String type, Employee checker, String result) {
this.sheetType = sheetType;
this.sheetId = sheetId;
this.checkTime = checkTime;
this.type = type;
this.checker = checker;
this.result = result;
} /** full constructor */
public CheckResult(String sheetType, long sheetId, Date checkTime,
String type, Employee checker, String result, String comment) {
this.sheetType = sheetType;
this.sheetId = sheetId;
this.checkTime = checkTime;
this.type = type;
this.checker = checker;
this.result = result;
this.comment = comment;
} // Property accessors
/**
* @return 编号
*/
public long getId() {
return this.id;
} public void setId(long id) {
this.id = id;
} /**
* @return 单据类型
*/
public String getSheetType() {
return this.sheetType;
} public void setSheetType(String sheetType) {
this.sheetType = sheetType;
} /**
* @return 单据编号
*/
public long getSheetId() {
return this.sheetId;
} public void setSheetId(long sheetId) {
this.sheetId = sheetId;
} /**
* @return 审核时间
*/
public Date getCheckTime() {
return this.checkTime;
} public void setCheckTime(Date checkTime) {
this.checkTime = checkTime;
} /**
* @return 审核类别
*/
public String getType() {
return this.type;
} public void setType(String type) {
this.type = type;
} /**
* @return 审核人
*/
public Employee getChecker() {
return this.checker;
} public void setChecker(Employee checker) {
this.checker = checker;
} /**
* @return 审核结果
*/
public String getResult() {
return this.result;
} public void setResult(String result) {
this.result = result;
} /**
* @return 审核意见
*/
public String getComment() {
return this.comment;
} public void setComment(String comment) {
this.comment = comment;
} }
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.sshdemo.entity">
<class name="CheckResult" table="biz_check_result">
<id name="id" type="long">
<column name="id" />
<generator class="native" />
</id>
<property name="sheetType" type="string">
<column name="sheet_type" length="20" not-null="true">
<comment>单据类型</comment>
</column>
</property>
<property name="sheetId" type="long">
<column name="sheet_id" not-null="true">
<comment>单据编号</comment>
</column>
</property>
<property name="checkTime" type="date">
<column name="check_time" length="19" not-null="true">
<comment>审核时间</comment>
</column>
</property>
<property name="type" type="string">
<column name="type" length="20" not-null="true">
<comment>审核类型</comment>
</column>
</property>
<many-to-one name="checker" class="Employee" fetch="select">
<column name="checker_sn" length="20" not-null="true">
<comment>审核人</comment>
</column>
</many-to-one>
<property name="result" type="string">
<column name="result" length="20" not-null="true">
<comment>审核结果</comment>
</column>
</property>
<property name="comment" type="string">
<column name="comment">
<comment>审核意见</comment>
</column>
</property>
</class>
</hibernate-mapping>

创建ClaimVoucher类

package com.sshdemo.entity;

import java.util.Date;
import java.util.HashSet;
import java.util.Set; /**
* 报销申请单 实体类。
*/
public class ClaimVoucher implements java.io.Serializable { // Fields private static final long serialVersionUID = -1763618295413371212L;
private long id;
private Employee nextDealBy;
private Employee creator;
private Date createTime;
private String event;
private double totalAccount;
private String status;
private Set<ClaimVoucherDetail> details = new HashSet<ClaimVoucherDetail>(0); // Constructors /** default constructor */
public ClaimVoucher() {
} /** minimal constructor */
public ClaimVoucher(Employee employeeByCreateSn, Date createTime,
String event, double totalAccount, String status) {
this.creator = employeeByCreateSn;
this.createTime = createTime;
this.event = event;
this.totalAccount = totalAccount;
this.status = status;
} /** full constructor */
public ClaimVoucher(Employee employeeByNextDealSn,
Employee employeeByCreateSn, Date createTime, String event,
double totalAccount, String status, Set<ClaimVoucherDetail> claimVoucherDetails) {
this.nextDealBy = employeeByNextDealSn;
this.creator = employeeByCreateSn;
this.createTime = createTime;
this.event = event;
this.totalAccount = totalAccount;
this.status = status;
this.details = claimVoucherDetails;
} // Property accessors
/**
* @return 编号
*/
public long getId() {
return this.id;
} public void setId(long id) {
this.id = id;
} /**
* @return 待处理人
*/
public Employee getNextDealBy() {
return this.nextDealBy;
} public void setNextDealBy(Employee employeeByNextDealSn) {
this.nextDealBy = employeeByNextDealSn;
} /**
* @return 填报人
*/
public Employee getCreator() {
return this.creator;
} public void setCreator(Employee employeeByCreateSn) {
this.creator = employeeByCreateSn;
} /**
* @return 填写时间
*/
public Date getCreateTime() {
return this.createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} /**
* @return 事由
*/
public String getEvent() {
return this.event;
} public void setEvent(String event) {
this.event = event;
} /**
* @return 总金额
*/
public double getTotalAccount() {
return this.totalAccount;
} public void setTotalAccount(double totalAccount) {
this.totalAccount = totalAccount;
} /**
* @return 状态
*/
public String getStatus() {
return this.status;
} public void setStatus(String status) {
this.status = status;
} /**
* @return 明细
*/
public Set<ClaimVoucherDetail> getDetails() {
return this.details;
} public void setDetails(Set<ClaimVoucherDetail> claimVoucherDetails) {
this.details = claimVoucherDetails;
} }
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.sshdemo.entity">
<class name="ClaimVoucher" table="biz_claim_voucher">
<id name="id" type="long">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="nextDealBy" class="Employee" fetch="select">
<column name="next_deal_sn" length="20">
<comment>待处理人</comment>
</column>
</many-to-one>
<many-to-one name="creator" class="Employee" fetch="select">
<column name="create_sn" length="20" not-null="true">
<comment>填报人</comment>
</column>
</many-to-one>
<property name="createTime" type="date">
<column name="create_time" length="19" not-null="true">
<comment>填写时间</comment>
</column>
</property>
<property name="event" type="string">
<column name="event" not-null="true">
<comment>事由</comment>
</column>
</property>
<property name="totalAccount" type="double">
<column name="total_account" precision="10" not-null="true">
<comment>总金额</comment>
</column>
</property>
<property name="status" type="string">
<column name="status" length="20" not-null="true">
<comment>状态</comment>
</column>
</property>
<set name="details" inverse="true">
<key>
<column name="main_id" not-null="true">
<comment>明细</comment>
</column>
</key>
<one-to-many class="ClaimVoucherDetail" />
</set>
</class>
</hibernate-mapping>

创建ClaimVoucherDetail类和xml

package com.sshdemo.entity;

/**
* 报销申请单明细 实体类。
*/
public class ClaimVoucherDetail implements java.io.Serializable { // Fields private static final long serialVersionUID = -5640087904678377183L;
private long id;
private ClaimVoucher master;
private String item;
private double account;
private String desc; // Constructors /** default constructor */
public ClaimVoucherDetail() {
} /** full constructor */
public ClaimVoucherDetail(ClaimVoucher claimVoucher, String item,
double account, String desc) {
this.master = claimVoucher;
this.item = item;
this.account = account;
this.desc = desc;
} // Property accessors
/**
* @return 编号
*/
public long getId() {
return this.id;
} public void setId(long id) {
this.id = id;
}
/**
* @return 主单
*/
public ClaimVoucher getMaster() {
return this.master;
} public void setMaster(ClaimVoucher claimVoucher) {
this.master = claimVoucher;
} /**
* @return 项目
*/
public String getItem() {
return this.item;
} public void setItem(String item) {
this.item = item;
} /**
* @return 金额
*/
public double getAccount() {
return this.account;
} public void setAccount(double account) {
this.account = account;
} /**
* @return 费用说明
*/
public String getDesc() {
return this.desc;
} public void setDesc(String desc) {
this.desc = desc;
} }
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.sshdemo.entity">
<class name="ClaimVoucherDetail" table="biz_claim_voucher_detail">
<id name="id" type="long">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="master" class="ClaimVoucher" fetch="select">
<column name="main_id" not-null="true">
<comment>报销单(主单)编号</comment>
</column>
</many-to-one>
<property name="item" type="string">
<column name="item" length="20" not-null="true">
<comment>项目</comment>
</column>
</property>
<property name="account" type="double">
<column name="account" precision="10" not-null="true">
<comment>金额</comment>
</column>
</property>
<property name="desc" type="string">
<column name="desc" length="200" not-null="true">
<comment>费用说明</comment>
</column>
</property>
</class>
</hibernate-mapping>

6.创建com.sshdemo.dao的employeeDao接口

package com.sshdemo.dao;

import java.io.Serializable;
import java.util.List; import com.sshdemo.entity.Employee; /**
* DAO接口。
*
*/
public interface EmployeeDao {
/**
* 添加用户
*
* @param employee 用户
*/
void add(Employee employee); /**
* 根据用户Id删除对象
* @param id主键
*/
void deleteById(Serializable id); /**
* 修改用户
*
* @param employee用户
*/
void update(Employee employee); /**
* 根据用户id加载对象
* @param id主键
* @return 返回用户对象
*/
Employee get(Serializable id); /**
* 根据查询条件查询用户数据。
* @param condition查询条件
* @return 如果condition为null,返回所有用户数据,否则,使用用户名和密码查询用户数据
*/
List<Employee> find(Employee condition);
}

7.创建对应的实现类

package com.sshdemo.dao.hibimpl;

import java.io.Serializable;
import java.util.List; import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional; import com.sshdemo.dao.EmployeeDao;
import com.sshdemo.entity.Employee; /**
* 这个是员工类的dao层,继承HibernateDaoSupport,可以按ctrl+F3
* 可以看到这个类中包含一个getHibernateTemplate()和setHibernateTemplate()方法
* 我们通过上下文配置时就已经将template用spring进行了注入,此时我们就通过
* teaplate可以获取到相应的数据源,使用template进行调用对应的增删改查
*
*/
public class EmployeeDaoHibImpl extends HibernateDaoSupport implements
EmployeeDao { /*
* (non-Javadoc)
*
* @see com.sshdemo.dao.EmployeeDao#add(com.sshdemo.entity.Employee)
*/
@Transactional
public void add(Employee employee) {
HibernateTemplate hibTemp = getHibernateTemplate();
// hibTemp.setFlushMode(HibernateTemplate.FLUSH_AUTO);
hibTemp.save(employee);
} /*
* (non-Javadoc)
*
* @see com.sshdemo.dao.EmployeeDao#deleteById(java.io.Serializable)
*/
public void deleteById(Serializable id) {
super.getHibernateTemplate().delete(this.get(id)); } /*
* (non-Javadoc)
*
* @see com.sshdemo.dao.EmployeeDao#update(com.sshdemo.entity.Employee)
*/
public void update(Employee employee) {
super.getHibernateTemplate().update(employee); } /*
* (non-Javadoc)
*
* @see com.sshdemo.dao.EmployeeDao#get(java.io.Serializable)
*/
public Employee get(Serializable id) {
return (Employee) super.getHibernateTemplate().get(Employee.class, id);
} /*
* (non-Javadoc)
*
* @see com.sshdemo.dao.EmployeeDao#find(com.sshdemo.entity.Employee)
*/
@SuppressWarnings("unchecked")
public List<Employee> find(Employee condition) {
return getHibernateTemplate().find(
"from Employee e where e.name=? and e.password=?",
new Object[] { condition.getName(), condition.getPassword() });
}
}

8.在com.sshdemo.utils下定义一个MD5加密算法的类

package com.sshdemo.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.MessageDigest; public class MD5 {
private String inStr;
//输入java.security.MessageDigest下面的一个类
private MessageDigest md5; /**
* 以下是一个带参数的构造函数,创建对象时就将
* inStr和MessageDigest赋值
* @param 杨超
*/
public MD5(String inStr) {
this.inStr = inStr;
try {
this.md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
} /* 下面是关键的md5算法 */
public String compute() { //将创建对象时的字符串转换成字符数组
char[] charArray = this.inStr.toCharArray();
//根据字符数组的长度初始化一个Byte数组
byte[] byteArray = new byte[charArray.length];
//将字符数组转换成byte数组
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i]; //将字节数组通过digest 计算存储在byte数组中
byte[] md5Bytes = this.md5.digest(byteArray);
//用它来保证线程安全
StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) {
//将每个md5Bytes进行一个或的位运算符计算,最终将其转换成二进制数字
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
//返回一个字符串
return hexValue.toString();
} /* 下面是主函数调用 */
public static void main(String[] args) {
String A = null;
try {
System.out.println("请输入你要加密的数据:");
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
A = br.readLine();
} catch (IOException e) {
}
;
MD5 md5 = new MD5(A);
String postString = md5.compute();
System.out.println("加密后的数据:" + postString);
}
}

9.创建MVC设计模式的C层

package com.sshdemo.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sshdemo.entity.Employee;
import com.sshdemo.service.EmployeeService;
import com.sshdemo.utils.MD5; /**
* 用户登录action。
*
*/
public class UserAction extends ActionSupport { private static final long serialVersionUID = -6095372451084071851L; private Employee employee = null; private EmployeeService employeeService = null; /**
* 用户登录。
*
* @return
* @throws Exception
*/
public String login() throws Exception { Employee newEmployee = null;
try {
// 对登录密码进行MD5加密
employee.setPassword(new MD5(employee.getPassword()).compute());
newEmployee = employeeService.login(employee);
} catch (Exception e) {
this.addActionMessage(e.getMessage());
} String ret = INPUT;
if (newEmployee == null) {
ret = INPUT;
} else {
Map<String, Object> session = ActionContext.getContext()
.getSession();
session.put("employee", newEmployee);
String nameCn = newEmployee.getPosition().getNameCn();
if ("普通员工".equals(nameCn)) {
ret = "staff";
} else if ("部门经理".equals(nameCn)) {
ret = "deptManager";
} else if ("总经理".equals(nameCn)) {
ret = "manager";
} else if ("财务".equals(nameCn)) {
ret = "cashier";
}
} return ret; } /**
* 用户退出。
*
* @return
* @throws Exception
*/
public String logout() throws Exception {
ActionContext ac = ActionContext.getContext();
ac.getSession().remove("employee");
return SUCCESS;
} public String register() throws Exception
{
String ret = "registerfail";
try {
// 对登录密码进行MD5加密
employee.setPassword(new MD5(employee.getPassword()).compute());
employeeService.register(employee);
ret = "registerok";
} catch (Exception e) {
this.addActionMessage(e.getMessage());
}
return ret;
} public void setEmployee(Employee employee) {
this.employee = employee;
} public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
} public Employee getEmployee() {
return employee;
} public EmployeeService getEmployeeService() {
return employeeService;
}
}

10.创建一个ExportDb创建在各实体类中定义好的xml对应的数据库表格

package com.sshdemo.utils;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;;
/**
* 将hbm生成ddl
* @author BCH
*
*/
public class ExportDb { public static void main(String[] args) {
//默认读取hibernate.cfg.xml文件
Configuration cfr = new Configuration().configure(); SchemaExport export = new SchemaExport(cfr);
export.create(true, true);
}
}

11.创建对应的jsp

login.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>
登录
</h1>
<s:actionmessage />
<s:form action="login">
<s:textfield name="employee.name" label="用户名" />
<s:password name="employee.password" label="密码" />
<s:submit value="登录"></s:submit>
</s:form>
</body>
</html>
<%@ taglib prefix="s" uri="/struts-tags"%>,这里引入了一个jsp脚本的指令,定义了一个s前缀
注意:这里对应的name=employee.name;这里对应的是实体类中name和password属性
register.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册</title>
</head>
<body>
<h1>
注册
</h1>
<s:actionmessage />
<s:form action="register">
<s:textfield name="employee.sn" label="序号" />
<s:textfield name="employee.name" label="用户名" />
<s:password name="employee.password" label="密码" />
<s:textfield name="employee.status" label="状态" />
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>

manager,jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>总经理待审核页</title>
</head>
<body>
<h1>总经理待审核页</h1>
<%
if (request.getSession().getAttribute("employee") != null){
%>
<h1>
${sessionScope.employee.name } 登录成功
</h1>
<%
} else {
%>
<h1>
你还没登录,请您先登录。
</h1>
<%
}
%>
<br>
<a href="login.jsp">继续操作</a>
</body>
</html>

staff.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>添加报销单页面</title>
</head>
<body>
<h1>添加报销单页面</h1>
<%
if (request.getSession().getAttribute("employee") != null){
%>
<h1>
${sessionScope.employee.name } 登录成功
</h1>
<%
} else {
%>
<h1>
你还没登录,请您先登录。
</h1>
<%
}
%>
<br>
<a href="login.jsp">继续操作</a>
</body>
</html>

cashier.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>财务处理页</title>
</head>
<body>
<h1>财务处理页</h1>
<%
if (request.getSession().getAttribute("employee") != null){
%>
<h1>
${sessionScope.employee.name } 登录成功
</h1>
<%
} else {
%>
<h1>
你还没登录,请您先登录。
</h1>
<%
}
%>
<br>
<a href="login.jsp">继续操作</a>
</body>
</html>

deptManager.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>部门经理待审核页</title>
</head>
<body>
<h1>部门经理待审核页</h1>
<%
if (request.getSession().getAttribute("employee") != null){
%>
<h1>
${sessionScope.employee.name } 登录成功
</h1>
<%
} else {
%>
<h1>
你还没登录,请您先登录。
</h1>
<%
}
%>
<br>
<a href="login.jsp">继续操作</a>
</body>
</html>

运行原理以login.jsp为例:

直接在eclipse上运行即可:点击登录后—后将表单提交到action后面对应的login去—此时会去struts.xml文件里面找到name=login的action,然后就会根据class找到对应业务处理的类的位置及其对应的Method方法

—由于在jsp定义了对应的name=employee.XX它就会去找实体类对应的属性,此时它对employee就已经做了一个封装,将前端传回的参数new 成了一个对象,我们拿到对象之后,就可以对它进行一系列的操作

并返回不同的结果—此时结果又会回到struts.xml中的<result name="input">/login.jsp</result>,它会根据不同的结果判断显示出不同的结果

其它注册等原理一样,不再赘述

总结:对应SSH各部分所起到的作用:spring起一个链接的作用,使得代码之间的耦合性降低,如数据源的配置sqlSessionFactory、对应的template的注入等

  struts取代了servlet,通过jsp上的指令映射到struts配置文件,然后再映射到对应业务逻辑处理所在的位置,根据返回结果,显示出不同的视图

  Hibernate它起到的作用不用去管JDBC实现,直接对对象进行操作,最终会根据它的HQL语句对数据库实现增删改查

spring+springMvc+struts的SSH框架整合的更多相关文章

  1. MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法

    MVC+Spring.NET+NHibernate .NET SSH框架整合   在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...

  2. MVC+Spring.NET+NHibernate .NET SSH框架整合

    在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我 ...

  3. (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中

    利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目  Dao   (jar)   Service (jar)   Controller (web) ...

  4. SSM(Spring+SpringMVC+Mybatis)+Mysql 框架整合搭建流程以及其间注意事项

    复习SSM框架,太久没用自己手动撘一个,发现自己还是有很多地方忘记了和没注意的事项... 首先,直接给出总流程: 零.引jar包 1.引包(或者写maven.pom) 一.数据库部分 设计数据库各表结 ...

  5. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  6. SSH框架整合

    SSH框架整合 一.原理图 action:(struts2) 1.获取表单的数据 2.表单的验证,例如非空验证,email验证等 3.调用service,并把数据传递给service Service: ...

  7. SSH 框架整合总结

    1. 搭建Struts2 环境 创建 struts2 的配置文件: struts.xml; 在 web.xml 中配置 struts2 的核心过滤器; // struts.xml <?xml v ...

  8. ssh框架整合之登录以及增删改查

    1.首先阐述一下我用得开发工具,myeclipse2017+oracle,所以我的基本配置步骤可能不一样,下面我用几张图来详解我的开发步骤. ---1先配置structs (Target 选择apac ...

  9. SSH框架整合的其它方式

    --------------------siwuxie095 SSH 框架整合的其它方式 1.主要是整合 Spring 框架和 Hibernate 框架时,可以不写 Hibernate 核心配置文件: ...

随机推荐

  1. git之摘抄

    vn中央集权, 统一服务器, 权限安全管理 git 分布式,代码仓库历史本地有,不受约束, 可以随意开分支.

  2. double保留两位小数

    public static String format(double dValue, int lScale) { // ////负数,则装化为正数后进行四舍五入 boolean bFlag = fal ...

  3. IDEA循环依赖报错解决方案

    step1.查找循环依赖 step2.在IDEA菜单栏中打开Analyze->Analyze Module Dependencies...看到有的模块被红色的标出来了,此时右边显示了循环依赖,那 ...

  4. Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)

    首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...

  5. 使用redis做分布式锁

    1.使用setnx命令.先看下官方文档http://redis.cn/commands/setnx.html 2.使用getset命令.先获取,再set 实现案例: * create 2018-12- ...

  6. react-router 4.0(二)传参

    import React from 'react'; import ReactDOM from 'react-dom' import {Link,Route,HashRouter} from 'rea ...

  7. FastJson中JSONObject用法及常用方法总结

    本文为博主原创,未经允许不得转载: 最近一直有用到解析各种数据,主要是用FastJson进行数据解析,其中一个重要的类为JSONObject,今天有时间,所以进行总结一下: JSONobject是Fa ...

  8. LINQ之路11:LINQ Operators之过滤(Filtering)

    在本系列博客前面的篇章中,已经对LINQ的作用.C# 3.0为LINQ提供的新特性,还有几种典型的LINQ技术:LINQ to Objects.LINQ to SQL.Entity Framework ...

  9. JAVA静态&动态代理

    具体场景 为了使代理类和被代理类对第三方有相同的函数,代理类和被代理类一般实现一个公共的interface,该interface定义如下 public interface Calculator { p ...

  10. IDEA中更改Tomcat服务器的URL

    先别参考以下的做法,貌似出了点状况,后续修正!!! 直接上图吧 看IDEA的右上角 点击黄色方框内的Edit Configurations,进入以下的编辑面 后面四个框内的都可以修改,当然不要修改和其 ...