Spring+hibernate+struts

1、Springhtml

主要功能:解耦和(對象之間可配置,依賴注入的)mysql

1.概念:web

容器:容器能夠裝載對象,實例化對象,配置對象之間的依賴關係。spring

IOC/DI
IOC:Inversion of Control(控制反轉),是指程序之間的依賴關係由依賴具體實現(如DISKUSB,UUSB),變爲依賴抽象接口(USB). 
        一句話:依賴抽象非具體
DI:Dependency Injection(依賴注入),是指程序之間的依賴關係由容器動態注入,而非硬編碼實現。
        Spring裏的全部類都是JavaBean,Bean就像項鍊的柱子,配置文件就像線同樣把全部珠子串起來。sql

AOP:Aspect Oriented programming(面向方面編程),是指將程序中的某一方面獨立出來,單獨設計(如事務,日誌,權限等)。數據庫

2.Spring簡介
(1)對企業級開發提供一站式服務(集成hibernate,spring mvc等);
(2)IOC:Spring的核心思想和實現,大部分功能都基於此;
(3)AOP:在Spring中提供了三種對AOP技術的實現;
(4)對持久稱的支持:封裝了JDBC的操做;
           集成了流行的技術框架(Hibernate,JDO,Toplink,iBATTS);
(5)對web層的支持:
        Spring MVC;
        對其它框架的支持(Struts,WebWork)
(6)對其它框架和技術的集成:
  RMI和WebService
  EJB
  JMS
  JavaMail
  定時任務和調度express

3.使用Spring
(1)添加jar包:spring.jar,commons-logging.jar;
(2)建立配置文件beans.xml編程

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
    <bean id="hw" class="com.lb.action.Test2">
        <property name="name" value="zhangsan" />
    </bean>
</beans>

 

public class Test2 {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void HelloWord(){
        System.out.println(name);
    }
    public static void main(String[] args) {
        //(3)得到Bean工廠;
        Resource rs = new ClassPathResource("beans.xml");
        BeanFactory bf = new XmlBeanFactory(rs);
        //(4)得到對象。
        Test2 t2 = (Test2) bf.getBean("hw");
        //(5)調用方法
        t2.HelloWord();
        /*Test2 t2 = new Test2();
        t2.setName("zhangsan2");
        t2.HelloWord();*/
    }
}

 依賴注入的例子:
interface usbsession

package com.lb.action;

public interface Usb {
    public void read();
    public void write();
}

UUSB實現類mvc

package com.lb.action;

public class UUSB implements Usb{
    public void read(){
        System.out.println("read from UUSB.....");
    }
    public void write(){
        System.out.println("write to UUSB.....");
    }
}

DiskUSB實現類

package com.lb.action;

public class DiskUSB implements Usb{
    public void read(){
        System.out.println("read from DiskUSB....");
    }
    public void write(){
        System.out.println("write to DiskUSB....");
    }
}

Computer依賴類,依賴uUSB或者diskUSB

package com.lb.action;

public class Computer{
    private Usb usb;
    public void setUsb(Usb usb) {
        this.usb = usb;
    }
    public void test(){
        usb.read();
        usb.write();
    }
}

主函數:

package com.lb.action;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class Test2 {
    public static void main(String[] args) {
        Resource rs = new ClassPathResource("beans.xml");
        BeanFactory bf = new XmlBeanFactory(rs);
        Computer computer = (Computer) bf.getBean("computer");
        computer.test();
    }
}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
    <bean id="hw" class="com.lb.action.Test2">
        <property name="name" value="zhangsan" />
    </bean>
    <bean id="uUSB" class="com.lb.action.UUSB" />
    <bean id="DiskUSB" class="com.lb.action.DiskUSB" />
    <bean id="computer" class="com.lb.action.Computer">
        <!-- 屬性usb依賴id爲DiskUSB的bean -->
        <property name="usb" ref="DiskUSB"></property>
    </bean>
</beans>

 4.使用IOC容器管理Bean
(1)IOC容器簡介
  *Java裏的類在Spring裏都被成爲Bean;
  *容器是用來讀取Bean的定義,管理對象的初始化、生產以及對象之間的依賴關係。

  在Spring當中的IOC容器是由BeanFactory和ApplicationContext這兩個接口來實現的。

  BeanFactory的經常使用方法:Object getBean(String name) 根據Bean標識(id)得到Bean實例。

