posts - 66,  comments - 11,  trackbacks - 0
          Spring提供了對Sun的標準的持久化API-JDO的整合,以及其他開放源碼的ORM框架,如Hibernate、ApacheOJB和iBATIS SQL Maps.Spring對這些技術的支持沒有像它對JDBC的支持那么廣泛。
          <?xml version="1.0" encoding="UTF-8"?>
          <beans
              
          xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
              
          <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
                  
          <property name="jndiName">
                      
          <value>java:comp/env/jdbc/trainingDatasource</value>
                  
          </property>
              
          </bean>
              
          <!-- 管理Hibernate資源,在應用的整個生命周期里,你只要保存一個SessionFactory實例就可以了。-->
              
          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                  
          <!-- 先要知道連接哪個數據源 -->
                  
          <property name="dataSource">
                      
          <ref bean="dataSource"/>
                  
          </property>
                  
          <!-- Hibernate本身有數十個屬性,通過這些屬性你就可以控制它的行為。當在Spring之外使用Hibernage的時候,
                  Hibernate在應用的class path下的某個地方尋找一個名叫hibernate.properties的文件,并用它來進行配置。
                  然而,用Spring就不需要在一個獨立的屬性文件里管理這些配置。 
          -->
                  
          <property name="hibernateProperties">
                      
          <props>
                          
          <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
                      
          </props>
                  
          </property>
                  
          <!-- 同樣,你也要告訴Spring從哪里讀取Hibernate.hbm.xml映射文件 -->
                  
          <property name="mappingResources">
                      
          <list>
                          
          <value>Student.hbm.xml</value>
                      
          </list>
                  
          </property>
                  
          <!-- 還有一種簡單的方法設置映射文件資源,你可以用你應用的class path下的一個子路徑來配置
                  mappingDirectoryLocation屬性,spring將找到這個路徑下的每個*.hbm.xml文件,來配置SessionFactory 
          -->
                  
          <property name="mappingDirectoryLocations">
                      
          <list>
                          
          <value>classpath:/com/springinaction/training/model</value>
                      
          </list>
                  
          </property>
              
          </bean>
              
          <!-- 如果把這個模版對象織入到一個個DAOBean中顯得很麻煩的時候,可以使用Spring自動連接功能來將模版對象隱士的織入到
              DAObean. 
          -->
              
          <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
                  
          <property name="sessionFactory">
                      
          <ref bean="sessionFactory"/>
                  
          </property>
              
          </bean>
              
          </beans>
          posted @ 2009-11-14 15:59 王永慶 閱讀(259) | 評論 (0)編輯 收藏

          調用存儲過程:
          Spring通過實現CallableStatementCallback來支持存儲過程。假定有個存儲過程的名字是ARCHIVE_STUDENTS,執行代碼如下:

          package com.testproject.spring.datasource;

          import java.sql.CallableStatement;
          import java.sql.SQLException;

          import org.springframework.jdbc.core.CallableStatementCallback;
          import org.springframework.jdbc.core.JdbcTemplate;
          /*
           * 為了讓JdbcTemplate工作,它所需要的,只是一個DataSource實例。
           
          */

          public class StudentDaoImpl implements StudentDao {
              
          private JdbcTemplate jdbcTemplate;
              
              
          public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
                  
          this.jdbcTemplate = jdbcTemplate;
              }

              
          /**
               * 調用存儲過程,通過CallableStatementCallback來實現
               
          */

              
          public void archiveStudentData(){
                  CallableStatementCallback cb 
          = new CallableStatementCallback(){
                      
          public Object doInCallableStatement(CallableStatement cs)throws SQLException{
                          cs.execute();
                          
          return null;
                      }

                  }
          ;
                  jdbcTemplate.execute(
          "{ARCHIVE_STUDENTS}",cb);
              }

          }


          把操作創建成對象:

          插入:

          package com.testproject.spring.datasource;

          import java.sql.Types;

          import javax.sql.DataSource;

          import org.springframework.jdbc.core.SqlParameter;
          import org.springframework.jdbc.object.SqlUpdate;
          /**
           * Spring提供了一種真正把數據庫操作建模成對象的方法,這樣就在的代碼和直接JDBC之間又加了一個絕緣層。
           * 首先,這些數據庫操作對象是線程安全的,意味著對于每個數據庫操作,你只需創建一個實例。
           * 其次,任何數據庫操作對象必須在運行前先編譯一下,這樣就讓對象知道什么時候可以預備statement,以便在稍后能執行它們。
           * 使用:
           * private InsertPerson insertPerson;
           * public int insertPerson(Person person){
           *     return insertPerson.insert(person);
           * }
           *
           
          */

          public class InsertPerson extends SqlUpdate {
              
          public InsertPerson(DataSource ds){
                  
          //首先要給sqlUpdate提供一個DataSource,用來創建JdbcTemplate
                  setDataSource(ds);
                  setSql(
          "insert into person(id,firstName,lastName) values(?,?,?)");
                  
          //其次,我們需要為statement中的每個參數調用這個方法,順序也是很重要的
                  declareParameter(new SqlParameter(Types.NUMERIC));
                  declareParameter(
          new SqlParameter(Types.VARCHAR));
                  declareParameter(
          new SqlParameter(Types.VARCHAR));
                  
          //最后編譯它,每個數據庫操作對象必須在它被使用之前編譯好。
                  compile();
              }

              
          public int insert(Person person){
                  Object[] params 
          = new Object[]{
                          person.getId(),
                          person.getFirstName(),
                          person.getLastName()
                  }
          ;
                  
          return update(params);
              }

          }

          查詢:

          package com.testproject.spring.datasource;

          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Types;

          import javax.sql.DataSource;

          import org.springframework.jdbc.core.SqlParameter;
          import org.springframework.jdbc.object.MappingSqlQuery;

          /**
           * 使用:
           * private PersonByIdQuery personByIdQuery;
           * public person getPerson(Integer id){
           *     Object[] params = new Object[]{id};
           *  return (Person)personByIdQuery.execute(params).get(0);
           * }
           *
           
          */

          public class PersonByIdQuery extends MappingSqlQuery {
              
              
          public PersonByIdQuery(DataSource ds){
                  
          super(ds,"select id,first_name,last_name from person where id=?");
                  declareParameter(
          new SqlParameter("id",Types.INTEGER));
                  compile();
              }

              
              
          protected Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
                  Person person 
          = new Person();
                  person.setId((Integer)rs.getObject(
          "id"));
                  person.setFirstName(rs.getString(
          "first_name"));
                  person.setLastName(rs.getString(
          "last_name"));
                  
          return person;
              }


          }

           

          posted @ 2009-11-14 15:21 王永慶 閱讀(280) | 評論 (0)編輯 收藏
          實現WEB服務客戶
          web服務是跨平臺的、跨語言的,所以WEB服務的客戶端使用的語言和平臺和他的服務端沒有必然的關系。比如我們可以在.Net下開發、部署web服務,然后在J2EE平臺下調用它,或者使用在J2EE平臺下開發、部署web服務,然后使用VB來調用它。
          在J2EE平臺中,WEB服務客戶同EJB客戶類似。如下兩種方式能夠訪問到WEB服務:
          1、不借助于JNDI查找,即使用單獨的JAX-RPC客戶訪問。
          2、借助于JNDI上下文訪問WEB服務的J2EE客戶
          第一種方法稱之為靜態存根,此時需要在客戶端預先生成SOAP客戶存根,這同RMI存根類似。第二種方法稱之為動態代理。它將在運行時獲得WSDL描述,然后創建動態代理。無論采用哪種方式訪問WEB服務,客戶都需要獲得服務Endpoint地址URL,否則單憑JNDI名是很難訪問到WEB服務的。
          package com.testproject.ejb.web;

          import java.net.URL;

          import javax.xml.namespace.QName;
          import javax.xml.rpc.Service;
          import javax.xml.rpc.ServiceFactory;

          /**
           * 單獨JAX-RPC客戶代碼實例。
           * 它使用了動態代理方法,以獲得對遠程WEB服務的引用。
           *
           
          */

          public class HelloClient {
              
          static String host = "localhost";
              
          //web服務的名字
              static String serviceURL = "HelloBean";
              
          //名稱空間
              static String nameSpaceUri = "urn:examples";
              
          static String serviceName = "HelloWorldWS";
              
          //web服務調用的地址
              static String serviceEndpointAddress = "http://"+host+":8000"+serviceURL;
              
          public static void main(String[] args)throws Exception{
                  HelloInterface hello 
          = null;
                  
          //動態代理方法
                  
          //1、指定WSDL文件的位置
                  URL url = new URL(serviceEndpointAddress+"?WSDL");
                  
          //2、創建服務工廠實例
                  ServiceFactory serviceFactory = ServiceFactory.newInstance();
                  
          //3、創建服務對象,以作為代理工廠
                  Service HelloService = serviceFactory.createService(url,new QName(nameSpaceUri,serviceName));
                  
          //4、獲得port引用
                  hello = (HelloInterface)HelloService.getPort(HelloInterface.class);
                  
          //調用hello()方法
                  System.out.println("Dynamic Proxy:"+hello.hello());
              }

          }

          posted @ 2009-11-13 16:45 王永慶 閱讀(139) | 評論 (0)編輯 收藏
          EJB2.1和web服務
          1、下載安裝服務器后,需要設置環境變量。
          Set J2EE_HOME=J2EE安裝目錄
          Set CLASSPATH 
          =%CLASSPATH%;%J2EE_HOME%\\lib\\j2ee.jar;.
          Set Path =%Path%;%J2EE_HOME%\\bin;.

          2、創建初始目錄
          +HelloBeanService
              +META-INF(application.xml;sun-j2ee-ri.xml )
              +ejb
                 +META-INF(ejb-jar.xml; webservices.xml;mapping.xml)
                 -*.java文件(EJB相關的類)
                 -config.xml
          3、定義web服務接口
          package com.testproject.ejb.web;

          /*
           * Hello服務Endpoint接口
           * 需要注意的是,這里使用的是EJB2.1無狀態會話Bean,它作為WEB服務端點時可以不提供Home接口和Remote
           * Locale接口,它提供的是web服務端點接口,這個接口擴展了Remote接口。
           
          */

          public interface HelloInterface extends java.rmi.Remote {
              
          public String hello()throws java.rmi.RemoteException;
          }


          4、實現服務端點接口
          package com.testproject.ejb.web;

          import java.rmi.RemoteException;

          import javax.ejb.EJBException;
          import javax.ejb.SessionBean;
          import javax.ejb.SessionContext;

          /*
           * 定義了服務端點接口,接下來的任務就是開發無狀態會話Bean。無狀態會話Bean同樣需要實現SessionBean接口,
           * 服務端點接口定義的方法在會話Bean中實現。
           
          */

          public class HelloBean implements SessionBean {
              
              
          public void ejbCreate(){
                  
          /*
                   * 這里不能接收任何參數
                   
          */

              }


              
          public void ejbActivate() throws EJBException, RemoteException {
              }


              
          public void ejbPassivate() throws EJBException, RemoteException {
              }


              
          public void ejbRemove() throws EJBException, RemoteException {
              }


              
          public void setSessionContext(SessionContext arg0) throws EJBException,
                      RemoteException 
          {
              }

              
          /*
               * 業務方法:輸出hello
               
          */

              
          public String hello(){
                  
          return "Hello wyq";
              }


          }


          5、創建EJB描述
          用于部署成Web服務的無狀態會話Bean的描述符和普通的無狀態會話Bean不同ejb-jar.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <ejb-jar version="2.1"
          xmlns
          ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
              
          <display-name>HelloBean</display-name>
              
          <enterprise-beans>
                  
          <session>
                      
          <display-name>HelloBean</display-name>
                      
          <ejb-name>HelloBean</ejb-name>
                      
          <service-endpoint>com.testproject.ejb.web.HelloInterface</service-endpoint>
                      
          <ejb-class>com.testproject.ejb.web.HelloBean</ejb-class>
                      
          <session-type>Stateless</session-type>
                      
          <transaction-type>Container</transaction-type>
                  
          </session>
              
          </enterprise-beans>
          </ejb-jar>

          在這個新的部署描述符中,使用<service-endpoint>指定了服務端點,同時,必須指定EJB為無狀態會話Bean
          6、生成WEB服務描述

          下面的任務就是生成一個Web服務描述,我們通常使用工具來生成這個描述符。在這里使用J2EE提供的wscompile工具來生成。在使用wscompile工具生成web服務描述前,首先手工編寫一個簡單的XML描述config.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
              
          <service 
                  
          name="MyHelloBeanService" 
                  targetNamespace
          ="urn:HelloBean" 
                  typeNamespace
          ="urn:HelloBean"
                  packageName
          ="helloBeanService">
                  
          <interface name="com.testproject.ejb.web.HelloInterface"/>
              
          </service>
          </configuration>

          在這個描述中,指定了目標的名稱空間、包的名字和Web服務端點接口:HelloInterface。如下命令就可以生成一個web服務描述

          c:\\ HelloBeanService\\ejb \\>wscompile -define -d . -nd . -classpath . config.xml
          自動生成MyHelloBeanService.wsdl文件。
          7、編寫一個web服務映射文件:
          在ejb\\META-INF目錄下新建一個mapping.xml文件,然后編輯這個描述符
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE java-wsdl-mapping PUBLIC
              "-//IBM Corporation,Inc.//DTD J2EE JAX-RPC mapping 1.0//EN"
              "http://www.ibm.com/standards/xml/webservices/j2ee/j2ee_jaxrpc_mapping_1_0.dtd"
          >
          <java-wsdl-mapping>
              
          <package-mapping>
                  
          <package-type>HelloBeanService</package-type>
                  
          <namespaceURI>urn:HelloBean</namespaceURI>
              
          </package-mapping>
          </java-wsdl-mapping>
          8、編寫webservices.xml文件
          另外,還需要提供webservices.xml文件,并存放到Ejb-jar存檔的META-INF目錄中。各個J2EE產品可能提供相應的部署工具來創建這個文件。
          9、EJB打包
          另外,web服務部署描述符在EJB-JAR文件中的位置是META-INF/webservices.xml.把生成的HelloBeanService.wsdl拷貝到ejb\\META-INF目錄下
          c:\\HelloBeanService\\ejb\\jar cvf ejb.jar com META-INF
          10、Application打包
          HelloBeanService\\MEAT-INF目錄下創建2個文件:application.xml和sun-j2ee-ri.xml
          application.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE application PUBLIC '-//Sun Microsystems,
              Inc.//DTD J2EE Application 1.3//EN'
              'http://java.sun.com/dtd/application_1_3.dtd'
          >
          <application>
              
          <description>Application description</description>
              
          <display-name>HelloBeanServiceApp</display-name>
              
          <module>
                  
          <ejb>ejb.jar</ejb>
              
          </module>
          </application>

          最后歸檔
          c:\\ HelloBeanService\\ejb\\>copy ejb.jar ../
          c:\\ HelloBeanService\\ejb\\>cd..
          c:\\ HelloBeanService\\\\>jar cvf encryptservice.ear ejb.jar META-INF

           


           

          posted @ 2009-11-13 16:13 王永慶 閱讀(161) | 評論 (0)編輯 收藏
               摘要:     Spring的一個目標就是讓你遵循對接口編程的面向對象原則。DAO的存在提供了讀寫數據庫中數據的一種方 法。只要把這個功能通過接口暴露,應用的其他部分就可以通過這些接口訪問數據庫了。     在Spring的DAO框架里,Connection對象是通過DataSource獲得的。     從JN...  閱讀全文
          posted @ 2009-11-12 19:46 王永慶 閱讀(189) | 評論 (0)編輯 收藏
              這次的辭職和以往有些不同,以前的辭職都是懷著迫不及待的心情,而且離職之后心情特別舒暢。但是這次辭職之后總是感覺心里空蕩蕩的。由于從金錢、從發展、從技術、還有從管理的經驗上,我都覺得這里沒有我發展的空間,感覺自己有能力帶出一個出色的團隊,所以離職是必須的。但是這種空蕩的源頭我還沒有找到,是想念以前的那些好兄弟、好姐妹。還是想念那個不知道我在想什么的她。
              感覺自己心里的牽掛太多,不是說她。自己做了10多個場景,有復雜有簡單的,離開公司之后,還想著那些接我的人能不能把我的場景接好。就在昨天晚上,還有個新來的小伙問了我些問題,看來接手的不是太順利。沒有辦法,公司的開發模式就是這樣,有利有弊,接手的人只要能干活就可以了,不需要你思考。我討厭這種模式,而且他也沒有重要的對待我。只有離開是我的選擇。擔心我們的團隊,擔心我的主管,擔心我的隊友。現在團隊非常混亂,有很多人提出離職,他們太盲目了,沒有目的性,就像我和我好朋友說的,我是謀定而后動,他則是先動而后謀,他的下分工作目標可能是工作輕松點,錢拿的多點,我們公司確實太累了。而我的目標就是項目經理,在這個公司的期間,我每次看到團隊遇到困難的時候,我都能看到事情的本質,所以看問題還是很準的,自己也想去嘗試一下。
               你的羽翼已經豐滿了,就是缺少在藍天下翱翔的經驗,自己慢慢積累吧,在這個項目里我不能在給你什么了,我剩下的只有自己的經驗和技術,自己的經驗屬于自己的。前幾天還在哭鼻子的你,堅強點吧,你已經長大了,遇到問題想辦法去解決它,不要去回避。不知道你想不想在這個程序的世界里自由翱翔,不知道你的心有沒有那么大,我看到的你是不屬于程序的這片天空的,所以還在擔心走在這條路上的你。多余了,因為飛在路上的你根本就沒想到你在成長路上的我。
              希望你們一切都好,我的大家,我也會在自己的道路上努力,我相信我自己,我也相信我們的友誼。
          posted @ 2009-11-11 11:35 王永慶 閱讀(191) | 評論 (0)編輯 收藏
          年終獎"除12"稅收優惠

          按照《國家稅務總局關于調整個人取得全年一次性獎金等計算征收個人所得稅方法問題的通知》規定,對個人某個月取得的全年一次性獎金,可以先除以12個月,再按其商數確定適用稅率和速算扣除數。

          具 體的解釋是,行政機關、企事業單位向其雇員發放的一次性獎金(包括:年終加薪、實行年薪制和績效工資辦法的單位,根據考核情況兌現的年薪和績效工資)可單 獨作為一個月工資、薪金所得計算納稅,并按以下計稅辦法:先將雇員當月內取得的全年一次性獎金,除以12個月,按其商數確定適用稅率和速算扣除數。如果雇 員當月工資薪金所得高于(或等于)稅法規定的費用扣除額(個稅起征點)的,則將一次性獎金全額作為應稅所得額,計算應納稅額。適用公式為:應納稅額=雇員 當月取得全年一次性獎金×商數對應的適用稅率-速算扣除數。

          而在這個規定之前,個人所取得的年終獎金是全額作為應納稅所得額來尋找適用稅率及速算扣除數的。具體公式為:應納稅額=雇員當月取得的全年一次性獎金*獎金全額對應的適用稅率-對應的速算扣除數。

          可別小看這"12",如此這般將年終獎先除以12,所得稅率可就大大降低了,能為員工減輕不少稅負呢。

          比 如,某私營企業主王老板要給自己的得力干將張先生準備年終獎。年終獎為12000元,按原有規定,12000元作為單月收入,對應的適用稅率為20%,速 算扣除數為375元,則張先生這筆年終獎應納個人所得稅款為2025元(12000×20%-375)。但若按新辦法,張先生12000元年終獎先除以 12,得到商數為1000元,1000元對應的適用稅率為10%,速算扣除數為25。因此,新辦法下,張先生只需交納個人所得稅1175元 (12000×10%-25)。也就是說,如果采用新辦法,張先生可少交850元的個人所得稅。換而言之,張先生實際拿到手的稅后年終獎可以多850元。

          月薪較低者還有"特別"優惠

          對于日常每月工資較低的個人,年終獎還會有另一層稅收優惠。為此,平常對員工比較"摳門"的老板,可要發發善心,在過年前給員工多些獎金哦。

          按 照前述國家稅務總局的《通知》規定,如果在發放一次性獎金的當月,雇員工資薪金所得低于稅法規定的費用扣除額(即個稅起征點,2006年1月1日后全國統 一為1600元),應將全年一次性獎金減去"雇員當月工資薪金所得與費用扣除額的差額"后的余額作為應納稅額,再按前述辦法確定全年一次性獎金的適用稅率 和速算扣除數。

          具體如下:如果雇員當月工資薪金所得低于稅法規定的費用扣除額的,適用公式為:應納稅額=(雇員當月取得全年一次性獎金-雇員當月工資薪金所得與費用扣除額的差額)×適用稅率-速算扣除數。

          比 如,王老板手下有個普通工人蔣某,雖然月薪只有1200元,但平常工作非常賣力,尤其最近大半年來表現特別突出,長進很快。新年到了,王老板準備在年輕工 人中間樹立一個學習典型,蔣某正是一個不錯的選擇。那么,王老板完全可以通過給蔣某多發放一些年終獎,并拉開蔣某所獲年終獎與其他同級工人年終獎所得距離 的方式,暗示大家公司是"獎優懲劣"的,由此激勵年輕人要奮發圖強,多為企業做績效。若王老板此次給蔣某發放6000元的年終獎,按照原來的老辦 法,6000元獎金對應的所得稅率為20%,速算扣除數為375元,蔣某需要被繳納的個人所得稅額為825元(6000×20%-375),實際拿到手的 稅后獎金為5175元。

          而按照新辦法,則蔣某這筆年終獎可以先除以12,得到商數為500,對應的所得稅率為5%,速算扣除數為0。 同時,由于蔣某當月的工資收入只有1200元,比國家規定的1600元費用扣除額還低400元,因此蔣某這筆年終獎實際的應納稅額為5600元 (6000-400),其應該被繳納的個人所得稅額為108元(5400×5%-0),實際拿到手的稅后獎金有5892元。

          分次獎金不如歸總發放

          但是,老板們還必須明確一個概念,國家稅務總局對于年終獎這樣一次性發放的獎金稅收優惠政策,每個員工每年只能享受一次。

          因為前述《通知》規定,在一個納稅年度里,對每一個納稅人,該計算辦法只允許采用一次。同時,雇員取得除全年一次性獎金以外的其他各種名目獎金,如半年獎、季度獎、加班獎、先進獎、考勤獎等,仍舊是一律與當月工資、薪金合并,按稅法規定繳納個人所得稅。

          正 是基于這一點,我們在此提出一個發放獎金的竅門,就是如果老板們想為員工盡量減輕稅負,應盡量減少季度獎、半年獎等名目繁多的獎金發放次數,而是把這些本 欲發放的獎金先在平時"記賬",然后和年終獎一起,一次性發給員工。這樣一來,員工全年得到的稅后獎金收入,并不會減少,反而會增加。

          比 如,作為王老板得力助手的張先生,除了12000元的年終獎,王老板每個季度還會發2000元的季度獎金給他。由于張先生的月工資為6000元,平常每月 的應納稅所得額6000-1600=4400元,對應的適用稅率為15%,速算扣除數為125元,應納稅額為535元。但每次發放季度獎時,都必須與其當 月的工資收入合并繳稅,所以每次發放季度獎的那個月,也是他最不愿意看到工資明細單的那個月--那個月的所得稅率和所得稅額令他非常"郁悶"。在那些月份 里,他的當月所得總額為8000元,減去1600元的起征點(費用扣除額),應納稅所得額為6400元,對應的適用稅率為20%,對應的速算扣除數為 375元,應納稅額為905元。所以說,2000元的季度獎為他當月增加了370元(905-535)的稅收負擔。一年四個季度,四次季度獎一共繳稅 1480元。加上12000元的單次年終獎所得稅為1175元,那么張先生需要全年總共2萬元的獎金繳納所得稅2655元。

          如果王老板平時不給張先生分次發季度獎,而是將總共8000元的季度獎與12000元的年終獎一起放在元月發放,那么張先生的年度獎金一共需要繳稅1975元(20000×10%-25)。

          顯然,對于張先生而言,一般來說是更樂意接受老板一次性給他發放年終獎2萬元,而不是將2萬元拆開為季度獎和年終獎分次發放,因為這樣可以減少680元的稅金負擔。

          我國個人所得稅稅率表(工資、薪金所得適用)

          級數 全月應納稅所得額 稅率(%) 速算扣除數(元)
          1 不超過500元的 5 0
          2 超過500元至2000元的部分(含2000元) 10 25
          3 超過2000元至5000元的部分(含5000元) 15 125
          4 超過5000元至20000元的部分(含20000元) 20 375
          5 超過20000元至40000元的部分(含40000元) 25 1375
          6 超過40000元至60000元的部分(含60000元) 30 3375
          7 超過60000元至80000元的部分(含80000元) 35 6375
          8 超過80000元至100000元的部分(含100000元) 40 10375
          9 超過100000元的部分 45 15375


          注:正常月份下,工資,月應納稅所得額= 月工資、薪金所得-1600元;月應納稅額= 月應納稅所得額×適用稅率-速算扣除數
          posted @ 2009-11-09 10:57 王永慶 閱讀(1020) | 評論 (0)編輯 收藏
              Web服務是構建B2B應用最為重要的利器之一,使用它能夠構建、集成大型的系統。這一切都是通過發送XML消息給已定義的模塊化接口完成的。借助于無狀態會話Bean能夠構建Web服務。為實現Java客戶對Web服務的訪問,需要使用到JAX-RPC.Web服務是構建SOA的一種方式。SOA是架構方法,它能夠將各種異構應用集成起來,并組成更大的分布式應用,最后通過服務接口的形式將整個應用支撐起來。
              服務提供者創建抽象服務定義,并將它發布到服務注冊器中。對于WEB服務而言,服務定義是通過WSDL文件給出的;服務注冊器需要遵循UDDI標準。服務請求者可以使用一套查詢機制從服務注冊器中查找到WSDL文件,如果找到合適的服務定義,請求者將綁定到服務提供者上。
              服務接口類似于對象或EJB接口。但是對于WEB服務而言,服務接口更為靈活。比如服務實現和客戶處于松耦合的關系,而這在其他EJB應用或分布式應用中是實現不了的。這種松耦合使得客戶和服務實現能夠運行在不同平臺上,比如Microsoft.NET客戶能夠訪問到J2EE應用服務器中所運行的服務。另外,相比Java對象而言,Web服務實體的粒度更粗。
              通過標準化接口,能夠加強SOA的模塊化;通過松耦合,能夠提高SOA的靈活性;通過XML,能夠增強SOA擴展性。在B2B場合,這些都是很重要的因素。WEB服務能夠在那些使用了多種異構平臺的企業應用中大顯身手。所有的WEB服務都是構建在XML和Internet協議上的。EJB只能夠采用Java開發。如果使用其他語言開發應用,互操作如何實現?
              組成WEB服務的事實標準可以通過如下等式表達:
              Web服務 = WSDL+SOAP+UDDI

          1、WSDL語言比Java更抽象、廣度更大。HelloWorldWSDL中存在<service>標簽,它能夠在具體地址提供若干<port>.<port>代表了服務接口及對具體協議的綁定。
          2、服務描述包含了Endpoint地址。WSDL是由Java接口和對象引用構成的。換句話說,Web服務不存在真正的實體,它們不是對象,因此必須將它們按照模塊化對待。
          3、根據輸入、輸出定義操作。開發者需要將輸入、輸出消息表示為XML元素。
          4、采用的綁定是SOAP綁定。到目前為止,只能采用SOAP綁定。也請注意,<soap:binding>標簽還存在style="rpc"屬性,因此可以看出style還存在其他取值,目前,用于交換SOAP消息的另一種風格是文檔風格(document-style)。文檔風格意味著在SOAP消息體中不在包含對具體操作的描述。

              SOAP協議為Web服務和它們的客戶定義了XML消息格式。SOAP消息格式非常簡單。它實際包含兩部分內容:其一,HTTP POST請求頭信息。其二,XML文檔,這就是SOAP信封(Envelope)。另外,通過上述兩分SOAP消息,我們還想表達Web服務中的另一個重要概念。從SOAP協議的使用過程來看,它非常輕量,因為它對處于交互中的客戶和服務沒有任何限制。但是,從SOAP協議的大小、性能角度考慮,它并不輕量。如果不壓縮SOAP消息,則需要在網絡上傳遞大量的SOAP數據消息。因此,采用二進制更為明智,比如CORAB的IIOP協議。對于含有大量的SOAP數據消息進行壓包和解包操作將耗費大量的CPU時間。請不要忘記,WEB服務的誕生背景,它只是為集成應用而來的,而不是替換現有的高性能中間件平臺技術。否則,就不需要使用web服務了。

              XML文檔和平臺無關性,借助于標準化的XML文檔,WEB服務能夠幫助集成異構的分布式系統。在實際應用開發過程中,它具有許多優勢,比如松耦合、平臺無關性、遵循XML方面的標準、能夠合并不同的XML技術等。借助于XML能夠實現應用和中間件平臺的松耦合,這是很重要的優勢。
              比如在開發EJB組件時,客戶和服務器端同事需要使用組件接口。一旦組件接口發生變動,比如需要往方法簽名中新增參數,則EJB組件本身需要重新構建、集成、部署。當然,客戶也逃脫不了重新編譯的命運。因此,它們之間并沒有實現松耦合,開發者不能獨立的開發應用組件。否則,一旦某些組件發生變動,應用的其他部分也需要變動。我們都希望應用具有良好的擴展性。對基于IIOP的請求消息而言,所有的參與者必須使用相同的類型信息,否則不能夠正確對消息進行解包操作。而且,在IIOP技術領域中,應用必須能夠理解消息的所有內容。如果基于XML和XML消息開發應用,則這些限制將不復存在。
             
              J2EE平臺技術對WEB服務提供了一流的支持能力。無論WEB服務實現,還是WEB服務客戶,都可以使用JAVA語言開發完成。在J2EE中,使用WEB服務同RMI、RMI-IIOP并沒有多大區別。他們都將具體傳輸層屏蔽掉,使得開發者能夠專注于業務邏輯。
              JSR921規范,即實現企業WEB服務,定義了WEB服務編程模型。它使用術語port組件,描述web服務的服務器端視圖。它是服務接口的java實現。而且,它遵循服務接口到Java的映射,并提供了相應的Java實現。需要將它部署并運行在容器中。使用EJB開發WEB服務需要創建若干port組件。其中,還需要提供若干XML部署描述符。當然,直接基于EJB實現WEB服務是J2EE平臺中實現WEB服務的最大優勢。

              JAX-RPC服務端點接口,現在,來開發另一遠程接口,它將企業Bean所提供的業務方法都列舉出來,我們稱之為服務Endpoint接口(Service Endpoint Interface,SEI),下面給出了代碼。
             

          package com.testproject.ejb.web;

          /*
           * Hello服務Endpoint接口
           * 需要注意的是,這里使用的是EJB2.1無狀態會話Bean,它作為WEB服務端點時可以不提供Home接口和Remote
           * Locale接口,它提供的是web服務端點接口,這個接口擴展了Remote接口。
           
          */

          public interface HelloInterface extends java.rmi.Remote {
              
          public String hello()throws java.rmi.RemoteException;
          }

           

              JAX-RPC要求WEB服務提供SEI,EJB容器同WEB服務交互時需要使用它。JAX-RPC規范要求SEI遵循如下規則:
          1、接口必須間接或直接繼承java.rmi.Remote.
          2、所有的方法必須拋出java.rmi.RemoteException.
          3、方法參數和返回類型必須是JAX-RPC支持的JAVA類型。
          4、SEI中不能包含敞亮。

              在J2EE1.4平臺中,可以對EJB技術進行了升級,使得無狀態會話Bean可以直接部署為Web服務端點。這樣,在J2ee1.4平臺下,開發Web服務將更加簡單。這樣,EJB2.1中的無狀態會話Bean可以有3種不同的客戶端:本地接口的客戶端、遠程接口的客戶端和web服務客戶端。EJB的WEB服務客戶端視圖通過WSDL文檔描述。
              待續......

           


           


              

             
          posted @ 2009-11-09 10:22 王永慶 閱讀(175) | 評論 (0)編輯 收藏
          當我們有很多類需要通知時,顯示的創建每個代理就會顯得很笨拙。幸運的是,Spring有一個自動代理機制,它可以讓容器為我們產生代理。Spring有2個類提供這種服務:BeanNameAutoProxyCreate和DefaultAdvisorAutoProxyCreator.

          BeanNameAutoProxyCreate:為匹配一系列名字的Bean自動創建代理。它也允許在名字的2端進行通配符的匹配。
          <?xml version="1.0" encoding="UTF-8"?>
          <beans
              
          xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
              
          <bean id="performanceThresholdInterceptor" class="com.wyq.spring.common.aopinstance.autoproxy.PerformanceThresholdInterceptor">
                  
          <constructor-arg>
                      
          <value>5000</value>
                  
          </constructor-arg>
              
          </bean>
              
          <!-- 
                  如果Bean是一個Advisor或攔截器,它將應用到代理對象的所有方法上。如果是通知的話,Advisor切入點
                  會根據不同Bean將通知應用到不同的地方。
               
          -->
              
          <bean id="performanceThresholdProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
                  
          <property name="beanNames">
                      
          <list>
                          
          <value>*Service</value>
                      
          </list>
                  
          </property>
                  
          <property name="interceptorNames">
                      
          <value>performanceThresholdInterceptor</value>
                  
          </property>
              
          </bean>
          </beans>
          更強大的自動代理創建器是DefaultAdvisorAutoProxyCreator.當ApplicationContext讀入所有Bean的配置信息后,DefaultAdvisorAutoProxyCreator將掃描上下文,尋找所有的Advisor.它將這些Advisor應用到所有符合Advisor切入點的Bean中。
          <?xml version="1.0" encoding="UTF-8"?>
          <beans
              
          xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
              
          <bean id="performanceThresholdInterceptor" class="com.wyq.spring.common.aopinstance.autoproxy.PerformanceThresholdInterceptor">
                  
          <constructor-arg>
                      
          <value>5000</value>
                  
          </constructor-arg>
              
          </bean>
              
          <!-- 
                  一個Advisor是一個切入點和一個通知的結合體。不用顯示的將Advisor與其他東西結合,現在只要簡單的定義他們,然后讓他們自動
                  應用到他們匹配的地方。這樣松耦合Bean以及他們的通知就實現了。你只管寫好你的Bean,寫好你的通知,讓容器來充當媒婆。
               
          -->
              
          <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
                  
          <property name="advice">
                      
          <bean class="com.wyq.spring.common.aopinstance.autoproxy.PerformanceThresholdInterceptor"></bean>
                  
          </property>
                  
          <property name="pattern">
                      
          <value>.+Service\..+</value>
                  
          </property>
              
          </bean>
              
          <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
              
          </bean>
          </beans>

          posted @ 2009-11-06 16:00 王永慶 閱讀(261) | 評論 (0)編輯 收藏
          引入與其他類型的通知不同,引入影響的是整個類。他們通過給需要消息的類添加方法和屬性來實現。引入讓你能夠動態地建立復合對象,提供了多態繼承的好處。
          Spring通過一個特殊的方法攔截器接口IntroductionMethodInterceptor來實現引入。這個接口添加一個方法:
          boolean implementsInterface(Class intf);
          如果IntroductionMethodInterceptor是為了實現指定接口,那么方法implementsInterface應該返回true.就是說,調用這個接口聲明的方法的任何調用將被委派給IntroductionMethodInterceptor的invoke()方法.invoke()方法負責實現這個方法,不能調用MethodInvocation.proceed().他引入了新的接口,調用目標對象是沒有用的。

          Spring提供了一個方便的類來處理我們的大多數應用:DelegatingintroductionInterceptor.代碼:
          package com.wyq.spring.base.aopinstance;

          import java.util.Date;

          /** 
           * 
          @author 作者 
           * 
          @version 創建時間:2009-11-6 下午02:58:21 
           * 類說明 
           
          */
          public interface Auditable {
              
          void setLastModifiedDate(Date date);
              Date getLastModifiedDate();
          }

          package com.wyq.spring.base.aopinstance;

          import java.util.Date;

          import org.springframework.aop.support.DelegatingIntroductionInterceptor;

          /** 
           * 
          @author 作者 
           * 
          @version 創建時間:2009-11-6 下午03:00:06 
           * 類說明 
           
          */
          public class AuditableMixin extends DelegatingIntroductionInterceptor implements
                  Auditable {
              
          private Date lastModifiedDate;
              
          /*
               * 注意我們不用實現invoke()方法了,DelegatingIntroductionInterceptor為我們實現了這
               * 個方法。DelegatingIntroductionInterceptor也要實現你的混合類暴露的任何方法,并且將
               * 任何對這些方法的調用委托給這個混合類。因為我們的類實現了Auditable,對這個接口的方法的
               * 所有調用都將調用我們的攔截器。任何其他方法將委托給目標對象。
               
          */
              
          public Date getLastModifiedDate() {
                  
          return lastModifiedDate;
              }

              
          public void setLastModifiedDate(Date lastModifiedDate) {
                  
          this.lastModifiedDate = lastModifiedDate;
              }

          }

          創建一個引入Advisor:
          因為引入通知只應用在類層次上,所以引入有他們自己的Advisor:IntroductionAdvisor.Spring也提供了一個適合大多數情況的缺省實現。它的名字叫做DefaultIntroductionAdvisor.
          BeanFactory對象是一個負責創建其他JavaBean的JavaBean.我們的ProxyFactoryBean創建代理對象。和其他JavaBean一樣,它有控制行為的屬性。
          <?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="courseTarget" class="com.springinaction.training.model.Course"></bean>
              
          <!-- 創建一個引入 -->
              
          <bean id="auditableMixin" class="com.springinaction.training.advice.AuditableMixin"></bean>
              
          <!-- 創建一個引入通知 -->
              
          <bean id="auditableAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">
                  
          <constructor-arg>
                      
          <ref bean="auditableMixin"/>
                  
          </constructor-arg>
              
          </bean>
              
          <!-- 創建一個代理
                  
          ProxyFactoryBean的屬性
                   target:代理的目標對象
                   proxyinterfaces:代理應該實現的接口列表
                   interceptorNames:需要應用到目標對象上的通知Bean的名字,可以是攔截器、Advisor或者其他通知類型的名字。
                   singleton:在每次抵用getBean時,工廠是否返回的是同一個代理實例。如果是有狀態通知,應該設置為false.
                   aopProxyFactory:通常不需要使用這個屬性。
                   ProxyTargetClass:是否代理目標類,而不是接口類。
                -->
              
          <bean id="course" class="org.springframework.aop.framework.ProxyFactoryBean">
                  
          <property name="proxyTargetClass">
                      
          <value>true</value>
                  
          </property>
                  
          <property name="singleton">
                      
          <value>false</value>
                  
          </property>
                  
          <property name="proxyInterfaces">
                      
          <value>com.springinaction.training.advice.Auditable</value>
                  
          </property>
                  
          <property name="interceptorNames">
                      
          <ref bean="auditableAdvisor"/>
                  
          </property>
                  
          <property name="target">
                      
          <ref bean="courseTarget"/>
                  
          </property>
              
          </bean>
          </beans>

          posted @ 2009-11-06 15:35 王永慶 閱讀(169) | 評論 (0)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 通海县| 新兴县| 鸡泽县| 曲松县| 兴业县| 波密县| 调兵山市| 丰顺县| 大竹县| 平凉市| 离岛区| 宁武县| 双江| 荣昌县| 团风县| 宝清县| 繁峙县| 同仁县| 武冈市| 利川市| 红桥区| 嘉黎县| 青州市| 清涧县| 中牟县| 清原| 孟津县| 资中县| 西乌| 鄂托克旗| 虎林市| 东乡县| 年辖:市辖区| 中方县| 临沧市| 射洪县| 平南县| 宜都市| 大冶市| 诸暨市| 康平县|