SSH案例--入門級

来源:http://www.cnblogs.com/zhaozihan/archive/2016/09/21/5893785.html
-Advertisement-
Play Games

1.項目功能展示 (1)註冊 (2)修改地址與級別信息,點擊修改 (3)再添加一位成員,進行刪除 點擊第二行的刪除 (4)登錄模塊測試 輸入資料庫中沒有的信息: 輸入資料庫中存在的信息: 2. Web.xml Spring提供了ContextLoaderListener,該監聽器實現了Servlet ...


1.項目功能展示

(1)註冊

  

(2)修改地址與級別信息,點擊修改

   

(3)再添加一位成員,進行刪除

點擊第二行的刪除

(4)登錄模塊測試

輸入資料庫中沒有的信息:

輸入資料庫中存在的信息:

  

2. Web.xml

  Spring提供了ContextLoaderListener,該監聽器實現了ServletContextListener介面,他在Web應用程式啟動時被觸發。當他創建時會自動查找WEB-INF/下的applicationContext.xml,所以當只有一個配置文件且文件名為applicationContext.xml時,則只需要在web.xml文件中配置ContextLoaderListener監聽器即可.當有多個配置文件需要載入,則應該使用<context-param>元素指定配置文件的文件名,ContextLoaderListener載入時,會查找名為contextConfigLocation的初始化參數。當Web應用程式啟動時先讀取web.xml文件,然後創建spring容器,之後根據配置文件內容,裝配Bean實例。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ssh</display-name>
  <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>
  
  
 <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>

  <welcome-file-list>
    <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>
</web-app>
View Code

3. 實體類與其映射文件

(1)Member.java

package com.entity;

