千山鳥飛絕 萬徑人蹤滅
          勤練內功,不斷實踐招數。爭取早日成為武林高手

          轉載:http://www.host01.com/article/Wap/wap001/05922162843330.htm

          JSP下獲取手機號碼

          //取手機號
          String mobile = "" ;
          String MO="";
          String temvit = "";
          String version = "";

          Enumeration headerNames = request.getHeaderNames();
          while(headerNames.hasMoreElements()) {
          String headerName = (String)headerNames.nextElement();
          if (headerName.equals("x-up-calling-line-id")) {
          temvit=request.getHeader(headerName);
          if (temvit.substring(0,3).trim().equals("861")) {
          mobile=temvit.substring(2,13);
          }
          if (temvit.substring(0,2).trim().equals("13")) {
          mobile=temvit;
          }
          }

          if (headerName.equals("user-agent")) {
          <--ubbcodetab--> <--/ubbcodetab-->MO=request.getHeader(headerName);
          }

          if (headerName.equals("x-up-calling-line-id")) {
          temvit=request.getHeader(headerName);
          if (temvit.substring(0,2).trim().equals("13")) {
          mobile=temvit;
          }
          }
          }
          posted @ 2009-09-17 20:15 笑口常開、財源滾滾來! 閱讀(1312) | 評論 (2)編輯 收藏
           
          轉載:
          http://hi.baidu.com/yashengwh/blog/item/27130edf7ec447156327980b.html


          手機號碼:Request.ServerVariables("HTTP_X_UP_CALLING_LINE_ID")
          手機型號:request.ServerVariables("HTTP_User-Agent")

          補充:
          手機號碼,要看當地的運營商了
          有三種方法獲得(聯通的)
          1.加密的手機號碼:被加密的手機號碼,與手機號碼一一對應。
          中國聯通WAP平臺向CP Server(主域或IP地址)傳送加密手機號碼,CP Server獲取該加密手機號碼的方法為:在每次用戶發送的請求http header中取“deviceid”。
          2.公開的手機號碼:中國聯通WAP平臺向CP Server(主域或IP地址)傳送公開的手機號碼,CP Server獲取該公開手機號碼的方法為:在每次用戶發送的請求http header中取“x-up-calling-line-id”。
          以上要和聯通進行申請

          3、你可以試這樣的方法獲得手機號碼: Mobile = request.ServerVariables("HTTP_X_UP_subno")
          Mobile =mid(FromMobile,3,11) ??
          asp?lp=27&id=1782582>http://www.blueidea.com/bbs/NewsDetail.asp?lp=27&id=1782582
          聲明:第三種方法不保險

          頭文件參考:
          答7:
          POST /default.asp HTTP/1.0
          Host: 211.94.121.3:81
          content-type: text/plain
          accept-language: zh
          accept-charset: ISO-8859-1, UTF-8; Q=0.8, ISO-10646-UCS-2; Q=0.6
          profile:
          http://nds.nokia.com/uaprof/N7210r100.xml
          user-agent: Nokia7210/1.0 (3.09) Profile/MIDP-1.0 Configuration/CLDC-1.0
          x-wap.tod-coded: Thu, 01 Jan 1970 00:00:00 GMT
          accept: */*
          content-length: 1
          Cookie: ASPSESSIONIDGGGQGAPU=KFHHMHPCHJFPKPEPBEDFHCJL
          via: WTP/1.1 wapgw2 (Nokia WAP Gateway 3.1/CD1/3.1.43), HTTP/1.1 httpproxy2[0A0000C3] (Traffic-Server/4.0.9 [uSc ])
          X-Network-info: GPRS,10.15.96.127,13810027XXX,211.139.172.70,unsecured
          X-Forwarded-For: 10.15.96.127
          X-Up-Calling-Line-ID: 13810027XXX
          X-Source-ID: 211.139.172.70
          X-Nokia-CONNECTION_MODE: CLESS
          X-Nokia-BEARER: GPRS
          X-Nokia-gateway-id: NAWG/3.1/Build43
          Client-ip: 192.168.0.6
          Connection: keep-alive

          posted @ 2009-09-17 19:51 笑口常開、財源滾滾來! 閱讀(1628) | 評論 (0)編輯 收藏
           

          package cn.itcast.bean;

          public class Person {

           private Integer id;
           private String name;
           
           public Person(){
            
           }
           
           public Person(String name) {
            this.name=name;
           }
           
             getter&&setter方法 
          }


          Person.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 package="cn.itcast.bean">
           <class name="Person" table="person">
           
            <id name="id" type="integer">
             <generator class="native"></generator>
            </id>
            <property name="name" length="10" not-null="true">
            </property>
           </class>

          </hibernate-mapping>

          定義業務接口

          package cn.itcast.service;

          import java.util.List;

          import cn.itcast.bean.Person;

          public interface IPersonService {

           /**
            * 保存人員信息
            * @param person
            */
           public abstract void save(Person person);

           /**
            * 更新信息
            * @param person
            */
           public abstract void update(Person person);

           /**
            * 獲取人員
            * @param personId
            * @return
            */
           public abstract Person getPerson(Integer personId);

           /**
            * 刪除人員信息
            * @param personId
            */
           public abstract void delete(Integer personId);

           /**
            * 獲取人員列表
            * @return
            */
           public abstract List<Person> getPersons();

          }


          業務實現類

          package cn.itcast.service.impl;

          import java.util.List;

          import javax.annotation.Resource;

          import org.hibernate.SessionFactory;
          import org.springframework.transaction.annotation.Propagation;
          import org.springframework.transaction.annotation.Transactional;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;

          /**
           * 業務層,采用注解聲明事務
           *
           * @author Administrator
           *
           */
          @Transactional
          public class PersonServiceBean implements IPersonService {

           @Resource
           private SessionFactory sessionFactory;

           public void save(Person person) {

            // 從spring 容器中得到正在管理的sessionFactory,persist方法用于保存實體

            sessionFactory.getCurrentSession().persist(person);

           }

           public void update(Person person) {
            sessionFactory.getCurrentSession().merge(person);
           }
          @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
           public Person getPerson(Integer personId) {
            return (Person) sessionFactory.getCurrentSession().get(Person.class,
              personId);
           }

           public void delete(Integer personId) {
            sessionFactory.getCurrentSession()
              .delete(
                sessionFactory.getCurrentSession().load(Person.class,
                  personId));
           }
           @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
           @SuppressWarnings("unchecked")
           public List<Person> getPersons() {
            return sessionFactory.getCurrentSession().createQuery("from Person")
              .list();
           }

          }


          hibernate && spring的配置文件
          beans.xml

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

          <!--
           - Application context definition for JPetStore's business layer.
           - Contains bean references to the transaction manager and to the DAOs in
           - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
          -->
          <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"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           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
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

           <context:annotation-config />
           <!-- 配置數據源 -->
           <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName"
             value="org.gjt.mm.mysql.Driver" />
            <property name="url"
             value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8" />
            <property name="username" value="root" />
            <property name="password" value="" />
            <!-- 連接池啟動時的初始值 -->
            <property name="initialSize" value="1" />
            <!-- 連接池的最大值 -->
            <property name="maxActive" value="500" />
            <!-- 最大空閑值.當經過一個高峰時間后,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
            <property name="maxIdle" value="2" />
            <!--  最小空閑值.當空閑的連接數少于閥值時,連接池就會預申請去一些連接,以免洪峰來時來不及申請 -->
            <property name="minIdle" value="1" />
           </bean>

           <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" /><!-- 將datasource注入到sessionFactory -->
            <property name="mappingResources">
             <list>
              <value>cn/itcast/bean/Person.hbm.xml</value>
             </list>
            </property>
            <property name="hibernateProperties">
             <value>
              hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
              hibernate.hbm2ddl.auto=update hibernate.show_sql=false
              hibernate.format_sql=false
             </value>
            </property>
           </bean>

           <!--  通過事務管理 管理sessionFactory -->
           <bean id="txManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">

            <property name="sessionFactory" ref="sessionFactory" />
           </bean>

           <tx:annotation-driven transaction-manager="txManager" />
           <bean id="personServiceBean"
            class="cn.itcast.service.impl.PersonServiceBean">
           </bean>
          </beans>



          /**
          測試類**/

          package junit;


          import java.util.List;

          import org.junit.BeforeClass;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;

          public class IPersonServiceTest {

           private static IPersonService ipersonservice;
           @BeforeClass
           public static void setUpBeforeClass() throws Exception {
            try {
             ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
             ipersonservice=(IPersonService)ctx.getBean("personServiceBean");
            } catch (RuntimeException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
           }
           
           @Test
           public void TestSave(){
            
            ipersonservice.save(new Person("小張"));
            System.out.println("保存成功");
           }

           @Test public void testGetPerson(){
            Person person=ipersonservice.getPerson(1);
            System.out.println(person.getName());
           }
           
           @Test public void testUpdate(){
            Person person=ipersonservice.getPerson(1);
            person.setName("小麗");
            ipersonservice.update(person);
           }
           
           @Test public void testGetPersons(){
            List<Person> persons=ipersonservice.getPersons();
            for(Person person : persons){
             System.out.println(person.getId()+"  :" +person.getName());
            }
           }
           
           @Test public void testDelete(){
            ipersonservice.delete(1);
           }
          }

          table :person
          id  int
          name varchar

          posted @ 2009-09-13 16:38 笑口常開、財源滾滾來! 閱讀(443) | 評論 (0)編輯 收藏
           
          接口

          package cn.itcast.service;

          import java.util.List;

          import cn.itcast.bean.Person;

          public interface IPersonService {

           public void save(Person person);
           
           public void update(Person person);
           
           public void delete(int personId);
           
           public Person getPerson(int personId);
           
           public List<Person> getPersons();
          }

          實現類:

          package cn.itcast.service.impl;

          import java.util.List;

          import javax.annotation.Resource;
          import javax.sql.DataSource;

          import org.springframework.jdbc.core.JdbcTemplate;
          import org.springframework.jdbc.core.RowMapper;
          import org.springframework.stereotype.Service;
          import org.springframework.transaction.annotation.Transactional;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;


          @Transactional
          public class PersonServiceImpl implements IPersonService {

           private JdbcTemplate jdbcTemplete;

           // private DataSource datasource;
          @Resource
           public void setDatasource(DataSource datasource) {
            this.jdbcTemplete = new JdbcTemplate(datasource);
           }

           public void delete(int personId) {
            this.jdbcTemplete
              .update("delete from  person where id=?",
                new Object[] { personId },
                new int[] { java.sql.Types.INTEGER });

           }

           public Person getPerson(int personId) {
            return (Person) this.jdbcTemplete.queryForObject(
              "select * from person where id=?", new Object[] { personId },
              new int[] { java.sql.Types.INTEGER }, new PersonRowMapper());

           }

           @SuppressWarnings("unchecked")
           public List<Person> getPersons() {

            return (List<Person>) this.jdbcTemplete.query("select * from person",
              new PersonRowMapper());

           }

           public void save(Person person) {
            System.out.println(person.getName());

            this.jdbcTemplete.update("insert into person(name) values(?)",
              new Object[] { person.getName() },
              new int[] { java.sql.Types.VARCHAR });

           }

           public void update(Person person) {
            this.jdbcTemplete.update("update person set name=? where id=?",
              new Object[] { person.getName(), person.getId() }, new int[] {
                java.sql.Types.VARCHAR, java.sql.Types.INTEGER });

           }

          }


          實體類:

          package cn.itcast.bean;

          public class Person {

           private int id;
           
           private String name;

           public Person() {
            
           }

           public Person(String name) {
           
            this.name = name;
           }

           public int getId() {
            return id;
           }

           public void setId(int id) {
            this.id = id;
           }

           public String getName() {
            return name;
           }

           public void setName(String name) {
            this.name = name;
           }
          }



          package cn.itcast.service.impl;

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

          import org.springframework.jdbc.core.RowMapper;

          import cn.itcast.bean.Person;

          public class PersonRowMapper implements RowMapper {

           public Object mapRow(ResultSet rs, int index) throws SQLException {
            cn.itcast.bean.Person person=new Person(rs.getString("name"));
            person.setId(rs.getInt("id"));
            
            return person;
           }

          }


          配置文件:

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

          <!--
           - Application context definition for JPetStore's business layer.
           - Contains bean references to the transaction manager and to the DAOs in
           - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
          -->
          <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"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           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
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
           <aop:aspectj-autoproxy proxy-target-class="true"/>

           
           <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value=""/>
            <!-- 連接池啟動時的初始值 -->
            <property name="initialSize" value="1"/>
            <!-- 連接池的最大值 -->
            <property name="maxActive" value="500"/>
            <!-- 最大空閑值.當經過一個高峰時間后,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
            <property name="maxIdle" value="2"/>
            <!--  最小空閑值.當空閑的連接數少于閥值時,連接池就會預申請去一些連接,以免洪峰來時來不及申請 -->
            <property name="minIdle" value="1"/>
           </bean>


           <bean id="txManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
           </bean>

           <tx:annotation-driven transaction-manager="txManager" />


           <bean id="personServiceImpl"
            class="cn.itcast.service.impl.PersonServiceImpl">
            <property name="datasource" ref="dataSource" />
           </bean>

          </beans>

          測試類:

          package junit.test;


          import java.util.List;

          import org.junit.BeforeClass;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;

          import cn.itcast.bean.Person;
          import cn.itcast.service.IPersonService;

          public class TestSpringAndJdbc {

           public static IPersonService iPersonService;
           @BeforeClass
           public static void setUpBeforeClass() throws Exception {
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            iPersonService=(IPersonService)ctx.getBean("personServiceImpl");
           }
           @Test
           public void TestSave(){
            for(int i=1;i<5;i++){
             iPersonService.save(new Person("傳智博客"+i));
            }
            
           }
           @Test
           public void TestFindPerson(){
            
            iPersonService.getPerson(1);
            System.out.println(iPersonService.getPerson(1).getName());
           }
           
           @Test
           public void TestUpdate(){
            Person person=iPersonService.getPerson(1);//通過id取得person對象
            person.setName("張三");//設置名字
            iPersonService.update(person);//更新
           }
           
           @Test
           public void TestDelete(){
            Person person=iPersonService.getPerson(2);
            iPersonService.delete(person.getId());
           }

           @Test
           public void testFindAllPeron(){
            List<Person> list=iPersonService.getPersons();
            for(Person person:list){
             System.out.println(person.getId()+"  "+person.getName());
            }
           }
          }







          posted @ 2009-09-03 16:03 笑口常開、財源滾滾來! 閱讀(242) | 評論 (0)編輯 收藏
           
          Spring提供了兩種切面聲明方式,實際工作中我們可以選用其中一種:
                基于XML配置方式聲明切面。
                基于注解方式聲明切面。
          要進行AOP編程,首先我們要在spring的配置文件中引入aop命名空間:
          <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">
          </beans>


          基于注解方式聲明切面

          @Aspect
          public class LogPrint {
           @Pointcut("execution(* cn.itcast.service..*.*(..))")
           private void anyMethod() {}//聲明一個切入點 
           @Before("anyMethod() && args(userName)")//定義前置通知
           public void doAccessCheck(String userName) {
           } 
           @AfterReturning(pointcut="anyMethod()",returning="revalue")//定義后置通知
           public void doReturnCheck(String revalue) {
           }
           @AfterThrowing(pointcut="anyMethod()", throwing="ex")//定義例外通知
              public void doExceptionAction(Exception ex) {
           }
           @After("anyMethod()")//定義最終通知
           public void doReleaseAction() {
           }
           @Around("anyMethod()")//環繞通知
           public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
            return pjp.proceed();
           }
          }



          基于基于XML配置方式聲明切面


          public class LogPrint {
           public void doAccessCheck() {}定義前置通知
           public void doReturnCheck() {}定義后置通知
              public void doExceptionAction() {}定義例外通知
           public void doReleaseAction() {}定義最終通知
           public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
            return pjp.proceed();環繞通知
           }
          }


          <bean id="orderservice" class="cn.itcast.service.OrderServiceBean"/>
          <bean id="log" class="cn.itcast.service.LogPrint"/>
          <aop:config>
            <aop:aspect id="myaop" ref="log">
             <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/>
             <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
             <aop:after-returning pointcut-ref="mycut" method="doReturnCheck "/>
             <aop:after-throwing pointcut-ref="mycut" method="doExceptionAction"/>
             <aop:after pointcut-ref="mycut" method=“doReleaseAction"/>
             <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
            </aop:aspect>
          </aop:config>
           

          posted @ 2009-09-02 12:14 笑口常開、財源滾滾來! 閱讀(2181) | 評論 (0)編輯 收藏
           
          第一步:加入log4j-1.2.8.jar到lib下。

          第二步:在CLASSPATH下建立log4j.properties。內容如下:

          1 log4j.rootCategory=INFO, stdout , R

          2

          3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

          5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

          6

          7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

          8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

          9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

          10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

          11

          12 log4j.logger.com.neusoft=DEBUG

          13 log4j.logger.com.opensymphony.oscache=ERROR

          14 log4j.logger.net.sf.navigator=ERROR

          15 log4j.logger.org.apache.commons=ERROR

          16 log4j.logger.org.apache.struts=WARN

          17 log4j.logger.org.displaytag=ERROR

          18 log4j.logger.org.springframework=DEBUG

          19 log4j.logger.com.ibatis.db=WARN

          20 log4j.logger.org.apache.velocity=FATAL

          21

          22 log4j.logger.com.canoo.webtest=WARN

          23

          24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

          25 log4j.logger.org.hibernate=DEBUG

          26 log4j.logger.org.logicalcobwebs=WARN

          第三步:相應的修改其中屬性,修改之前就必須知道這些都是干什么的,在第二部分講解。

          第四步:在要輸出日志的類中加入相關語句:

          定義屬性:protected final Log log = LogFactory.getLog(getClass());

          在相應的方法中:

          if (log.isDebugEnabled())

          {

          log.debug(“System …..”);

          }

          二、Log4j說明

          1 log4j.rootCategory=INFO, stdout , R

          此句為將等級為INFO的日志信息輸出到stdout和R這兩個目的地,stdout和R的定義在下面的代碼,可以任意起名。等級可分為OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何信息,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會被顯示,具體講解可參照第三部分定義配置文件中的logger。

          3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          此句為定義名為stdout的輸出端是哪種類型,可以是

          org.apache.log4j.ConsoleAppender(控制臺),

          org.apache.log4j.FileAppender(文件),

          org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

          org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)

          org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

          具體講解可參照第三部分定義配置文件中的Appender。

          4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

          此句為定義名為stdout的輸出端的layout是哪種類型,可以是

          org.apache.log4j.HTMLLayout(以HTML表格形式布局),

          org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

          org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

          org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

          具體講解可參照第三部分定義配置文件中的Layout。

          5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

          如果使用pattern布局就要指定的打印信息的具體格式ConversionPattern,打印參數如下:

          %m 輸出代碼中指定的消息

          %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

          %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

          %c 輸出所屬的類目,通常就是所在類的全名

          %t 輸出產生該日志事件的線程名

          %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

          %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

          %l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。

          [QC]是log信息的開頭,可以為任意字符,一般為項目簡稱。

          輸出的信息

          [TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

          具體講解可參照第三部分定義配置文件中的格式化日志信息。

          7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

          此句與第3行一樣。定義名為R的輸出端的類型為每天產生一個日志文件。

          8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

          此句為定義名為R的輸出端的文件名為D:\Tomcat 5.5\logs\qc.log

          可以自行修改。

          9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

          與第4行相同。

          10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

          與第5行相同。

          12 log4j.logger.com. neusoft =DEBUG

          指定com.neusoft包下的所有類的等級為DEBUG。

          可以把com.neusoft改為自己項目所用的包名。

          13 log4j.logger.com.opensymphony.oscache=ERROR

          14 log4j.logger.net.sf.navigator=ERROR

          這兩句是把這兩個包下出現的錯誤的等級設為ERROR,如果項目中沒有配置EHCache,則不需要這兩句。

          15 log4j.logger.org.apache.commons=ERROR

          16 log4j.logger.org.apache.struts=WARN

          這兩句是struts的包。

          17 log4j.logger.org.displaytag=ERROR

          這句是displaytag的包。(QC問題列表頁面所用)

          18 log4j.logger.org.springframework=DEBUG

          此句為Spring的包。

          24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

          25 log4j.logger.org.hibernate=DEBUG

          此兩句是hibernate的包。

          以上這些包的設置可根據項目的實際情況而自行定制。

          三、log4j詳解

          1、定義配置文件

          Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:

          、配置根Logger

          Logger 負責處理日志記錄的大部分操作。

          其語法為:

          log4j.rootLogger = [ level ] , appenderName, appenderName, …

          其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定 義了INFO級別,只有等于及高于這個級別的才進行處理,則應用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關 閉所有的日志輸出。 appenderName就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。

          、配置日志信息輸出目的地 Appender

          Appender 負責控制日志記錄操作的輸出。

          其語法為:

          log4j.appender.appenderName = fully.qualified.name.of.appender.class

          log4j.appender.appenderName.option1 = value1



          log4j.appender.appenderName.optionN = valueN

          這里的appenderName為在①里定義的,可任意起名。

          其中,Log4j提供的appender有以下幾種:

          org.apache.log4j.ConsoleAppender(控制臺),

          org.apache.log4j.FileAppender(文件),

          org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

          org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),可通過 log4j.appender.R.MaxFileSize=100KB設置文件大小,還可通過 log4j.appender.R.MaxBackupIndex=1設置為保存一個備份文件。

          org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

          例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          定義一個名為stdout的輸出目的地,ConsoleAppender為控制臺。

          、配置日志信息的格式(布局)Layout

          Layout 負責格式化Appender的輸出。

          其語法為:

          log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

          log4j.appender.appenderName.layout.option1 = value1



          log4j.appender.appenderName.layout.optionN = valueN

          其中,Log4j提供的layout有以下幾種:

          org.apache.log4j.HTMLLayout(以HTML表格形式布局),

          org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

          org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

          org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

          2、格式化日志信息

          Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:

          %m 輸出代碼中指定的消息

          %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

          %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

          %c 輸出所屬的類目,通常就是所在類的全名

          %t 輸出產生該日志事件的線程名

          %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

          %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

          %l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。

          3、在代碼中使用Log4j

          我們在需要輸出日志信息的類中做如下的三個工作:

          1、導入所有需的commongs-logging類:

          import org.apache.commons.logging.Log;

          import org.apache.commons.logging.LogFactory;

          2、在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員:

          private final Log log = LogFactory.getLog(getClass());

          LogFactory.getLog()方法的參數使用的是當前類的class。

          3、使用org.apache.commons.logging.Log類的成員方法輸出日志信息:

          if (log.isDebugEnabled())
          {
          log.debug("111");
          }
          if (log.isInfoEnabled())
          {
          log.info("222");
          }
          if (log.isWarnEnabled())
          {
          log.warn("333");
          }
          if (log.isErrorEnabled())
          {
          log.error("444");
          }
          if (log.isFatalEnabled())
          {
          log.fatal("555")
          }
          posted @ 2009-08-29 19:32 笑口常開、財源滾滾來! 閱讀(207) | 評論 (0)編輯 收藏
           
          轉載:http://hi.baidu.com/panqf/blog/item/b0db04874b1ccb2bc65cc313.html

           Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖 1 所示。
          圖 1. Spring 框架的 7 個模塊
          Spring 框架圖示

          組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:

          • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
          • Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
          • Spring AOP: 通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
          • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫 的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
          • Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
          • Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
          • Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

                  Spring 框架的功能可以用在任何 J2EE 服務器中,大多數功能也適用于不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。


          posted @ 2009-08-28 09:53 笑口常開、財源滾滾來! 閱讀(687) | 評論 (0)編輯 收藏
           

          public interface IPersonService {

           public abstract void Save();
           public Set<String> getSets() ;
           public List<String> getLists() ;
           public Properties getProperties() ;
           public Map<String, String> getMaps() ;

          }



          public class PersonServiceBean implements IPersonService {

           private IPersonDao iPersonDao;
           private Set<String> sets=new HashSet<String>();
           private List<String> lists=new ArrayList<String>();
           private Properties properties=new Properties();
           private Map<String,String> maps=new HashMap<String,String>();
           
           public PersonServiceBean(IPersonDao personDao, String name) {
            
            iPersonDao = personDao;
            this.name = name;
           }
           public void Save(){
            System.out.println(name);//輸出name
            iPersonDao.add();
           }

           private String name;
           
           public String getName() {
            return name;
           }

           public void setName(String name) {
            this.name = name;
           }

           public Map<String, String> getMaps() {
            return maps;
           }

           public void setMaps(Map<String, String> maps) {
            this.maps = maps;
           }

           public Properties getProperties() {
            return properties;
           }

           public void setProperties(Properties properties) {
            this.properties = properties;
           }

           public Set<String> getSets() {
            return sets;
           }

           public void setSets(Set<String> sets) {
            this.sets = sets;
           }

           public IPersonDao getIPersonDao() {
            return iPersonDao;
           }

           public void setIPersonDao(IPersonDao personDao) {
            iPersonDao = personDao;
           }

           
           public List<String> getLists() {
            return lists;
           }

           public void setLists(List<String> lists) {
            this.lists = lists;
           }
          }



          測試類:

          public class SpringTest {

           @BeforeClass
           public static void setUpBeforeClass() throws Exception {
           }
           @Test
           public void instanceSpring() {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
              "beans.xml");
            // ItcastClassPathXMLApplicationContext ctx=new
            // ItcastClassPathXMLApplicationContext("beans.xml");
            //  
            IPersonService ipersonService = (IPersonService) ctx
              .getBean("personService");
            //集合對象的遍歷
            System.out.println("===========set==================");
            for (String value : ipersonService.getSets()) {
             
             System.out.println(value);
            }
            // ipersonService.Save();
            // ctx.close();
            // ctx.registerShutdownHook();
            System.out.println("===========List=================");
            for(String value:ipersonService.getLists()){
             
             System.out.println(value);
            }
            
            System.out.println("=========properties===============");
            for(Object value:ipersonService.getProperties().keySet()){
             System.out.println(value);
            }
            System.out.println("================maps==================");
            for(Object value:ipersonService.getMaps().keySet()){
             System.out.println(value);
            }
            //調用PersonServiceBean的sava方法,輸出結果
            ipersonService.Save();
            
           }
          }



          <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:tx="http://www.springframework.org/schema/tx"
           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
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
           <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>

            <constructor-arg index="0" ref="personDaoBean"
             type="cn.itcast.dao.IPersonDao" />
            <constructor-arg index="1" type="java.lang.String"
             value="傳智博客">
            </constructor-arg>

            <property name="sets">
             <set>
              <value>set1</value>
              <value>set2</value>
              <value>set3</value>
             </set>
            </property>

            <property name="lists">
             <list>
              <value>list1</value>
              <value>list2</value>
              <value>list3</value>
             </list>
            </property>

            <property name="properties">
             <props>
              <prop key="properties1">property1</prop>
              <prop key="properties2">property2</prop>
              <prop key="properties3">property3</prop>
             </props>
            </property>

            <property name="maps">
             <map>
              <entry key="key1" value="keyFirst"></entry>
              <entry key="key2" value="keySecond"></entry>
              <entry key="key3" value="keyThird"></entry>
             </map>
            </property>
           </bean>
           <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>


           <!--
            <bean id="anotherPersonServiceBean"
            class="cn.itcast.service.impl.AnotherPersonServiceBean" >
            </bean>
           -->
          </beans>


          public class PersonDaoBean implements IPersonDao {
           public void add(){
            System.out.println("這是personDaoBean的Add()方法");
           }
          }



          輸出:


          ===========set==================
          set1
          set2
          set3
          ===========List=================
          list1
          list2
          list3
          =========properties===============
          properties3
          properties2
          properties1
          ================maps==================
          key1
          key2
          key3
          傳智博客
          這是personDaoBean的Add()方法

          posted @ 2009-08-27 18:19 笑口常開、財源滾滾來! 閱讀(1603) | 評論 (3)編輯 收藏
           
          依賴注入的方式:
          第一、通過接口注入
          第二、通過構造函數注入,設置對象參數
          第三、通過setter方法注入。
          后兩者運用居多。


          通過內部bean注入,其缺點是內部bean只能被一個外部bean使用
          如下:
          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao">
                   <bean class="cn.itcast.dao.impl.PersonDaoBean"></bean><!--   內部bean注入 -->
            </property>
            
            </bean>
            也可以換為:通過 ref的方式也是可以的,其優點是通過ref參數,可以被多個bean引用。

          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            
            </bean>
            <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>  


          剖析依賴注入的內部機制:通過基本數據類型的向屬性值類型的轉換



          /**
           * 實現的spring容器
           *
           * @author Administrator
           *
           */
          public class ItcastClassPathXMLApplicationContext {

           private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
           private Map<String, Object> sigletons = new HashMap<String, Object>();

           public ItcastClassPathXMLApplicationContext() {

           }

           public ItcastClassPathXMLApplicationContext(String filename) {
            // System.out.println("構造方法 ");
            this.readXml(filename);// 調用 讀取配置文件 的方法
            this.instanceBeans();// 調用bean的實例化
            this.injectObject();// 注入對象
           }

           /**
            * 為bean對象的屬性注入值
            */
           private void injectObject() {
            for (BeanDefinition beanDefinition : beanDefines) {
             Object bean = sigletons.get(beanDefinition.getId());
             if (bean != null) {
              // 取得屬性描述 ,是一個數組
              try {
               PropertyDescriptor[] ps = Introspector.getBeanInfo(
                 bean.getClass()).getPropertyDescriptors();
               for (PropertyDefinition propertyDefinition : beanDefinition
                 .getPropertys()) {// 取所有屬性
                for (PropertyDescriptor properdesc : ps) {
                 if (propertyDefinition.getName().equals(
                   properdesc.getName())) {
                  Method setter = properdesc.getWriteMethod();// 獲取屬性的setter方法.
                  // private
                  if (setter != null) {
                   Object value=null;
                   if(propertyDefinition.getRef()!=null && !"".equals(propertyDefinition.getRef().trim())){
                    value = sigletons
                      .get(propertyDefinition
                        .getRef());
                    
                   }else{
                    //將配置文件里字符串類型轉換為屬性類型的值
                    value=ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
                    
                   }
                   setter.setAccessible(true);// 設置為可訪問
                   setter.invoke(bean, value);// 把引用對象注入到屬性
                   
                  }
                  break;
                 }
                }
               }
              } catch (Exception e) {
               e.printStackTrace();
              }

             }
            }

           }

           /**
            * 完成bean的實例化
            */
           private void instanceBeans() {
            // System.out.println("bean實例化方法被調用");
            // 利用反射機制把bean實例化
            for (BeanDefinition beanDefinition : beanDefines) {
             try {
              // 判斷BeanDefinition的實例獲得的類名不為null和空串
              if (beanDefinition.getClassName() != null
                && !"".equals(beanDefinition.getClassName().trim()))
               sigletons.put(beanDefinition.getId(), Class.forName(
                 beanDefinition.getClassName()).newInstance());
             } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }

            }

           }

           /**
            * 讀取配置文件信息
            *
            * @param filename
            */
           private void readXml(String filename) {
            // System.out.println("讀取xml文件的方法被調用了");

            SAXReader saxReader = new SAXReader();// 創建讀取器
            Document document = null;
            try {
             URL xmlpath = this.getClass().getClassLoader()
               .getResource(filename);//取得當前xml文件在本地的位置
             
             document = saxReader.read(xmlpath);// 讀取路徑
             Map<String, String> nsMap = new HashMap<String, String>();
             nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空間
             XPath xsub = document.createXPath("http://ns:beans/ns:bean");// 創建beans/bean查詢路徑
             xsub.setNamespaceURIs(nsMap);// 設置命名空間
             List<Element> beans = xsub.selectNodes(document);// 獲取文檔下所有bean節點
             for (Element element : beans) {
              String id = element.attributeValue("id");// 獲取id屬性值
              String clazz = element.attributeValue("class");// 獲取class屬性值
              BeanDefinition beanDefine = new BeanDefinition(id, clazz);
              XPath propertysub = element.createXPath("ns:property");// 船艦查詢路徑

              propertysub.setNamespaceURIs(nsMap);// 設置命名空間
              List<Element> propertys = propertysub.selectNodes(element);// 查找節點
              for (Element property : propertys) {
               String propertyName = property.attributeValue("name");// 取得property的name值
               String propertyref = property.attributeValue("ref");// 取得property的ref值
               String propertyValue = property.attributeValue("value");// 取得property的value值

               PropertyDefinition propertyDefinition = new PropertyDefinition(
                 propertyName, propertyref,propertyValue);
               beanDefine.getPropertys().add(propertyDefinition);// 將屬性對象加入到bean中
              }

              beanDefines.add(beanDefine);
             }
            } catch (Exception e) {
             e.printStackTrace();

            }

           }

           /**
            * 獲取bean 實例
            *
            * @param beanName
            * @return
            */
           public Object getBean(String beanName) {

            
            return this.sigletons.get(beanName);
           }

          }


            

          <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            
            <property name="name" value="Itcast"></property>
            <property name="age" value="15"></property>
            </bean>
            <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>  
            


          public class SpringTest {

           @BeforeClass
           public static void setUpBeforeClass() throws Exception {

           }
           @Test
           public void instanceSpring() {
          //  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
          //    "beans.xml");
            ItcastClassPathXMLApplicationContext ctx=new ItcastClassPathXMLApplicationContext("beans.xml");
          //  
            IPersonService ipersonService = (IPersonService)ctx
              .getBean("personService");
            ipersonService.Save();
           // ctx.close();
            // ctx.registerShutdownHook();

           }
          }


          public class PropertyDefinition {
           private String name;
           private String ref;
           private String value;
           public PropertyDefinition(String name, String ref,String value) {
            
            this.name = name;
            this.ref = ref;
            this.value=value;
           }
           public String getName() {
            return name;
           }
           public void setName(String name) {
            this.name = name;
           }
           public String getRef() {
            return ref;
           }
           public void setRef(String ref) {
            this.ref = ref;
          }
          其他略。

          out:
          Itcast
          15
          這是personDaoBean的Add()方法

          posted @ 2009-08-27 15:03 笑口常開、財源滾滾來! 閱讀(238) | 評論 (0)編輯 收藏
           
                   今天花費了半天去寫自定義容器,結果發現還是沒發實現功能,無法輸出,結果不斷的調試、測試。最后終于搞定了。原來是寫代碼的時候把讀取配置文件里方法readxml,里面讀取子屬性里面查找節點,調用查找對象搞錯了。本為propertysub.selectNodes(element),但寫為了xsub.selectNodes(element)誤用為主element里面查找子節點。還有就是在//ns:beans/ns:bean里面把冒號寫成了頓號,真是太不仔細了。

          自定義容器

          /**
           * 實現的spring容器
           *
           * @author Administrator
           *
           */
          public class ItcastClassPathXMLApplicationContext {

           private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
           private Map<String, Object> sigletons = new HashMap<String, Object>();

           public ItcastClassPathXMLApplicationContext() {

           }

           public ItcastClassPathXMLApplicationContext(String filename) {
            // System.out.println("構造方法 ");
            this.readXml(filename);// 調用 讀取配置文件 的方法
            this.instanceBeans();// 調用bean的實例化
            this.injectObject();// 注入對象
           }

           /**
            * 為bean對象的屬性注入值
            */
           private void injectObject() {
            for (BeanDefinition beanDefinition : beanDefines) {
             Object bean = sigletons.get(beanDefinition.getId());
             if (bean != null) {
              // 取得屬性描述 ,是一個數組
              try {
               PropertyDescriptor[] ps = Introspector.getBeanInfo(
                 bean.getClass()).getPropertyDescriptors();
               for (PropertyDefinition propertyDefinition : beanDefinition
                 .getPropertys()) {// 取所有屬性
                for (PropertyDescriptor properdesc : ps) {
                 if (propertyDefinition.getName().equals(
                   properdesc.getName())) {
                  Method setter = properdesc.getWriteMethod();// 獲取屬性的setter方法.
                  // private
                  if (setter != null) {
                   Object value = sigletons
                     .get(propertyDefinition.getRef());
                   setter.setAccessible(true);// 設置為可訪問
                   setter.invoke(bean, value);// 把引用對象注入到屬性
                  }
                  break;
                 }
                }
               }
              } catch (Exception e) {
               e.printStackTrace();
              }

             }
            }

           }

           /**
            * 完成bean的實例化
            */
           private void instanceBeans() {
            // System.out.println("bean實例化方法被調用");
            // 利用反射機制把bean實例化
            for (BeanDefinition beanDefinition : beanDefines) {
             try {
              // 判斷BeanDefinition的實例獲得的類名不為null和空串
              if (beanDefinition.getClassName() != null
                && !"".equals(beanDefinition.getClassName().trim()))
               sigletons.put(beanDefinition.getId(), Class.forName(
                 beanDefinition.getClassName()).newInstance());
             } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }

            }

           }

           /**
            * 讀取配置文件信息
            *
            * @param filename
            */
           private void readXml(String filename) {
            // System.out.println("讀取xml文件的方法被調用了");

            SAXReader saxReader = new SAXReader();// 創建讀取器
            Document document = null;
            try {
             URL xmlpath = this.getClass().getClassLoader()
               .getResource(filename);//取得當前xml文件在本地的位置
             
             document = saxReader.read(xmlpath);// 讀取路徑
             System.out.println(document);
             Map<String, String> nsMap = new HashMap<String, String>();
             nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空間
             XPath xsub = document.createXPath("http://ns:beans/ns:bean");// 創建beans/bean查詢路徑
             xsub.setNamespaceURIs(nsMap);// 設置命名空間
             List<Element> beans = xsub.selectNodes(document);// 獲取文檔下所有bean節點
             System.out.println(beans.size());
             for (Element element : beans) {
              String id = element.attributeValue("id");// 獲取id屬性值
              String clazz = element.attributeValue("class");// 獲取class屬性值
              BeanDefinition beanDefine = new BeanDefinition(id, clazz);
              System.out.println("id=" + id);
              System.out.println("clazz=" + clazz);
              XPath propertysub = element.createXPath("ns:property");// 船艦查詢路徑

              propertysub.setNamespaceURIs(nsMap);// 設置命名空間
              List<Element> propertys = propertysub.selectNodes(element);// 查找節點
              for (Element property : propertys) {
               String propertyName = property.attributeValue("name");// 取得property的name值
               String propertyref = property.attributeValue("ref");// 取得property的ref值

               System.out.println(propertyName + "=  " + propertyref);

               PropertyDefinition propertyDefinition = new PropertyDefinition(
                 propertyName, propertyref);
               beanDefine.getPropertys().add(propertyDefinition);// 將屬性對象加入到bean中
              }

              beanDefines.add(beanDefine);
             }
            } catch (Exception e) {
             e.printStackTrace();

            }

           }

           /**
            * 獲取bean 實例
            *
            * @param beanName
            * @return
            */
           public Object getBean(String beanName) {

            
            return this.sigletons.get(beanName);
           }

          }

           bean.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:tx="http://www.springframework.org/schema/tx"
           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
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
            >
           <bean id="personService"
            class="cn.itcast.service.impl.PersonServiceBean">
            <property name="IPersonDao" ref="personDaoBean"></property>
            
            </bean>
            <bean id="personDaoBean" class="cn.itcast.dao.impl.PersonDaoBean"></bean>  
          </beans>


          自定義屬性類 PropertyDefinition.java

          package junit.test;

          public class PropertyDefinition {
           private String name;
           private String ref;
           public PropertyDefinition(String name, String ref) {
            
            this.name = name;
            this.ref = ref;
           }
            getter&setter method

          }


          測試類:springTest


          package junit.test;

          import org.junit.BeforeClass;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.AbstractApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;
          import org.springframework.context.support.FileSystemXmlApplicationContext;

          import cn.itcast.service.IPersonService;
          import cn.itcast.service.impl.PersonServiceBean;

          public class SpringTest {

           @BeforeClass
           public static void setUpBeforeClass() throws Exception {

           }
           @Test
           public void instanceSpring() {
          //  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
          //    "beans.xml");
            ItcastClassPathXMLApplicationContext ctx=new ItcastClassPathXMLApplicationContext("beans.xml");
            
            IPersonService ipersonService = (IPersonService)ctx
              .getBean("personService");//調用自定義容器的getBean方法
            ipersonService.Save();
          //  ctx.close();
            // ctx.registerShutdownHook();

           }
          }

          自定義bean類:

          package junit.test;

          import java.util.ArrayList;
          import java.util.List;

          public class BeanDefinition {
           
           private String id;
           private String className;
           private List<PropertyDefinition> propertys=new ArrayList<PropertyDefinition>();
           生成getter,setter方法
           }



          package cn.itcast.dao.impl;

          import cn.itcast.dao.IPersonDao;

          public class PersonDaoBean implements IPersonDao {
           public void add(){
            System.out.println("這是personDaoBean的Add()方法");
           }
          }




          package cn.itcast.service;

          public interface IPersonService {

           public abstract void Save();

          }




          package cn.itcast.service.impl;


          import cn.itcast.dao.IPersonDao;
          import cn.itcast.service.IPersonService;
          /**
           * 業務bean
           * @author Administrator
           *
           */
          public class PersonServiceBean implements IPersonService {

           private IPersonDao iPersonDao;
           
           public IPersonDao getIPersonDao() {
            return iPersonDao;
           }

           public void setIPersonDao(IPersonDao personDao) {
            iPersonDao = personDao;
           }

           public void Save(){
            iPersonDao.add();
           }
           
           
          }



          運行測試類
          out:
           這是personDaoBean的Add()方法


          posted @ 2009-08-27 14:46 笑口常開、財源滾滾來! 閱讀(154) | 評論 (0)編輯 收藏
          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 
           
          主站蜘蛛池模板: 长寿区| 灌阳县| 玛多县| 嘉峪关市| 资阳市| 彩票| 吴桥县| 浠水县| 鄢陵县| 灵石县| 广南县| 开江县| 沽源县| 隆德县| 宜良县| 沈丘县| 治县。| 桑日县| 乌鲁木齐县| 明星| 丹东市| 武宁县| 错那县| 边坝县| 宁远县| 萍乡市| 惠州市| 山阳县| 仁寿县| 兴国县| 玉田县| 安达市| 甘孜| 永仁县| 铅山县| 博湖县| 偃师市| 正定县| 汝州市| 疏勒县| 安平县|