<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    轉(zhuǎn)載:http://www.host01.com/article/Wap/wap001/05922162843330.htm

    JSP下獲取手機(jī)號碼

    //取手機(jī)號
    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 笑口常開、財(cái)源滾滾來! 閱讀(1309) | 評論 (2)編輯 收藏
     
    轉(zhuǎn)載:
    http://hi.baidu.com/yashengwh/blog/item/27130edf7ec447156327980b.html


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

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

    3、你可以試這樣的方法獲得手機(jī)號碼: 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
    聲明:第三種方法不保險(xiǎn)

    頭文件參考:
    答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 笑口常開、財(cái)源滾滾來! 閱讀(1625) | 評論 (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>

    定義業(yè)務(wù)接口

    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();

    }


    業(yè)務(wù)實(shí)現(xiàn)類

    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;

    /**
     * 業(yè)務(wù)層,采用注解聲明事務(wù)
     *
     * @author Administrator
     *
     */
    @Transactional
    public class PersonServiceBean implements IPersonService {

     @Resource
     private SessionFactory sessionFactory;

     public void save(Person person) {

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

      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 />
     <!-- 配置數(shù)據(jù)源 -->
     <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="" />
      <!-- 連接池啟動時(shí)的初始值 -->
      <property name="initialSize" value="1" />
      <!-- 連接池的最大值 -->
      <property name="maxActive" value="500" />
      <!-- 最大空閑值.當(dāng)經(jīng)過一個(gè)高峰時(shí)間后,連接池可以慢慢將已經(jīng)用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
      <property name="maxIdle" value="2" />
      <!--  最小空閑值.當(dāng)空閑的連接數(shù)少于閥值時(shí),連接池就會預(yù)申請去一些連接,以免洪峰來時(shí)來不及申請 -->
      <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>

     <!--  通過事務(wù)管理 管理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 笑口常開、財(cái)源滾滾來! 閱讀(440) | 評論 (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();
    }

    實(shí)現(xiàn)類:

    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 });

     }

    }


    實(shí)體類:

    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=""/>
      <!-- 連接池啟動時(shí)的初始值 -->
      <property name="initialSize" value="1"/>
      <!-- 連接池的最大值 -->
      <property name="maxActive" value="500"/>
      <!-- 最大空閑值.當(dāng)經(jīng)過一個(gè)高峰時(shí)間后,連接池可以慢慢將已經(jīng)用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
      <property name="maxIdle" value="2"/>
      <!--  最小空閑值.當(dāng)空閑的連接數(shù)少于閥值時(shí),連接池就會預(yù)申請去一些連接,以免洪峰來時(shí)來不及申請 -->
      <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("張三");//設(shè)置名字
      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 笑口常開、財(cái)源滾滾來! 閱讀(241) | 評論 (0)編輯 收藏
     
    Spring提供了兩種切面聲明方式,實(shí)際工作中我們可以選用其中一種:
          基于XML配置方式聲明切面。
          基于注解方式聲明切面。
    要進(jìn)行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() {}//聲明一個(gè)切入點(diǎn) 
     @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()")//環(huán)繞通知
     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();環(huán)繞通知
     }
    }


    <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 笑口常開、財(cái)源滾滾來! 閱讀(2178) | 評論 (0)編輯 收藏
     
    第一步:加入log4j-1.2.8.jar到lib下。

    第二步:在CLASSPATH下建立log4j.properties。內(nèi)容如下:

    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

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

    第四步:在要輸出日志的類中加入相關(guān)語句:

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

    在相應(yīng)的方法中:

    if (log.isDebugEnabled())

    {

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

    }

    二、Log4j說明

    1 log4j.rootCategory=INFO, stdout , R

    此句為將等級為INFO的日志信息輸出到stdout和R這兩個(gè)目的地,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(每天產(chǎn)生一個(gè)日志文件),

    org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)

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

    具體講解可參照第三部分定義配置文件中的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(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)

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

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

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

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

    %p 輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL

    %r 輸出自應(yīng)用啟動到輸出該log信息耗費(fèi)的毫秒數(shù)

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

    %t 輸出產(chǎn)生該日志事件的線程名

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

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

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

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

    輸出的信息

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

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

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

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

    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改為自己項(xiàng)目所用的包名。

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

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

    這兩句是把這兩個(gè)包下出現(xiàn)的錯(cuò)誤的等級設(shè)為ERROR,如果項(xiàng)目中沒有配置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的包。

    以上這些包的設(shè)置可根據(jù)項(xiàng)目的實(shí)際情況而自行定制。

    三、log4j詳解

    1、定義配置文件

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

    、配置根Logger

    Logger 負(fù)責(zé)處理日志記錄的大部分操作。

    其語法為:

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

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

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

    Appender 負(fù)責(zé)控制日志記錄操作的輸出。

    其語法為:

    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(每天產(chǎn)生一個(gè)日志文件),

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

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

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

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

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

    Layout 負(fù)責(zé)格式化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(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)

    2、格式化日志信息

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

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

    %p 輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL

    %r 輸出自應(yīng)用啟動到輸出該log信息耗費(fèi)的毫秒數(shù)

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

    %t 輸出產(chǎn)生該日志事件的線程名

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

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

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

    3、在代碼中使用Log4j

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

    1、導(dǎo)入所有需的commongs-logging類:

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

    2、在自己的類中定義一個(gè)org.apache.commons.logging.Log類的私有靜態(tài)類成員:

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

    LogFactory.getLog()方法的參數(shù)使用的是當(dāng)前類的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 笑口常開、財(cái)源滾滾來! 閱讀(203) | 評論 (0)編輯 收藏
     
    轉(zhuǎn)載:http://hi.baidu.com/panqf/blog/item/b0db04874b1ccb2bc65cc313.html

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

    組成 Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:

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

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


    posted @ 2009-08-28 09:53 笑口常開、財(cái)源滾滾來! 閱讀(685) | 評論 (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);
      }
      //調(diào)用PersonServiceBean的sava方法,輸出結(jié)果
      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 笑口常開、財(cái)源滾滾來! 閱讀(1602) | 評論 (3)編輯 收藏
     
    依賴注入的方式:
    第一、通過接口注入
    第二、通過構(gòu)造函數(shù)注入,設(shè)置對象參數(shù)
    第三、通過setter方法注入。
    后兩者運(yùn)用居多。


    通過內(nèi)部bean注入,其缺點(diǎn)是內(nèi)部bean只能被一個(gè)外部bean使用
    如下:
    <bean id="personService"
      class="cn.itcast.service.impl.PersonServiceBean">
      <property name="IPersonDao">
             <bean class="cn.itcast.dao.impl.PersonDaoBean"></bean><!--   內(nèi)部bean注入 -->
      </property>
      
      </bean>
      也可以換為:通過 ref的方式也是可以的,其優(yōu)點(diǎn)是通過ref參數(shù),可以被多個(gè)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>  


    剖析依賴注入的內(nèi)部機(jī)制:通過基本數(shù)據(jù)類型的向?qū)傩灾殿愋偷霓D(zhuǎn)換



    /**
     * 實(shí)現(xiàn)的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("構(gòu)造方法 ");
      this.readXml(filename);// 調(diào)用 讀取配置文件 的方法
      this.instanceBeans();// 調(diào)用bean的實(shí)例化
      this.injectObject();// 注入對象
     }

     /**
      * 為bean對象的屬性注入值
      */
     private void injectObject() {
      for (BeanDefinition beanDefinition : beanDefines) {
       Object bean = sigletons.get(beanDefinition.getId());
       if (bean != null) {
        // 取得屬性描述 ,是一個(gè)數(shù)組
        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{
              //將配置文件里字符串類型轉(zhuǎn)換為屬性類型的值
              value=ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
              
             }
             setter.setAccessible(true);// 設(shè)置為可訪問
             setter.invoke(bean, value);// 把引用對象注入到屬性
             
            }
            break;
           }
          }
         }
        } catch (Exception e) {
         e.printStackTrace();
        }

       }
      }

     }

     /**
      * 完成bean的實(shí)例化
      */
     private void instanceBeans() {
      // System.out.println("bean實(shí)例化方法被調(diào)用");
      // 利用反射機(jī)制把bean實(shí)例化
      for (BeanDefinition beanDefinition : beanDefines) {
       try {
        // 判斷BeanDefinition的實(shí)例獲得的類名不為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文件的方法被調(diào)用了");

      SAXReader saxReader = new SAXReader();// 創(chuàng)建讀取器
      Document document = null;
      try {
       URL xmlpath = this.getClass().getClassLoader()
         .getResource(filename);//取得當(dāng)前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");// 創(chuàng)建beans/bean查詢路徑
       xsub.setNamespaceURIs(nsMap);// 設(shè)置命名空間
       List<Element> beans = xsub.selectNodes(document);// 獲取文檔下所有bean節(jié)點(diǎn)
       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);// 設(shè)置命名空間
        List<Element> propertys = propertysub.selectNodes(element);// 查找節(jié)點(diǎn)
        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 實(shí)例
      *
      * @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 笑口常開、財(cái)源滾滾來! 閱讀(237) | 評論 (0)編輯 收藏
     
             今天花費(fèi)了半天去寫自定義容器,結(jié)果發(fā)現(xiàn)還是沒發(fā)實(shí)現(xiàn)功能,無法輸出,結(jié)果不斷的調(diào)試、測試。最后終于搞定了。原來是寫代碼的時(shí)候把讀取配置文件里方法readxml,里面讀取子屬性里面查找節(jié)點(diǎn),調(diào)用查找對象搞錯(cuò)了。本為propertysub.selectNodes(element),但寫為了xsub.selectNodes(element)誤用為主element里面查找子節(jié)點(diǎn)。還有就是在//ns:beans/ns:bean里面把冒號寫成了頓號,真是太不仔細(xì)了。

    自定義容器

    /**
     * 實(shí)現(xiàn)的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("構(gòu)造方法 ");
      this.readXml(filename);// 調(diào)用 讀取配置文件 的方法
      this.instanceBeans();// 調(diào)用bean的實(shí)例化
      this.injectObject();// 注入對象
     }

     /**
      * 為bean對象的屬性注入值
      */
     private void injectObject() {
      for (BeanDefinition beanDefinition : beanDefines) {
       Object bean = sigletons.get(beanDefinition.getId());
       if (bean != null) {
        // 取得屬性描述 ,是一個(gè)數(shù)組
        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);// 設(shè)置為可訪問
             setter.invoke(bean, value);// 把引用對象注入到屬性
            }
            break;
           }
          }
         }
        } catch (Exception e) {
         e.printStackTrace();
        }

       }
      }

     }

     /**
      * 完成bean的實(shí)例化
      */
     private void instanceBeans() {
      // System.out.println("bean實(shí)例化方法被調(diào)用");
      // 利用反射機(jī)制把bean實(shí)例化
      for (BeanDefinition beanDefinition : beanDefines) {
       try {
        // 判斷BeanDefinition的實(shí)例獲得的類名不為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文件的方法被調(diào)用了");

      SAXReader saxReader = new SAXReader();// 創(chuàng)建讀取器
      Document document = null;
      try {
       URL xmlpath = this.getClass().getClassLoader()
         .getResource(filename);//取得當(dāng)前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");// 創(chuàng)建beans/bean查詢路徑
       xsub.setNamespaceURIs(nsMap);// 設(shè)置命名空間
       List<Element> beans = xsub.selectNodes(document);// 獲取文檔下所有bean節(jié)點(diǎn)
       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);// 設(shè)置命名空間
        List<Element> propertys = propertysub.selectNodes(element);// 查找節(jié)點(diǎn)
        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 實(shí)例
      *
      * @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");//調(diào)用自定義容器的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;
    /**
     * 業(yè)務(wù)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();
     }
     
     
    }



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


    posted @ 2009-08-27 14:46 笑口常開、財(cái)源滾滾來! 閱讀(153) | 評論 (0)編輯 收藏
    僅列出標(biāo)題
    共3頁: 上一頁 1 2 3 下一頁 
     
    主站蜘蛛池模板: 亚洲AV日韩精品久久久久| 亚洲国产精品13p| 四虎永久在线精品免费观看地址 | 国内精品久久久久影院免费| 香港a毛片免费观看| 免费能直接在线观看黄的视频| 成人免费无码大片a毛片| 国产偷国产偷亚洲高清日韩| 久久精品国产精品亚洲蜜月| 成人亚洲国产va天堂| 四虎影视久久久免费| 日本一卡精品视频免费| 好男人看视频免费2019中文| 免费在线视频一区| 亚洲国产国产综合一区首页| 亚洲乱妇老熟女爽到高潮的片| 国产无限免费观看黄网站| 亚洲视频在线免费看| 免费h黄肉动漫在线观看| 亚洲乱码精品久久久久..| 亚洲欧洲国产综合| 青青视频免费在线| 日韩精品久久久久久免费| 国产精品99久久免费| 亚洲爆乳精品无码一区二区三区| 亚洲一级毛片免观看| 又黄又大的激情视频在线观看免费视频社区在线 | 国产高清在线免费| 日韩亚洲欧洲在线com91tv| 久久综合久久综合亚洲| A级毛片成人网站免费看| 精品香蕉在线观看免费| 久久精品亚洲福利| 亚洲字幕AV一区二区三区四区| 中文在线观看国语高清免费| 无码免费午夜福利片在线 | 亚洲精品GV天堂无码男同| 免费黄色电影在线观看| 在线免费观看韩国a视频| 亚洲精品国产免费| 久久av免费天堂小草播放|