SSH(Struts2+Spring+Hibernate)框架搭建流程<註解的方式創建Bean>

来源:http://www.cnblogs.com/wkrbky/archive/2016/09/28/5915910.html
-Advertisement-
Play Games

此篇講的是MyEclipse9工具提供的支持搭建自加包有代碼也是相同:用戶登錄與註冊的例子,表欄位只有name,password. SSH,xml方式搭建文章鏈接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一、Hibernate(數據層)的搭建: ...


此篇講的是MyEclipse9工具提供的支持搭建自加包有代碼也是相同:用戶登錄與註冊的例子,表欄位只有name,password.

  SSH,xml方式搭建文章鏈接地址:http://www.cnblogs.com/wkrbky/p/5912810.html

 

一、Hibernate(數據層)的搭建:

實現流程

二、Spring(註入實例)的使用:

實現流程

 

三、Struts2(MVC)的搭建:

實現流程

 

這裡註意一點問題:

  Struts2與Hibernate在一起搭建,antlr包,有衝突。MyEclipse9中有這樣問題。朋友的MyEclipse10中沒有這個問題。

 

  我選擇把Struts中antlr包去掉。

DB Browser中反轉實體類:

sequence自動增長ID實體類中配置連接:http://www.cnblogs.com/wkrbky/p/5917985.html

 

 編輯web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name></display-name>
    
    <!-- 這是一隻攔路虎 -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- 讀取applicationContext.xml文件 不寫預設Spring需要讀取 WebContent\WEB-INF\applicationContext.xml -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 改變預設讀取路徑為src目錄下的 applicationContext.xml 在改變的路徑下還是沒找到,便自動到預設路徑查找 -->
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- 定義Spring監聽器 class: spring 3.0 Web Libraries 下可以找到。 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- Struts2過濾器 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

 配置applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!--  1.:需要導入的命名空間
        命名規範: 
            xsi:架構實例 
            beans:根節點 
            aop:事務 
            context:註解 
            tx:事務管理 
            xsi:schemaLocation 
    協議(一個命名規範對應一個協議) 註:若不知道自己使用的框架版本,可以把協議後的版本號去掉,此處已經去掉。 -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 註解方式創建Bean
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml">
        </property>
    </bean> -->
    
    <!-- 數據源連接池的寫法
        註意:使用GUI創建的數據源,本地會話工廠改為註解會話工廠
        hibernate.dialect:方言改10g,預設9
        packagesToScan:註意一下,這裡是導入實體類的映射信息。導入實體類的包。
     -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName"
            value="oracle.jdbc.driver.OracleDriver">
        </property>
        <property name="url"
            value="jdbc:oracle:thin:@localhost:1521:orcl">
        </property>
        <property name="username" value="root"></property>
        <property name="password" value="admin"></property>
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.Oracle10gDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
        <property name="packagesToScan">
            <list>
                <value>com/entity</value>
            </list>
        </property>
    </bean>
    
    <!-- 2註解配置組件(代表聲明開啟註解模式,不加的話三個框架整合的話或許有些問題,或許識別不了標註組件@)-->
    <context:annotation-config />
    <!-- 3配置註解的自動掃描範圍(多個包配置可配置多個context:component-scan)
        base-package:需要掃描的包
     -->
    <context:component-scan base-package="com.dao.impl"/>
    <context:component-scan base-package="com.service.impl"/>
    <context:component-scan base-package="com.action"/>

    <!-- 4第二種方法,在dao類中定義一個模板對象,這是外部的類不是我們創建的,所以要寫在這裡,如果不寫,dao.iml中就找不到此模型 -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" ></property>
    </bean>
    
    <!-- (1)配置註解事務管理器 -->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
     <!-- (2)加入註解事務管理器 -->
    <tx:annotation-driven transaction-manager="txManager"/>
    
</beans>

配置struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

   <!-- 是否啟動動態方法調用
   <constant name="struts.enable.DynamicMethodInvocation"value="false" /> -->

   <!-- 開啟開發者模式,作用,頁面中報錯信息會更加詳細,預設false -->
   
   <constant name="struts.devMode" value="true" />

   <!-- 指定由spring負責action對象的創建(必選) -->

   <constant name="struts.objectFactory" value="spring" />

   <!-- 國際化設置,請求參數為utf-8編碼(必選) -->

   <constant name="struts.i18n.encoding" value="utf-8" />

   <!-- 指定被struts2處理的請求尾碼類型,如果有多個,用逗號隔開

   <constant name="struts.action.extension" value="action" /> -->

   <!-- 指定上傳文件的大小上限

   <constant name="struts.multipart.maxSize" value="209715200" /> -->

   <!-- 當配置文件改動後是否重新載入,生產環境下需要設置為false

   <constant name="struts.configuration.xml.reload" value="false" /> -->

   <!-- 是否使用struts2的開發模式,生產環境下需要設置為false

   <constant name="struts.devMode" value="false" /> -->

   <!-- 瀏覽器是否緩存靜態內容,生產環境下需要設置為true

   <constant name="struts.serve.static.browserCache" value="true" /> -->

   <!-- <includefile="example.xml"/> -->