public class Member {
    private long id;
    private String name;
    private String password;
    private String address;
    private String email;
    private int level;
    public Member(){}
    public Member(String name,String password,String address,String email,int level){
        this.name = name;
        this.password = password;
        this.address = address;
        this.email = email;
        this.level = level;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public int getLevel() {
        return level;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    
}
View Code

(2)Member.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.entity.Member" table="MEMBER">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="ADDRESS" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" />
        </property>
        <property name="level" type="int">
            <column name="LEVEL" />
        </property>
    </class>
</hibernate-mapping>
View Code

4.DAO層

(1)介面MemberDAO.java

package com.dao;

import java.util.List;

import com.entity.Member;

public interface MemberDAO {
    public void add(Member member);
    public void update(Member member);
    public void delete(long id);
    public Member findByName(String name,String password);
    public Member findById(long id);
    public List<Member> findAll();

}
View Code

(2)實現類MemberDAOImpl.java(sessionFactory通過構造方法註入,使其可以操作資料庫)

package com.dao;

import java.util.List;

import com.entity.Member;
import org.hibernate.*;
import org.springframework.beans.factory.annotation.Autowired;
public class MemberDAOImpl implements MemberDAO {
    
    private SessionFactory sessionFactory;
    
    //構造方法註入SessionFactory對象
    public MemberDAOImpl(SessionFactory sessionFactory) {
        this.sessionFactory=sessionFactory;
    }
    
    //使用SessionFactory對象返回Session對象
    public Session currentSession(){
        return sessionFactory.openSession();
    }
    @Override
    public void add(Member member) {
        Session session=null;
        try {
            session=currentSession();
            Transaction tx = session.beginTransaction();
            session.save(member);
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }

    }

    @Override
    public void update(Member member) {
        Session session=null;
        try {
            session=currentSession();
            Transaction tx = session.beginTransaction();
            session.update(member);
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }

    }

    @Override
    public void delete(long id) {
        Session session=null;
        try {
            session=currentSession();
            Transaction tx = session.beginTransaction();
            Member mb = (Member)session.get(Member.class, id);
            session.delete(mb);
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }

    }

    @Override
    public Member findByName(String name, String password) {
        Session session=null;
        Member result = null;
        try {
            session=currentSession();
            Transaction tx = session.beginTransaction();
            String hsql = " from Member m where m.name = :mname and m.password = :mpassword";
            Query query = session.createQuery(hsql);
            query.setParameter("mname", name);
            query.setParameter("mpassword", password);
            result = (Member)query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }
        return result;
    }

    @Override
    public Member findById(long id) {
        Session session=null;
        Member result = null;
        try {
            session=currentSession();
            Transaction tx = session.beginTransaction();
            String hsql = " from Member m where m.id = :id";
            Query query = session.createQuery(hsql);
            query.setParameter("id",id);
            result = (Member)query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }
        return result;
    }

    @Override
    public List<Member> findAll() {
        Session session=null;
        List<Member> list = null;
        try {
            session=currentSession();
            Transaction tx = session.beginTransaction();
            String hsql = " from Member";
            Query query = session.createQuery(hsql);
            list = query.list();
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }
        return list;
    }

}
View Code

5.業務邏輯層

(1)介面MemberService.java

package com.service;
import java.util.List;
import com.entity.Member;
public interface MemberService {
    public void add(Member member);
    public void update(Member member);
    public void delete(long id);
    public Member findByName(String name,String password);
    public Member findById(long id);
    public List<Member> findAll();
}
View Code

(2)實現類MemberServiceImpl.java(設值註入DAO層組件)

package com.service;

import java.util.List;

import com.dao.MemberDAO;
import com.entity.Member;

public class MemberServiceImpl implements MemberService {
    private MemberDAO memberDao;
    //設值註入DAO對象
    public void setMemberDao(MemberDAO memberDao) {
        this.memberDao = memberDao;
    }

    @Override
    public void add(Member member) {
        if(memberDao.findById(member.getId())==null)
            memberDao.add(member);

    }

    @Override
    public void update(Member member) {
        if(memberDao.findById(member.getId())!=null)
            memberDao.update(member);

    }

    @Override
    public void delete(long id) {
        if(memberDao.findById(id)!=null)
            memberDao.delete(id);

    }

    @Override
    public Member findByName(String name, String password) {
        return memberDao.findByName(name, password);
    }

    @Override
    public Member findById(long id) {
        return memberDao.findById(id);
    }

    @Override
    public List<Member> findAll() {
        return memberDao.findAll();
    }

}
View Code

6. Action類

(1)註冊MemberRegisterAction.java(設值註入業務邏輯組件)

package com.action;

import com.entity.Member;
import com.opensymphony.xwork2.ActionSupport;
import com.service.MemberService;

public class MemberRegisterAction extends ActionSupport {
    private Member member;
    private MemberService memberService;
    public Member getMember() {
        return member;
    }
    public void setMember(Member member) {
        this.member = member;
    }
    //註入業務邏輯組件
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
    public String execute(){
        memberService.add(member);
        return SUCCESS;
    }
    
}
View Code

(2)刪除MemberDeleteAction.java(設置註入業務邏輯組件,註意傳入參數id的相應getter和setter方法)

package com.action;

import com.opensymphony.xwork2.ActionSupport;
import com.service.MemberService;

public class MemberDeleteAction extends ActionSupport {
    private MemberService memberService;

    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
    
    private long id;


    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }

    public String execute(){
        memberService.delete(getId());
        return SUCCESS;
    }
}
View Code

(3)查詢MemberQueryAction.java(用於查看所有會員信息)

package com.action;

import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.entity.Member;
import com.opensymphony.xwork2.ActionSupport;
import com.service.MemberService;

public class MemberQueryAction extends ActionSupport {
    private MemberService memberService;

    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
    public String execute(){
        List<Member> list = memberService.findAll();
        ServletActionContext.getRequest().setAttribute("memberList", list);
        return SUCCESS;
    }
}
View Code

(4)修改MemberUpdateAction.java(有兩個方法,execute()和showMember(),當需要修改時,showMember()方法轉向update.jsp.並設置好需要修改的對象,修改完成之後,由spring托管的memberUpdateAction組件執行execute方法進行update操作)

package com.action;

import com.entity.Member;
import com.opensymphony.xwork2.ActionSupport;
import com.service.MemberService;

public class MemberUpdateAction extends ActionSupport {
    private MemberService memberService;
    private Member member;
    private long id;
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
    public Member getMember() {
        return member;
    }
    public void setMember(Member member) {
        this.member = member;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String showMember(){
        Member mb = memberService.findById(getId());
        setMember(mb);
        return SUCCESS;
    }
    public String execute(){
        memberService.update(member);
        return SUCCESS;
    }
}
View Code

(5)登錄MemberLoginAction.java(將輸入的信息與資料庫中進行比較)

package com.action;

import com.entity.Member;
import com.opensymphony.xwork2.ActionSupport;
import com.service.MemberService;

public class MemberLoginAction extends ActionSupport {
    private Member member;
    private MemberService memberService;
    public Member getMember() {
        return member;
    }
    public void setMember(Member member) {
        this.member = member;
    }
    //註入業務邏輯組件
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
    
    public String execute(){
        Member mb =memberService.findByName(member.getName(), member.getPassword());
        if(mb!=null)
            return SUCCESS;
        else
            return ERROR;
    }
}
View Code

7.struts.xml

  spring托管將Struts2中的Action的實例化工作交由Spring容器統一管理,同時使Struts2中的Action實例能夠訪問Spring提供的業務邏輯資源,spring容器依賴註入的優勢也可以體現,Struts2提供的spring插件struts2-spring-plugin-2.3.16.3.jar配合<constant name="struts.objectFactory" value="spring">使得Struts2的action由Spring來負責進行實例化.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true" />
    
