spring+springMvc+struts的SSH框架整合

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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/aophttp://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 {// Fieldsprivate 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 {// Fieldsprivate 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 {// Fieldsprivate 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 {// Fieldsprivate 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 {// Fieldsprivate 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 {// Fieldsprivate 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 {// Fieldsprivate 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 implementsEmployeeDao {/** (non-Javadoc)* * @see com.sshdemo.dao.EmployeeDao#add(com.sshdemo.entity.Employee)*/@Transactionalpublic 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語句對數據庫實現增刪改查

?

轉載于:https://www.cnblogs.com/fly-boy/p/7508035.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聽說這個語言認知服務又出新功能了?

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;7分鐘)語言是人類智能發展的基石。鑒于語言擁有普遍性&#xff0c;幾乎沒有特定的技術或 AI 技術得以顛覆整個社會。微軟的使命是賦能地球上的每個人和每個組織&#xff0c;幫助他們取得更多成就。立足于該使命&#…

強大的XML

2018-04-23 20:29:26 XML&#xff1a;Extensible Markup Language&#xff0c;也就是可擴展標記語言。XML和HTML格式是古老的標記通用語言SGML的衍生語言。 XML文件是可以用來作為配置文件的&#xff0c;相比于其他配置文件的規范&#xff0c;XML的好處在于通過自定義的標記&am…

rest_framework03:查詢所有/新增數據/刪除一個數據/封裝Response/序列化與反序列化

查詢所有 1.創建新clase和url&#xff0c;避免與查詢一個功能邏輯混亂。 2.增加manyTrue&#xff0c; book_serBookSerializer(books,manyTrue) urls.py: path(books/,views.BooksView.as_view()) views.py class BooksView(APIView):def get(self,request):response_msg …

如何對DevOps數據庫進行源代碼控制

提綱&#xff1a; 包括索引在內的數據庫模式需要進行源代碼控制諸如查詢表這類用于控制業務邏輯的數據需要進行源代碼控制開發人員需要一種能夠便捷地創建本地數據庫的方法共享數據庫的更新只能通過構建服務器完成 健壯的DevOps環境需要對系統的每個組件進行持續集成。但是&…

自定義異常最佳實踐_播放,自定義和組織媒體的最佳文章

自定義異常最佳實踐Computers today are used for much more than generating documents, writing and receiving email, and surfing the web. We also use them to listen to music, watch movies and TV shows, and to transfer media to and from mobile devices. 如今&…

CSS中的路徑裁剪樣式clip-path

前面的話 CSS借鑒了SVG裁剪的概念&#xff0c;設置了clip-path樣式&#xff0c;本文將詳細介紹路徑裁剪clip-path 概述 clip-path屬性可以防止部分元素通過定義的剪切區域來顯示&#xff0c;僅通過顯示的特殊區域。剪切區域是被URL定義的路徑代替行內或者外部svg&#xff0c;或…

socket編程學習筆記

socket編程&#xff1a; 1、網絡基礎知識 兩臺計算機通過網絡進行通信&#xff0c;首先兩臺計算機要有唯一的標識&#xff0c;即唯一的IP地址。其次他們要有共同的語言用來交流即協議。再者&#xff0c;每套主機要有相應的端口號。  TCP/IP協議&#xff1a;   --TCP/IP協議是…

rest_framework04:ModelSerializer/Serializer高級用法

ModelSerializer 1.減小序列化類代碼 2.不需要重寫update&#xff0c;create ser.py class BookModelSerializer(serializers.ModelSerializer):class Meta:modelBookfields__all__ #序列化全部字段# fields(name,price) # 序列化指定字段# exclude(name,) # 與fields 不能…

配置本地及網絡yum源(詳細步驟)

我們以centos6為范例演示 1、[rootCentos6 ~]# cd /etc/yum.repos.d/ [rootCentos6 yum.repos.d]# ls CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repoCentOS-Debuginfo.repo CentOS-Media.repo先羅列出相關文件 2、[rootCentos6 yum.repos.d]# vim CentOS-Base.rep…

macos mojave_如何修復macOS Mojave上的模糊字體(使用亞像素抗鋸齒)