</struts>

數據訪問層dao介面:

package com.dao;

import com.entity.Users;

/**
 * 用戶介面
 * @author asus
 *
 */
public interface UsersDao {

    /** 登陸驗證 */
    Users loginCheck(Users user);
    
    /** 添加的方法 */
    int addUser(Users user);
}

數據訪問層dao.impl實現類:

package com.dao.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import com.dao.UsersDao;
import com.entity.Users;
/**
 * 用戶介面實現類
 * @author asus
 *HibernateTemplate、HibernateDaoSupport兩種方法實現增刪改查
 *第二種方法:(第一種在《SSH(Struts2+Spring+Hibernate)框架搭建流程》中有詳細介紹)
    在dao類中定義一個HibernateTemplate類的對象,用該對象調用HibernateTemplate模板封裝好的方法,如下:
 */
@Repository(value="usersDaoImpl")//用於標註數據訪問組件,即DAO組件,value屬性可不寫預設是類名首字母小寫(觀看順序1)
public class UsersDaoImpl implements UsersDao {
    
    //定義一個模板對象(使用註解不需要生成Get'Set方法,屬性名必須類名首字母小寫才能註解方式自動賦值)
    //@Autowired//註釋進行自動註入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,拋出異常,這樣的話就不友好了不是,所有Spring提供了一個配套使用的@Qualifier(完全自動)
    //@Qualifier(value="hibernateTemplate")//指定註入 Bean 的名稱與@Autowired配套使用
    @Resource(name="hibernateTemplate")//spring組件setter方法註入(觀看順序2)
    private HibernateTemplate hibernateTemplate;
        
    @Override
    public Users loginCheck(Users user) {
        
        //得到一個集合
        List<Users> list = hibernateTemplate.find("from Users where name=? and password=? ",user.getName(),user.getPassword());
        
        //使用三元運算符,防止list.get(0)時報空指針。
        return (Users) (list.size()>0?list.get(0):null);
    }

    @Override
    public int addUser(Users user) {
        
        try {
            hibernateTemplate.save(user);
            return 1;
        } catch (DataAccessException e) {
            
            e.printStackTrace();
        }
        return 0;
    }

}

業務邏輯層介面service:

package com.service;

import com.entity.Users;

/**
 * 用戶業務邏輯層
 * @author asus
 *
 */
public interface UsersService {

    /** 登陸驗證 */
    Users loginCheck(Users user);
    
    /** 添加的方法 */
    int addUser(Users user);
}

數據訪問層dao.impl實現類

package com.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dao.UsersDao;
import com.entity.Users;
import com.service.UsersService;
/**
 * 用戶業務邏輯層實現類
 * @author asus
 *
 */
//@Transactional    //給實現類的所有添加事務(也可以個某一個方法添加此標註)
@Service(value="usersServiceImpl")//用於標註業務層組件(觀看順序3)
public class UsersServiceImpl implements UsersService {

    //這裡以前是new的,現在不需要了,交給Spring來實例(使用註解不需要生成Get'Set方法)
    @Resource(name="usersDaoImpl")//spring組件setter方法註入(觀看順序4)
    private UsersDao udd;
    
    @Override
    public Users loginCheck(Users user) {
        
        return udd.loginCheck(user);
    }

    @Transactional//給單個方法添加事物(若類上添加了全體事物,則不需要添加此局部事物)
    @Override
    public int addUser(Users user) {
        
        return udd.addUser(user);
    }

}

控制器類Action:

package com.action;

import javax.annotation.Resource;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.entity.Users;
import com.opensymphony.xwork2.ActionSupport;
import com.service.UsersService;
/**
 * 用戶控制器類
 * @author asus
 *
 */
//Action類[觀看順序5]
@Controller(value="usersAction")//用於標註控制層組件(如struts中的action)
@Scope("prototype")//單列模式
@ParentPackage("struts-default")
@Namespace("/")
/*    Results({}):集合,對應的結果有多個
 *     Result():一個結果
 *  name:Action return返回的值
 *  location:返回結果的頁面
 */