    <constant name="struts.objectFactory" value="spring"></constant>
    
    <package name="default" namespace="/" extends="struts-default">
        <!-- class屬性值是spring定義的Bean,當執行execute()返回success時,控制轉到另一個動作memberQuery -->
        <action name="memberRegister" class="memberRegisterAction">
            <result name="success" type="redirectAction">/memberQuery</result>
        </action>
        
        <action name="memberLogin" class="memberLoginAction">
            <result name="success">/welcome.jsp</result>
            <result name="error">/register.jsp</result>
        </action>
        
        <action name="memberQuery" class="memberQueryAction">
            <result name="success">/displayAll.jsp</result>
        </action>
        
        <action name="memberDelete" class="memberDeleteAction">
            <result name="success" type="redirectAction">/memberQuery</result>
        </action>
        
        <action name="memberShow" class="memberUpdateAction" method="showMember">
            <result name="success">/update.jsp</result>
        </action>
        
        <action name="memberUpdate" class="memberUpdateAction">
            <result name="success" type="redirectAction">/memberQuery</result>
        </action>
    </package>
</struts>
View Code

8.applicationContext.xml

  spring 框架提供了多種數據源類,可以使用spring提供的DriverManagerDataSource類還可以使用第三方數據源,如C3P0的ComboPooledDataSource數據源類,註意相應的兩個jar包c3p0-0.9.2.1.jar mchange-commons-java-0.2.3.4.jar.

  Hibernate4已經完全實現自己的事物管理,所以spring4不提供HibernateDaoSupport和HibernateTemplete的支持。可以在應用程式的spring上下文中,像配置其他bean那樣來配置HibernateSession工廠。如果要使用XML文件定義對象與資料庫之間的映射,則需要在spring中配置LocalSessionFactoryBean。hibernateProperties屬性配置了Hibernate如何進行操作的細節。"hibernate.current_session_context_class"是為當前Session提供一個策略,Session由org.springframework.orm.hibernate4.SpringSessionContext.currentSession得到。將sessionFactory註入到其他Bean中,如註入到DAO組件中,使其獲得SessionFactory的引用後,就可以實現對資料庫的訪問。

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">


    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/zzh?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="user" value="root"/>
        <property name="password" value="root"/>
        <property name="maxPoolSize" value="40"/>
        <property name="minPoolSize" value="1"/>
        <property name="initialPoolSize" value="2"/>
        <property name="maxIdleTime" value="20"/>
    </bean>
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>com/entity/Member.hbm.xml</value>
            </list>
        </	   

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

-Advertisement-
Play Games
更多相關文章
  • 2016年9月21日09:21:431.爬蟲的抓取周期:(1)首先生成初始請求爬第一個url,並指定一個回調函數被稱為與下載這些請求的響應。(2)第一個請求執行通過調用 start_requests()方法(預設情況下)生成 Request中指定的url start_urls和 parse方法作為請 ...
  • 從作用域上來說,C語言可以定義4種不同的變數:全局變數,靜態全局變數,局部變數,靜態局部變數。 下麵僅從函數作用域的角度分析一下不同的變數,假設所有變數聲明不重名。 全局變數,在函數外聲明,例如,int gVar;。全局變數,所有函數共用,在任何地方出現這個變數名都是指這個變數 靜態全局變數(sta ...
  • E - The Values You Can Make Description Pari wants to buy an expensive chocolate from Arya. She has n coins, the value of the i-th coin is ci. The pri ...
  • 版權聲明 版權聲明:原創文章 禁止轉載 請通過右側公告中的“聯繫郵箱([email protected])”聯繫我 勿用於學術性引用。 勿用於商業出版、商業印刷、商業引用以及其他商業用途。 本文不定期修正完善。 本文鏈接:http://www.cnblogs.com/wlsandwho/p/ ...
  • 1、實現功能 向關註了微信公眾號的微信用戶群發消息。(可以是所有的用戶,也可以是提供了微信openid的微信用戶集合) 2、基本步驟 前提: 已經有認證的公眾號或者測試公眾賬號 發送消息步驟: 相關微信介面的信息可以查看:http://www.cnblogs.com/0201zcr/p/586629 ...
  • Java中的Bigdecimal類型運算 雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。Java在java.math包中提 供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。表5.7中列出了BigDecimal類的主要 ...
  • C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u C - NP-Hard Problem D ...
  • 運算符 1、算數運算: 2、比較運算: 3、賦值運算: 4、邏輯運算: 5、成員運算: 基本數據類型 1、數字 int(整型) 在32位機器上,整數的位數為32位,取值範圍為-2**31~2**31-1,即-2147483648~2147483647 在64位系統上,整數的位數為64位,取值範圍為- ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...