macos mojaveApple’s macOS Mojave disables subpixel antialiasing, also known as font smoothing, by default. On a MacBook Air or a desktop Mac hooked up to a non-Retina display, upgrading will make your fonts look worse. 蘋果的macOS Mojave默認情況下禁用子像…

為什么我要寫博客

原因在這啦 一、我覺得分享是一種精神&#xff0c;分享是我的樂趣所在&#xff0c;不是說我覺得我講得一定是對的&#xff0c;我講得可能很多是不對的&#xff0c;但是我希望我講的東西是我人生的體驗和思考&#xff0c;是給很多人反思&#xff0c;也許給你一秒鐘、半秒鐘&…

一個變量命名神器:支持中文轉變量名

變量命名的規范&#xff0c;對于我們編程&#xff0c;大家都知道是非常重要的&#xff0c;上次給大家推薦過一個命名輔助工具《程序員還在為變量取名苦惱&#xff0c;那是因為你不知道&#xff0c;這個變量命名神器》&#xff0c;但大家一致反饋存在2個問題&#xff1a;1、網速…

rest_framework05:GenericAPIView用法/擴展類5個/子類9個/ViewSetMixin 自定義方法名字

GenericAPIView 1.視圖層類使用GenericAPIView繼承&#xff0c;能簡化類里的方法code。 2.簡化后的方法code格式基本通用&#xff0c;簡單修改即可應用到其他類。 一、class開始加入 queryset Book.objectsserializer_class BookModelSerializer 二、方法里獲取對象 a.查…

1.操作系統概述

2019獨角獸企業重金招聘Python工程師標準>>> 操作系統的發展過程 無操作系統的計算機系統單道批處理系統&#xff08;50年代&#xff0c;系統資源利用率低&#xff09;多道批處理系統&#xff08;60年代&#xff09;分時系統&#xff08;70年代&#xff09;實時系統…

測聽hl和nhl的區別_播放NHL曲棍球的最便宜方法(無電纜)

測聽hl和nhl的區別If you’re like me, you watch hockey, and…basically no other sports. You also, like me, would like to skip the cable subscription. So what’s the cheapest way to watch NHL hockey online so you can cut the cord? 如果您像我一樣&#xff0c;…

制作一個讓客戶滿意的軟件

我看了《構建之法》的第八章“需求分析”我對如何制作一個讓客戶滿意的軟件有了一點兒頭緒&#xff0c;的但是還是有一些迷惑。我通過看書總結和百度查找有了一點兒總結&#xff1a;我們在制作軟件的過程中應該及時與用戶溝通交流&#xff0c;交換意見&#xff0c;并及時實現用…

rest_framework06:自動生成路由\action使用\認證

自動生成路由 # 1.導入routers模塊 from rest_framework import routers# 2.實例化類 routerrouters.SimpleRouter()# 3.注冊 # (前綴,繼承自ModelViewSet視圖類,別名) router.register(books7,views.BooksView) # 不要加斜杠# 4.加入 urlpatternsrouter.urls action使用 裝…

char data[0]在struct末尾的用法

在實際的編程中&#xff0c;我們經常需要使用變長數組&#xff0c;但是C語言并不支持變長的數組。此時&#xff0c;我們可以使用結構體的方法實現C語言變長數組。 struct MyData { int nLen; char data[0];}; 在結構中&#xff0c;data是一個數組名&#xff1b;但該數組沒有元素…

使用Java實現K-Means聚類算法

2019獨角獸企業重金招聘Python工程師標準>>> 關于K-Means介紹很多&#xff0c;還不清楚可以查一些相關資料。 個人對其實現步驟簡單總結為4步: 1.選出k值,隨機出k個起始質心點。 2.分別計算每個點和k個起始質點之間的距離,就近歸類。 3.最終中心點集可以劃分為…

在PowerShell中顯示高級進度條

如果你需要編寫一些PowerShell腳本&#xff0c;尤其在處理一些相對復雜的任務時&#xff0c;你可能希望添加進度條的功能&#xff0c;以便隨時可以了解進展情況。Write-Progress 這個命令可以幫助你完成簡單的需求&#xff0c;請參考官方文檔即可&#xff0c;但下圖一個示例&am…