@Results({
    @Result(name="success",location="/success.jsp"),
    @Result(name="login",location="/login.jsp"),
    @Result(name="register",location="/register.jsp")
        })
public class UsersAction extends ActionSupport {

    //接收頁面的值
    private Users user;
    //一樣交給Spring實例(使用註解不需要生成Get'Set方法)
    @Resource(name="usersServiceImpl")//spring組件setter方法註入(觀看順序6)
    private UsersService uss;
    
    public String execute(){
        
        return SUCCESS;
    }
    
    /** 判斷用戶輸入的賬號密碼 */
    @Action("loginUser")//相當於sturts.xml中的action標簽的name,表單提交的url地址(觀看順序7)
    public String login(){
        
        Users checkNum=null;
        if(user!=null){
            checkNum = uss.loginCheck(user);
        }
        
        return checkNum==null?LOGIN:SUCCESS;
    }

    /** 添加用戶 */
    @Action("addUser")
    public String add(){
        
        int addResult=0;
        if(user!=null){
            addResult = uss.addUser(user);
        }
        
        return addResult==0?"register":SUCCESS;
    }
    //生成Get'Set
    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }

}

登陸頁面:

  <body>
        <form action="loginUser.action" method="post" >
            用戶名:<input type="text" name="user.name" />
            密碼:   <input type="password" name="user.password" />
            <input type="submit" value="登錄按鈕" >
        </form>
  </body>

註冊頁面:

    <body>
        <form action="addUser.action" method="post">
            用戶名:
            <input type="text" name="user.name">
            <br>
            密碼:
            <input type="password" " name="user.password">
            <br>
            <input type="submit" value="註冊">
        </form>
    </body>

成功頁面:

  <body>
        操作成功!
  </body>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.NET 頁面請求超時時間(頁面後臺程式執行時間)預設值為 110 秒(在 .NET Framework 1.0 版和 1.1 版中,預設值為 90 秒) 即: Server.ScriptTimeout = 110(HttpServerUtility.ScriptTimeout = 110) ...
  • 使用EF自己做的小功能需要遇到inner join和group by組合使用及匿名類型的處理,搜了很多,基本不能滿足自己的需要,所以總結了也實現了就自己寫出來,已備查看及伙伴查詢參考(一般的語句查詢就不說了,網路搜索很多) 語句查詢的背景(要不直接看語句估計也夠嗆):主要想實現類似QQ相冊的功能展示 ...
  • 上周五最後一天在公司上班,無聊之餘就想做點什麼.介於之前有人讓我做個簡易版的線上聊天的,於是乎就打算花一天時間來弄下關於SignalR的簡單教程製作一個線上的聊天的。 1:前端用了國產的一個MVVM框架 avalon 的早期版本和 layer 插件(具體怎麼用這裡就不介紹了,需要瞭解的自行百度) 2 ...
  • Microsoft SDK自帶的ildasm.exe工具, 是一個反編譯工具, 可以查看編譯好後的dll的文件 雙擊ildasm.exe, 把你要識別的.dll文件拖進來, 就會反編譯了. 接著在ildasm里, 雙擊第一行的MANIFEST, 前面五行會類似如下顯示, 註意一定要是mscorlib ...
  • CronTriggers使用的頻率比SimpleTrigger跟高。如果需要schedule 中觸發Job的方式類似於日曆的形式而不是一個確定的是時間間隔,那就需要使用CronTrigger。 對於CronTrigger,你可以觸發Schedule,例如每個周五中午或者每個工作日的下午9:30或者在 ...
  • 一、前言 Jdom是什麼? Jdom是一個開源項目,基於樹形結構,利用純java的技術對XML文檔實現解析,生成,序列化以及多種操作。它是直接為java編程服務,利用java語言的特性(方法重載,集合),把SAX和DOM的功能結合起來,儘可能的把原來解析xml變得簡單,我們使用Jdom解析xml會是 ...
  • 一、HDFS讀過程 1.1 HDFS API 讀文件 1 Configuration conf = new Configuration(); 2 FileSystem fs = FileSystem.get(conf); 3 Path file = new Path("demo.txt"); 4 F ...
  • 分析: mysql_fetch_row,這個函數是從結果集中取一行作為枚舉數據,從和指定的結果標識關聯的結果集中取得一行數據並作為數組返回。每個結果的列儲存在一個數組的單元中,偏移量從 0 開始。 註意,這裡是從0開始偏移,也就是說不能用欄位名字來取值,只能用索引來取值,所以如下代碼是取不到值的: ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...