千山鸟飞绝 万径人踪灭
勤练内功,不断实践招数。争取早日成为武林高手

转载: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 笑口常开、财源滚滚来! 阅读(1300) | 评论 (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 笑口常开、财源滚滚来! 阅读(1619) | 评论 (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 笑口常开、财源滚滚来! 阅读(439) | 评论 (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 笑口常开、财源滚滚来! 阅读(238) | 评论 (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 笑口常开、财源滚滚来! 阅读(2177) | 评论 (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 笑口常开、财源滚滚来! 阅读(199) | 评论 (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 笑口常开、财源滚滚来! 阅读(683) | 评论 (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 笑口常开、财源滚滚来! 阅读(1599) | 评论 (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("//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 笑口常开、财源滚滚来! 阅读(234) | 评论 (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("//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 笑口常开、财源滚滚来! 阅读(152) | 评论 (0)编辑 收藏
仅列出标题
共3页: 上一页 1 2 3 下一页