spring+springMvc+struts的SSH框架整合

小瘋以前工做用的框架是o3w,SSH框架只是學習的時候用過,而後今天就回頭來從新回顧SSH,就在網上找了一篇比較全並且比較簡單的文章來幫助本身快速的理解SSH。html

1.創建一個web項目前端

2.導入SSH框架所需jar包java

3.配置web.xml文件mysql

複製代碼

<?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文件web

複製代碼

<?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.xmlspring

複製代碼

<?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文件sql

複製代碼

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類和xmlexpress

複製代碼

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語句對數據庫實現增刪改查

相關文章
相關標籤/搜索