(2)Bean的定義標識和別名

<bean id="hw" class="com.lb.action.Test2">
        <property name="name" value="zhangsan" />
</bean>

 

(3)Bean的實例化
兩種方法:
  BeanFactory

Resource rs = new ClassPathResource("beans.xml");
BeanFactory bf = new XmlBeanFactory(rs);
Computer computer = (Computer) bf.getBean("computer");

  ApplicationContext(很經常使用)

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Computer computer = (Computer) context.getBean("computer");

 

(4)Bean的scope
  Singleton:在Spring中,從容器中得到的實例都是單例的;
  Prototype:若是每次都想得到一個新的實例,則能夠把bean的scope屬性設置爲scope="Prototype";
  Request
  Session
  GlobalSession

5.Spring AOP Annotaion實現(AOP思想本質就是攔截)
參考:http://blog.csdn.net/wangpeng047/article/details/8556800 
(1)@AspectJ簡介
  使用了Java5的註解,能夠將切面聲明爲普通的Java類。

(2)啓用@AspectJ支持
  在beans.xml配置文件里加<aop:aspectj-autoproxy/>
  可直接複製文檔裏的配置文件。

(3)聲明一個切面
  在類前面加@Aspect.

(4)聲明一個切入點(pointcut)
  a.切入點簡介
  b.切入點匹配表達式
  c.execution pointcut表達式
  d.切入點聲明:加在方法名前如:@Before("execution(* com.lb.test.User.*(..))")

(5)聲明通知(advice)
  a.Before advice  如:@Before("execution(* com.lb.test.User.*(..))")
  b.After advice
  c.Around advice
  d.Throwing advice

schema方式的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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<!-- <bean/> definitions here -->

    <bean id="UserDaoImp" class="com.jrgc.test.UserDaoImp" />
    <bean id="logBeforea" class="com.jrgc.test.TestAnnotationAspect" />
    <aop:aspectj-autoproxy/>
</beans>

切面、切入點聲明:

package com.jrgc.test;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class TestAnnotationAspect {
    @Pointcut("execution(* com.jrgc.test.UserDao.*(..))")
    public void pointCutMethod() {  
        System.out.println("pointcut...........");
    }
    
      
    @Before("execution(* com.jrgc.test.UserDao.*(..))")
    public void logBefore(){
        System.out.println("Annotation -> before log.......");
    }
}

 

6.Spring AOP API實現(Spring2.0之後不推薦用此方式,而推薦用XML配置或者anotation註解方式)

 (1)代理類ProxyFactoryBean
  在Spring裏建立一個AOP代理的基本方法是使用org.springframwork.aop.framwork.ProxyFactoryBean|
  這個類對應用的切入點和通知提供了完整的控制能力。
  -重要屬性:
  proxyInterface:被代理的接口;
  target:被代理的實例;
  interceptorNames:advice實例
(2)Advices
  概念:Advice實現了Aspect的真正邏輯,具體來講就是Java裏的一個類或者一個方法。
  分類:因爲切入至target的時機不一樣,Spring提供瞭如下幾種不一樣的Advices
    -Before advice:好比轉帳前檢查權限;
    -After advice:轉帳後記錄日誌;
    -Around advice
    -Throw advice
  Before advice
  -Before advice會在目標對象的方法執行以前被調用;
  -須要實現的接口是:MethodBeforeAdvice,定義以下:
    Public Interface MethodBeforeAdvice extends BeforeAdvice{
      void before(Method m,Object[] args,Object target)  throws
      Throwable;

    }
    m:被執行的方法;
    args:方法的參數列表;
    target:目標對象。

7.Spring AOP 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: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-3.1.xsd   
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd   
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd   
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 
    <!-- bean都是實例類 -->
    <bean id="logBeforeAdvice" class="com.jrgc.test.LogBeforeAdvice" />
    <bean id="logAfterAdvice" class="com.jrgc.test.LogAfterAdvice" />
    <bean id="logAroundAdvice" class="com.jrgc.test.LogAroundAdvice" />
    <bean id="logThrowAdvice" class="com.jrgc.test.LogThrowAdvice" />
    <bean id="UserDaoImp" class="com.jrgc.test.UserDaoImp">
        <property name="name" value="zhangsan" />
    </bean>
    
    <!-- execution裏的都是接口 -->
    <aop:config>
        <aop:aspect ref="logBeforeAdvice">
            <aop:pointcut expression=" execution(* com.jrgc.test.UserDao.*(..)) " id="user" />
            <aop:before method="logBefore" pointcut-ref="user" />
        </aop:aspect>
        <aop:aspect ref="logAfterAdvice">
            <aop:pointcut expression=" execution(* com.jrgc.test.UserDao.*(..)) " id="user"/>
            <aop:after method="logAfter" pointcut-ref="user"/>
        </aop:aspect>
        <aop:aspect ref="logAroundAdvice">
            <aop:pointcut expression=" execution(* com.jrgc.test.UserDao.*(..)) " id="user" />
            <aop:around method="logAround" pointcut-ref="user"/>
        </aop:aspect>
        <aop:aspect ref="logThrowAdvice">
            <aop:pointcut expression=" execution(* com.jrgc.test.UserDao.*(..)) " id="user" />
            <aop:after-throwing method="logThrow" pointcut-ref="user" />
        </aop:aspect>
    </aop:config>
</beans>

主函數:

package com.jrgc.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //採用接口類型UserDao,由於Spring裏是依賴一個接口而不是依賴一個類
        UserDao user = (UserDao) context.getBean("UserDaoImp");
        user.delete();
        
    }
}

接口:

package com.jrgc.test;

public interface UserDao {
    public void delete();
}

接口實現類:

package com.jrgc.test;

public class UserDaoImp implements UserDao{
    private String name;
    @Override
    public void delete() {
        // TODO Auto-generated method stub
        
        /**
         * 作異常測試
        String str = null;
        str.length();*/
        System.out.println("delete.......");
    }
}

beforeAdvice:

package com.jrgc.test;

public class LogBeforeAdvice {
    public void logBefore(){
        System.out.println("before log........");
    }
}

aroundAdvice:

package com.jrgc.test;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAroundAdvice {
    public void logAround(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("around before log.....");
        pjp.proceed();
        System.out.println("around after log.....");
    }
}

其它Advice省略,由於相似。

8.Spring 事務處理

(1)事務的抽象
-PlatformTransactionManager接口;
-TransactionDefinition接口;
-TransactionStatus接口.

(2)聲明式事務處理
-爲不一樣的bean配置不一樣的事務語義(AOP XML);
-使用@Transaction (AOP註解)

(3)編程式事務處理
-使用TransactionTemplate;
-使用PlatformTransactionManager.

9.Spring JDBC

  在Java的持久層方案中有JDBC和ORM兩種實現方式,Spring也提供了對持久層JDBC的封裝。


(1)JDBC核心類
JdbcTemplate類,
NamedParamterJdbcTemplate類,
DataSource接口.

(2)基本操做
執行SQL語句,execute()
執行查詢,query()
更新數據庫

(3)JDBC事務處理
聲明式,
編程式.

 

2、Hibernate

參考:
  各類操做方法:http://blog.sina.com.cn/s/blog_4586764e0100o8gg.html

Myeclipse添加Hibernite:
1.

2.生成hibernate.cfg.xml主配置文件

3.添加鏈接的數據庫信息

4.生成主Hibernate的工具類

5.將實體類的映射文件User.hbm.xml添加到主配置文件hibernate.xml裏

hibernate.cfg.xml配置文件以下:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
    <property name="dialect">
        org.hibernate.dialect.MySQLDialect
    </property>
    <property name="connection.url">
        jdbc:mysql://localhost:3306/test
    </property>
    <property name="connection.username">root</property>
    <property name="connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <property name="myeclipse.connection.profile">kaoqin</property>
    <mapping resource="com/jrgc/entity/User.hbm.xml" />

</session-factory>

</hibernate-configuration>

User.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>
    <class table="User" name="com.jrgc.entity.User">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="username"/>
        <property name="password"/>
    </class>
</hibernate-mapping>

 

3、Struts2

1.action的type屬性redirect和redirect-action的一點區別是:redirect直接跳轉,能夠正常傳遞參數,而redirect-action不能夠.

    <action name="UserAdd" class="com.jrgc.actions.UserAdd" method="userAdd">
        <result name="success" type="redirect">UserList.action?operType=${operType}</result>
    </action>

    <action name="UserAdd" class="com.jrgc.actions.UserAdd" method="userAdd">
        <result name="success" type="redirect-action">
            <param name="actionName">UserList.action</param>
        <param name="operType">${operType}</param>
        </result>
    </action>
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息