??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区激情,国产精品无码2021在线观看,精品亚洲精品http://www.aygfsteel.com/keweibo/category/25072.html一? Java 多能 Delphi,Powerbuilder ... zh-cnFri, 14 Oct 2011 16:06:59 GMTFri, 14 Oct 2011 16:06:59 GMT60[转]Spring加蝲resource时classpath*:与classpath:的区?http://www.aygfsteel.com/keweibo/articles/361260.htmlKeKeFri, 14 Oct 2011 03:58:00 GMThttp://www.aygfsteel.com/keweibo/articles/361260.htmlhttp://www.aygfsteel.com/keweibo/comments/361260.htmlhttp://www.aygfsteel.com/keweibo/articles/361260.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/361260.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/361260.html

Spring可以通过指定classpath*:与classpath:前缀加\径的方式从classpath加蝲文g,如bean的定义文?classpath*:的出现是Z(jin)从多个jar文g中加载相同的文g.classpath:只能加蝲扑ֈ的第一个文?

比如 resource1.jar中的package 'com.test.rs' 有一?'jarAppcontext.xml' 文g,内容如下:

<bean name="ProcessorImplA" class="com.test.spring.di.ProcessorImplA" />

resource2.jar中的package 'com.test.rs' 也有一?'jarAppcontext.xml' 文g,内容如下:

<bean id="ProcessorImplB" class="com.test.spring.di.ProcessorImplB" />

 

通过使用下面的代码则可以两个jar包中的文仉加蝲q来

ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath*:com/test/rs/jarAppcontext.xml");

 

而如果写成下面的代码,只能找到其中的一个xml文g(序取决于jar包的加蝲序)

ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/test/rs/jarAppcontext.xml");

 

classpath*:的用是Z(jin)多个component(最l发布成不同的jar?q行开?各自的bean定义文g按照一定的规则:package+filename,而用这些component的调用者可以把q些文g都加载进?

 

classpath*:的加载用了(jin)classloader?getResources() Ҏ(gu),如果是在不同的J2EE服务器上q行,׃应用服务器提供自qclassloader实现Q它们在处理jar文g时的行ؓ(f)也许?x)有所不同? 要测?classpath*: 是否有效Q可以用classloader从classpath中的jar文g里加载文件来q行试Q? getClass().getClassLoader().getResources("<someFileInsideTheJar>") ?上面的例子是在sun的jre中运行的状?

 

来自Q?a target="_blank">http://blog.csdn.net/kkdelta/article/details/5507799




Ke 2011-10-14 11:58 发表评论
]]>
struts2 + spring, 使用session圍的Bean的配|事?/title><link>http://www.aygfsteel.com/keweibo/articles/358063.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 06 Sep 2011 02:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/358063.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/358063.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/358063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/358063.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/358063.html</trackback:ping><description><![CDATA[<div>異常信息:<br />Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.</div><br />解決Ҏ(gu):<br /><br />1. 在web.xml文g中添加listener<br /><br /><div><listener><br />        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class><br /></listener><br /></div>2. 相應的spring bean配置中應加入<strong><span style="color: red;"><aop:scoped-proxy/></span></strong>此行代碼<br /><br /><div><bean id="userAction" class="org.gecs.mes.common.action.UserAction" autowire="byName" <strong><span style="color: red;">scope="session"></span></strong><br />       <strong><span style="color: red;"> <aop:scoped-proxy/></span></strong><br /></bean><br /><br /></div><img src ="http://www.aygfsteel.com/keweibo/aggbug/358063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2011-09-06 10:22 <a href="http://www.aygfsteel.com/keweibo/articles/358063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring注解入门(?http://www.aygfsteel.com/keweibo/articles/295152.htmlKeKeTue, 15 Sep 2009 07:20:00 GMThttp://www.aygfsteel.com/keweibo/articles/295152.htmlhttp://www.aygfsteel.com/keweibo/comments/295152.htmlhttp://www.aygfsteel.com/keweibo/articles/295152.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/295152.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/295152.html

轉自Qhttp://blog.csdn.net/huxin1/archive/2008/12/31/3669583.aspx
document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "\r\n\n本文来自CSDN博客Q{载请标明出处Q? + location.href; clipboardData.setData("text", text); } }, 100); } } 1. 使用Spring注解来注入属?
1.1. 使用注解以前我们是怎样注入属性的
cȝ实现Q?
  1. public class UserManagerImpl implements UserManager {   
  2.     private UserDao userDao;   
  3.     public void setUserDao(UserDao userDao) {   
  4.         this.userDao = userDao;   
  5.     }   
  6.     ...   
  7. }  

配置文gQ?
Java代码
  1. <bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl">   
  2.     <property name="userDao" ref="userDao" />   
  3. </bean>   
  4. <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl">   
  5.     <property name="sessionFactory" ref="mySessionFactory" />   
  6. </bean>  


1.2. 引入@Autowired注解Q不推荐使用Q徏议用@ResourceQ?
cȝ实现Q对成员变量q行标注Q?
Java代码 复制代码
  1. public class UserManagerImpl implements UserManager {   
  2.     @Autowired  
  3.     private UserDao userDao;   
  4.     ...   
  5. }  

或者(Ҏ(gu)法进行标注)(j)
Java代码 复制代码
  1. public class UserManagerImpl implements UserManager {   
  2.     private UserDao userDao;   
  3.     @Autowired  
  4.     public void setUserDao(UserDao userDao) {   
  5.         this.userDao = userDao;   
  6.     }   
  7.     ...   
  8. }  

配置文g
Java代码 复制代码
  1. <bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl" />   
  2. <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl">   
  3.     <property name="sessionFactory" ref="mySessionFactory" />   
  4. </bean>  

@Autowired可以Ҏ(gu)员变量、方法和构造函数进行标注,来完成自动装配的工作。以上两U不同实现方? 中,@Autowired的标注位|不同,它们都会(x)在Spring在初始化userManagerImplq个beanӞ自动装配userDaoq个? 性,区别是:(x)W一U实CQSpring?x)直接将UserDaocd的唯一一个bean赋值给userDaoq个成员变量Q第二种实现中,Spring? 调用setUserDaoҎ(gu)来将UserDaocd的唯一一个bean装配到userDaoq个属性?

1.3. 让@Autowired工作h
要@Autowired能够工作Q还需要在配置文g中加入以下代?
Java代码 复制代码
  1. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />  


1.4. @Qualifier
@Autowired是根据类型进行自动装配的。在上面的例子中Q如果当 Spring上下文中存在不止一个UserDaocd的beanӞ׃(x)抛出BeanCreationException异常Q如果Spring上下文中 不存在UserDaocd的beanQ也?x)抛出BeanCreationException异常。我们可以用@Qualifier配合 @Autowired来解册些问题?
1. 可能存在多个UserDao实例
Java代码 复制代码
  1. @Autowired  
  2. public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
  3.     this.userDao = userDao;   
  4. }  

q样QSpring?x)找到id为userDao的beanq行装配?
2. 可能不存在UserDao实例

Java代码 复制代码
  1. @Autowired(required = false)   
  2. public void setUserDao(UserDao userDao) {   
  3.     this.userDao = userDao;   
  4. }  


1.5. @ResourceQJSR-250标准注解Q推荐用它来代替Spring专有的@Autowired注解Q?
Spring 不但支持自己定义的@Autowired注解Q还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及(qing)@PreDestroy?
@Resource 的作用相当于@AutowiredQ只不过@Autowired按byType自动注入Q而@Resource默认按byName自动注入|了(jin)? @Resource有两个属性是比较重要的,分别是name和typeQSpring@Resource注解的name属性解析ؓ(f)bean的名字,? type属性则解析为bean的类型。所以如果用name属性,则用byName的自动注入策略,而用type属性时则用byType自动注入{? 略。如果既不指定name也不指定type属性,q时通过反射机制使用byName自动注入{略?
@Resource装配序
  1. 如果同时指定?jin)name和typeQ则从Spring上下文中扑ֈ唯一匚w的beanq行装配Q找不到则抛出异?
  2. 如果指定?jin)nameQ则从上下文中查扑֐UͼidQ匹配的beanq行装配Q找不到则抛出异?
  3. 如果指定?jin)typeQ则从上下文中找到类型匹配的唯一beanq行装配Q找不到或者找到多个,都会(x)抛出异常
  4. 如果既没有指定nameQ又没有指定typeQ则自动按照byName方式q行装配Q见2Q;如果没有匚wQ则回退Z个原始类型(UserDaoQ进行匹配,如果匚w则自动装配;


1.6. @PostConstructQJSR-250Q?
在方法上加上注解@PostConstructQ这个方法就?x)在Bean初始化之后被Spring容器执行Q注QBean初始化包括,实例化BeanQƈ装配Bean的属性(依赖注入Q)(j)?
它的一个典型的应用场景是,当你需要往Bean里注入一个其父类中定义的属性,而你又无法复写父cȝ属性或属性的setterҎ(gu)Ӟ如:(x)
Java代码 复制代码
  1. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {   
  2.     private SessionFactory mySessionFacotry;   
  3.     @Resource  
  4.     public void setMySessionFacotry(SessionFactory sessionFacotry) {   
  5.         this.mySessionFacotry = sessionFacotry;   
  6.     }   
  7.     @PostConstruct  
  8.     public void injectSessionFactory() {   
  9.         super.setSessionFactory(mySessionFacotry);   
  10.     }   
  11.     ...   
  12. }  

q里通过@PostConstructQؓ(f)UserDaoImpl的父c里定义的一个sessionFactoryU有属性,注入? 我们自己定义的sessionFactoryQ父cȝsetSessionFactoryҎ(gu)为finalQ不可复写)(j)Q之后我们就可以通过调用 super.getSessionFactory()来访问该属性了(jin)?

1.7. @PreDestroyQJSR-250Q?
在方法上加上注解@PreDestroyQ这个方法就?x)在Bean初始化之后被Spring容器执行。由于我们当前还没有需要用到它的场景,q里不不LC。其用法同@PostConstruct?

1.8. 使用<context:annotation-config />化配|?
Spring2.1 d?jin)一个新的context的Schema命名I间Q该命名I间Ҏ(gu)释驱动、属性文件引入、加载期l入{功能提供了(jin)便捷的配|。我们知道注释本w是不会(x) 做Q何事情的Q它仅提供元数据信息。要使元数据信息真正起作用,必须让负责处理这些元数据的处理器工作h?
AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor是处理q些注释元数据的处理器。但是直接在Spring配置文g中定义这? Bean昑־比较W拙。Spring为我们提供了(jin)一U方便的注册q些BeanPostProcessor的方式,q就 ?lt;context:annotation-config />Q?
Java代码 复制代码
  1. <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"  
  2.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  3.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  4.     http://www.springframework.org/schema/context   
  5.     http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
  6.     <context:annotation-config />   
  7. </beans>  

<context:annotationconfig />隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor? CommonAnnotationBeanPostProcessor? PersistenceAnnotationBeanPostProcessor以及(qing) RequiredAnnotationBeanPostProcessorq?个BeanPostProcessor?

2. 使用Spring注解完成Bean的定?
以上我们介绍?jin)通过@Autowired或@Resource来实现在Bean中自动注入的功能Q下面我们将介绍如何注解BeanQ从而从XML配置文g中完全移除Bean定义的配|?

2.1. @ComponentQ不推荐使用Q、@Repository、@Service、@Controller
只需要在对应的类上加上一个@Component注解Q就该cd义ؓ(f)一个Bean?jin)?x)
Java代码 复制代码
  1. @Component  
  2. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {   
  3.     ...   
  4. }  

使用@Component注解定义的BeanQ默认的名称QidQ是写开头的非限定类名。如q里定义的Bean名称是userDaoImpl。你也可以指定Bean的名Uͼ(x)
@Component("userDao")
@Component 是所有受Spring理lg的通用形式QSpringq提供了(jin)更加l化的注解Ş式:(x)@Repository、@Service? @ControllerQ它们分别对应存储层BeanQ业务层BeanQ和展示层Bean。目前版本(2.5Q中Q这些注解与@Component的语? 是一L(fng)Q完全通用Q在Spring以后的版本中可能?x)给它们q加更多的语义。所以,我们推荐使用@Repository、@Service? @Controller来替代@Component?

2.2. 使用<context:component-scan />让Bean定义注解工作h
Java代码 复制代码
  1. <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"  
  2.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  3.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  4.     http://www.springframework.org/schema/context   
  5.     http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
  6.     <context:component-scan base-package="com.kedacom.ksoa" />   
  7. </beans>  

q里Q所有通过<bean>元素定义Bean的配|内容已l被U除Q仅需要添加一 ?lt;context:component-scan />配置px(chng)有问题(sh)(jin)——Spring XML配置文g得到?jin)极致的化(当然配置元数据还是需要的Q只不过以注释Ş式存在Ş?jin)?j)?lt;context:component-scan />的base-package属性指定了(jin)需要扫描的cdQ类包及(qing)光归子包中所有的c都?x)被处理?
<context:component-scan />q允许定义过滤器基包下的某些类U_或排除。Spring支持以下4U类型的qo(h)方式Q?
  • qo(h)器类?表达式范?说明
  • 注解 org.example.SomeAnnotation 所有用SomeAnnotation注解的类qo(h)出来
  • cd指定 org.example.SomeClass qo(h)指定的类
  • 正则表达?com\.kedacom\.spring\.annotation\.web\..* 通过正则表达式过滤一些类
  • AspectJ表达?org.example..*Service+ 通过AspectJ表达式过滤一些类

以正则表辑ּZQ我列D一个应用实例:(x)
Java代码 复制代码
  1. <context:component-scan base-package="com.casheen.spring.annotation">   
  2.     <context:exclude-filter type="regex" expression="com\.casheen\.spring\.annotation\.web\..*" />   
  3. </context:component-scan>  

值得注意的是<context:component-scan />配置不但启用了(jin)对类包进行扫描以实施注释驱动Bean定义的功能,同时q启用了(jin)注释驱动自动注入的功能(卌隐式地在内部注册? AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessorQ, 因此当?lt;context:component-scan />后,可以将<context:annotation-config />U除?jin)?

2.3. 使用@Scope来定义Bean的作用范?
在用XML定义BeanӞ我们可能q需要通过bean的scope属性来定义一个Bean的作用范_(d)我们同样可以通过@Scope注解来完成这工作:(x)
Java代码 复制代码
  1. @Scope("session")   
  2. @Component()   
  3. public class UserSessionBean implements Serializable {   
  4.     ...   
  5. }  


3. 参?
http://kingtai168.javaeye.com/blog/244002
http://www.javaeye.com/topic/244153
http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config
http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-classpath-scanning



Ke 2009-09-15 15:20 发表评论
]]>用Spring的JdbcTemplate实现分页功能http://www.aygfsteel.com/keweibo/articles/194354.htmlKeKeSun, 20 Apr 2008 11:32:00 GMThttp://www.aygfsteel.com/keweibo/articles/194354.htmlhttp://www.aygfsteel.com/keweibo/comments/194354.htmlhttp://www.aygfsteel.com/keweibo/articles/194354.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/194354.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/194354.htmlOracle数据库,使用伪列ROWNUM来实现分c(din)分代码如下:(x)
  
  package com.deity.ranking.util;
        import java.util.List;
  import org.springframework.jdbc.core.JdbcTemplate;
  import org.springframework.jdbc.core.support.JdbcDaoSupport;
  /** * 分页函数 * 
        * @author allenpan */
public class Pagination extends JdbcDaoSupport{
  public static final int NUMBERS_PER_PAGE = 10;
  //一|C的记录?br />   private int numPerPage;
  //记录L
  private int totalRows;
  //总页?br />   private int totalPages;
  //当前늠
  private int currentPage;
  //起始行数
  private int startIndex;
  //l束行数
  private int lastIndex;
  //l果集存放List
  private List resultList;
  //JdbcTemplate jTemplate
  private JdbcTemplate jTemplate;
  /**
  * 每页昄10条记录的构造函?使用该函数必dlPagination讄currentPageQjTemplate初?br />   * @param sql oracle语句
  */
  public Pagination(String sql){
  if(jTemplate == null){
  throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
  }else if(sql.equals("")){
  throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
  }
  new Pagination(sql,currentPage,NUMBERS_PER_PAGE,jTemplate);
  }
  /**分页构造函?br />   * @param sql Ҏ(gu)传入的sql语句得到一些基本分信?br />   * @param currentPage 当前?br />   * @param numPerPage 每页记录?br />   * @param jTemplate JdbcTemplate实例
  */
  public Pagination(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){
  if(jTemplate == null){
  throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
  }else if(sql == null || sql.equals("")){
  throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
  }
  //讄每页昄记录?br />   setNumPerPage(numPerPage);
  //讄要显C的|
  setCurrentPage(currentPage);
  //计算总记录数
  StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
  totalSQL.append(sql);
  totalSQL.append(" ) totalTable ");
  //lJdbcTemplate赋?br />   setJdbcTemplate(jTemplate);
  //总记录数
  setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString()));
  //计算总页?br />   setTotalPages();
  //计算起始行数
  setStartIndex();
  //计算l束行数
  setLastIndex();
  System.out.println("lastIndex="+lastIndex);//////////////////
  //构造oracle数据库的分页语句
  StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");
  paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");
  paginationSQL.append(sql);
  paginationSQL.append(" ) temp where ROWNUM <= " + lastIndex);
  paginationSQL.append(" ) WHERE num > " + startIndex);
  //装入l果?br />   setResultList(getJdbcTemplate().queryForList(paginationSQL.toString()));
  }
  /**
  * @param args
  */
  public static void main(String[] args) {
  // TODO Auto-generated method stub    }
  public int getCurrentPage() {
  return currentPage;
  }
  public void setCurrentPage(int currentPage) {
  this.currentPage = currentPage;
  }
  public int getNumPerPage() {
  return numPerPage;
  }
  public void setNumPerPage(int numPerPage) {
  this.numPerPage = numPerPage;
  }
  public List getResultList() {
  return resultList;    }
  public void setResultList(List resultList) {
  this.resultList = resultList;
  }
  public int getTotalPages() {
  return totalPages;
  }
  //计算总页?br />   public void setTotalPages() {
  if(totalRows % numPerPage == 0){
  this.totalPages = totalRows / numPerPage;
  }else{
  this.totalPages = (totalRows / numPerPage) + 1;
  }
  }
  public int getTotalRows() {
  return totalRows;
  }
  public void setTotalRows(int totalRows) {
  this.totalRows = totalRows;
  }
  public int getStartIndex() {
  return startIndex;
  }
  public void setStartIndex() {
  this.startIndex = (currentPage - 1) * numPerPage;
  }
  public int getLastIndex() {
  return lastIndex;
  }
  public JdbcTemplate getJTemplate() {
  return jTemplate;
  }
  public void setJTemplate(JdbcTemplate template) {
  jTemplate = template;
  }
  //计算l束时候的索引
  public void setLastIndex() {
  System.out.println("totalRows="+totalRows);///////////
  System.out.println("numPerPage="+numPerPage);///////////
  if( totalRows < numPerPage){
  this.lastIndex = totalRows;
  }else if((totalRows % numPerPage == 0) || (totalRows % numPerPage != 0 && currentPage < totalPages)){
  this.lastIndex = currentPage * numPerPage;
  }else if(totalRows % numPerPage != 0 && currentPage == totalPages){//最后一?br />   this.lastIndex = totalRows ;
  }
  }}在我的业务逻辑代码中:(x)
  /**
  * find season ranking list from DC
  * @param areaId 选手区域id
  * @param rankDate 赛季
  * @param category cd
  * @param characterName 角色?br />   * @return List
  */
  public List findSeasonRankingList(Long areaId, int rankYear,int rankMonth,
  Long categoryId,String characterName) {
  //SQL语句
  StringBuffer sql = new StringBuffer(" SELECT C.USERID userid,D.POSNAME posname,C.GAMEID gameid,C.AMOUNT amount,C.RANK rank FROM ");
  //表            sql.append(" (SELECT B.USERID USERID,");
  sql.append(" B.POSID POSID,");
  sql.append(" A.DISTRICT_CODE DISTRICTCODE,");
  sql.append(" A.GAMEID GAMEID,");
  sql.append(" AMOUNT AMOUNT,");
  sql.append(" RANK RANK ");
  sql.append(" FROM TB_FS_RANK A ");
  sql.append(" LEFT JOIN TB_CHARACTER_INFO B ");
  sql.append(" ON A.DISTRICT_CODE = B.DISTRICT_CODE ");
  sql.append(" AND A.GAMEID = B.GAMEID ");
  //附加条g
  if(areaId != null && areaId.intValue() != 0){
  sql.append(" and A.DISTRICT_CODE = " + areaId.intValue());
  }
  if( rankYear > 1970 && rankMonth > 0){
  //hql.append(" and sas.id.dt >= to_date('" + rankYear + "-" + rankMonth + "-01 00:00:00'," + "YYYY-MM-DD HH24:MI:SS");
  //hql.append(" and sas.id.dt <= to_date('" + rankYear + "-" + rankMonth + "-" + TimeTool.findMaxDateInMonth(rankYear,rankMonth) + " 23:59:59'," + "YYYY-MM-DD HH24:MI:SS");
  sql.append(" and A.DT = fn_time_convert(to_date('" + rankYear + "-" + rankMonth + "'," + "'YYYY-MM')) ");
  }
  if(categoryId != null && categoryId.intValue() != 0){
  sql.append(" and A.CID = " + categoryId.intValue());
  }
  if(characterName != null && !characterName.trim().equals("")){
  sql.append(" and A.GAMEID = '" + characterName.trim()+"' ");
  }
  sql.append(" ORDER BY RANK ASC) C ");
  sql.append(" LEFT JOIN TB_FS_POSITION D ");
  sql.append(" ON C.POSID = D.POSID ");
  sql.append(" ORDER BY C.RANK ");
  System.out.println("hql="+sql.toString());////////////////
  //使用自己的分늨序控制结果集
  Pagination pageInfo = new Pagination(sql.toString(),1,10,getJdbcTemplate());
  return pageInfo.getResultList();
  //return getJdbcTemplate().queryForList(sql.toString());
  }
文章來源Qhttp://java.chinaitlab.com/Spring/38091.html

Ke 2008-04-20 19:32 发表评论
]]>
[转]一个泛型Hibernate DAO实现http://www.aygfsteel.com/keweibo/articles/184372.htmlKeKeThu, 06 Mar 2008 15:17:00 GMThttp://www.aygfsteel.com/keweibo/articles/184372.htmlhttp://www.aygfsteel.com/keweibo/comments/184372.htmlhttp://www.aygfsteel.com/keweibo/articles/184372.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/184372.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/184372.html阅读全文

Ke 2008-03-06 23:17 发表评论
]]>
?用Spring快速开发jms应用QJBOSS服务器)(j)http://www.aygfsteel.com/keweibo/articles/175545.htmlKeKeTue, 15 Jan 2008 13:00:00 GMThttp://www.aygfsteel.com/keweibo/articles/175545.htmlhttp://www.aygfsteel.com/keweibo/comments/175545.htmlhttp://www.aygfsteel.com/keweibo/articles/175545.html#Feedback2http://www.aygfsteel.com/keweibo/comments/commentRss/175545.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/175545.htmlJava消息服务(JMS)是用于编写用异步消息传递的JEE应用E序的API。传l的使用JMS APIq行消息传递的实现包括多个步骤Q例如JNDI查询队列q接工厂和Queue资源Q在实际发送和接收消息前创Z个JMS?x)话?

   Spring框架则简化了(jin)使用JEElg(包括JMS)的Q务。它提供的模板机刉藏了(jin)典型的JMS实现的细节,q样开发h员可以集中精力放在处理消息的实际工作中,而不用担?j)如何去创徏Q访问或清除JMS资源?/p>

   本文对Spring JMS API作一个概qͼq过一个运行在JBoss MQ服务器上的web例程来介l如何用Spring JMS API来异步处理(发送和接收Q消息。我通过传统JMS实现和Spring JMS实现两者间的比较,来展CZ用Spring JMS处理消息是如何的单和灉|?/p>

异步消息传递和面向服务架构

  在现实中Q大多数webh都是同步处理的。例如,当用戯d一个网站,首先输入用户名和密码Q然后服务器验证d合法性。如果验证成功,E序允许该用户q入|站。这里,dh在从客户端接收以后被x(chng)处理?jin)。信用卡验证是另一个同步处理的例子Q只有服务器证实输入的信用卡h有效的,同时客户在帐户上有够的存款Q客h被允许l操作。但是让我们思考一下在序处理pȝ上的支付l算步骤。一旦系l证实该用户信用卡的信息是准的Qƈ且在帐户上有_的资金,׃必等到所有的支付l节落实、{账完成。支付结可以异步方式进行,q样客户可以l箋(hu)q行核查操作?/p>

   需要比典型同步h耗费更长旉的请求,可以使用异步处理。另一个异步处理的例子是,在本地贷Ƒ֤理程序中Q提交至自动扉KpȝQAUSQ的信用h处理q程。当借方提交h甌后,抉|公司?x)向AUS发送请求,以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告,包括借方C和过ȝ帐户Q最q的付款和其他胦(ch)务资料,服务器需要耗费较长的时_(d)几小时或着有时甚至是几天)(j)来对q些h作出响应。客L(fng)E序Q应用)(j)要与服务器连接ƈ耗费如此长的旉来等待结果,q是毫无意义的。因此通信应该是异步发生的Q也是Q一旦请求被提交Q它?yu)p攄在队列中Q同时客L(fng)与服务器断开q接。然后AUS服务从指定的队列中选出hq行处理Qƈ处理得到的消息攄在另一个消息队列里。最后,客户端程序从q个队列中选出处理l果Q紧接着处理q个信用历史数据?/p>

JMS

   如果(zhn)用过JMS代码Q?zhn)会(x)发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯Q得每一ơ?zhn)需要写一个新cL发送和接收消息Ӟ都具有更好的代码密集性和重复性。以下序列显CZ(jin)传统JMS实现所包括的步骤:(x)

  1. 创徏JNDI初始上下文(contextQ?
  2. 从JNDI上下文获取一个队列连接工厂?
  3. 从队列连接工厂中获取一个Quene?
  4. 创徏一个Session对象?
  5. 创徏一个发送者(senderQ或接收者(receiverQ对象?
  6. 使用步骤5创徏的发送者或接收者对象发送或接收消息?
  7. 处理完消息后Q关闭所有JMS资源?

(zhn)可以看刎ͼ步骤6是处理消息的唯一地方。其他步骤都只是理与实际业务要求无关的JMS资源Q但是开发h员必ȝ写ƈl护q些额外步骤的代码?/p>

Spring JMS

   Spring框架提供?jin)一个模板机制来隐藏Java APIs的细节。JEE开发h员可以用JDBCTemplate和JNDITemplatecL分别讉K后台数据库和JEE资源Q数据源Q连接池Q。JMS也不例外。Spring提供JMSTemplatec,因此开发h员(sh)用ؓ(f)一个JMS实现ȝ写样本代码。接下来是在开发JMS应用E序时Spring所h一些的优势?/p>

  1. 提供JMS抽象APIQ简化了(jin)讉K目标Q队列或主题Q和向指定目标发布消息时JMS的用?
  2. JEE开发h员(sh)需要关?j)JMS不同版本Q例如JMS 1.0.2与JMS 1.1Q之间的差异?
  3. 开发h员(sh)必专门处理JMS异常Q因为Spring为所有JMS异常提供?jin)一个未l检查的异常Qƈ在JMS代码中重新抛出?

CZE序

        说明Q因为只是ؓ(f)?jin)演C如何用spring~写jms的应用,所以本例没有什么实际用途?/p>

        E序功能QMessageProducer.javaҎ(gu)一用户信息产生一个消息发送到 JMS ProviderQ由MessageConsumer.java接收?/p>

1.在Jboss里配|XML文g创徏一个新的JMS provider?br /> 打开位于%JBOSS_HOME%server\default\deploy\jms文g夹下的jbossmq-destinations-service.xml文gQ加入以下代码片断:(x)
 <!--  Register User Send/Receive Queue  -->
 <mbean code="org.jboss.mq.server.jmx.Queue"
   name="jboss.mq.destination:service=Queue,name=registerUserQueue">
   <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
 </mbean>
 <!--  Register User Send/Receive Topic  -->
 <mbean code="org.jboss.mq.server.jmx.Topic"
  name="jboss.mq.destination:service=Topic,name=registerUserTopic">
   <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
 </mbean>
2.在spring的配|文件中配置JMSlg的具体细节?br />  Q?QJNDI上下文是取得JMS资源的v始位|,因此首先我们要配|JNDI模板Q?br />     <!-- JNDI上下?它是取得JMS资源的v始位|? -->
   <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
     <props>
      <prop key="java.naming.factory.initial">
       org.jnp.interfaces.NamingContextFactory
      </prop>
      <prop key="java.naming.provider.url">localhost</prop>
      <prop key="java.naming.factory.url.pkgs">
       org.jnp.interfaces:org.jboss.naming
      </prop>
     </props>
    </property>
   </bean>
   注意Q此JNDI模板用到?jin)org.jnp.interfaces.NamingContextFactory所以要?JBOSS_HOME%\client下的jbossall-client.jar加到你的目的classpath中?br /> Q?Q配|连接工厂:(x)
   <!-- JMSq接工厂 -->
     <bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
     <ref bean="jndiTemplate" />
    </property>
    <property name="jndiName">
     <value>XAConnectionFactory</value>
    </property>
   </bean>
   注意QXAConnectionFactoryq个JNDI名字是在%JBOSS_HOME%server\default\deploy\jms文g夹下的jms-ds.xml中定义的(它是由JBoss指定??br />  Q?Q配|JmsTemplatelg。在例程中我们用JmsTemplate102。同时用defaultDestination属性来指定JMS目标?br />   <!-- JMS模板配置 -->
  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
   <property name="connectionFactory" ref="jmsConnectionFactory" />
   <property name="defaultDestination" ref="destination" />
   <property name="pubSubDomain">
    <value>true</value>
   </property>
   <!-- {待消息的时?ms) -->
   <property name="receiveTimeout">
         <value>30000</value>
      </property>
  </bean>
  注意Q如果用topic-subscribe(主题订阅)模式Q该模板的pubSubDomain属性gؓ(f)true;若用PToP(点对?模式QpubSubDomain属性gؓ(f)false或不配置该属性?br />  (4)定义一个JMS目标来发送和接收消息:
  <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
   <property name="jndiTemplate">
    <ref bean="jndiTemplate" />
   </property>
   <property name="jndiName">
    <value>topic/registerUserTopic</value>
   </property>
  </bean>
 (5)配置发送者和接收者组?
  <!-- 消息发布?-->
  <bean id="msgProducer" class="com.boco.jms.MessageProducer">
   <property name="jmsTemplate" ref="jmsTemplate" />
  </bean>
  <!-- 消息接收?-->
  <bean id="msgConsumer" class="com.boco.jms.MessageConsumer">
   <property name="jmsTemplate" ref="jmsTemplate" />
  </bean>
3.相应的类:
 (1). User对象?br />    /**
   *  User.java
   *  created on Jul 2, 2006
   *  Copyrights 2006 BOCO,Inc. All rights reserved.
   */
  package com.boco.dto;
  
  import java.io.Serializable;
  
  /**
   * desc: 用户信息 Bean
   * @author qiujy
   */
  public class User {
   private int id;
   private String username;
   private String password;
   private String email;
   
   public User(){}
   
   //以下为Getter,setterҎ(gu)?br />    ......
  }
  
 (2).消息生者:(x)
   /**
   *  MessageProducer.java
   *  created on Jul 22, 2006
   *  Copyrights 2006 BOCO,Inc. All rights reserved.
   */
  package com.boco.jms;
  
  import javax.jms.JMSException;
  import javax.jms.MapMessage;
  import javax.jms.Message;
  import javax.jms.Session;
  
  import org.springframework.jms.core.JmsTemplate;
  import org.springframework.jms.core.MessageCreator;
  
  import com.boco.dto.User;
  
  /**
   * desc:消息生?br />    * @author qiujy
   *
   */
  public class MessageProducer {
   /** JMS模板 */
   private JmsTemplate jmsTemplate;
   
   public void setJmsTemplate(JmsTemplate jmsTemplate){
    this.jmsTemplate = jmsTemplate;
   }
   
   public void sendMessage(final User user){
    //调用模板的send来发送消?br />     jmsTemplate.send(new MessageCreator(){
  
     public Message createMessage(Session session) throws JMSException {
      //构造一个要发送的消息
      MapMessage message = session.createMapMessage();
       message.setInt("id", user.getId());
       message.setString("username", user.getUsername());
       message.setString("password", user.getPassword());
       message.setString("email", user.getEmail());
      System.out.println("send success!!");
      return message;
     }
    });
   }
  }
  
 (3).消息消费者:(x)
  /**
   *  MessageConsumer.java
   *  created on Jul 22, 2006
   *  Copyrights 2006 BOCO,Inc. All rights reserved.
   */
  package com.boco.jms;
  
  import javax.jms.JMSException;
  import javax.jms.MapMessage;
  
  import org.springframework.jms.core.JmsTemplate;
  
  import com.boco.dto.User;
  
  /**
   * desc:消息消费?br />    * @author qiujy
   *
   */
  public class MessageConsumer {
   /** JMS模板 */
   private JmsTemplate jmsTemplate;
   
   public void setJmsTemplate(JmsTemplate jmsTemplate){
    this.jmsTemplate = jmsTemplate;
   }
   
   public User receiveMessage(){
    //参数为Destination的JNDI名字L前面的模式类型标?br />     //MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserQueue");
    MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserTopic");
    User user = new User();
    
    try {
     user.setId(msg.getInt("id"));
     user.setUsername(msg.getString("username"));
     user.setPassword(msg.getString("password"));
     user.setEmail(msg.getString("email"));
    } catch (JMSException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
    return user;
   }
  }

 (4).试用例Q?br />    //======== 生者测试用?===============
   /**
   *  TestMsgProducer.java
   *  created on Jul 22, 2006
   *  Copyrights 2006 BOCO,Inc. All rights reserved.
   */
  package com.boco.jms;
  
  import junit.framework.TestCase;
  
  import org.springframework.context.ApplicationContext;
  import org.springframework.context.support.ClassPathXmlApplicationContext;
  
  import com.boco.dto.User;
  
  /**
   * desc:
   * @author qiujy
   *
   */
  public class TestMsgProducer extends TestCase {
  
   private ApplicationContext context;
   /**
    * @param arg0
    */
   public TestMsgProducer(String arg0) {
    super(arg0);
    context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");
   }
  
   /* (non-Javadoc)
    * @see junit.framework.TestCase#setUp()
    */
   protected void setUp() throws Exception {
    super.setUp();
   }
  
   /* (non-Javadoc)
    * @see junit.framework.TestCase#tearDown()
    */
   protected void tearDown() throws Exception {
    super.tearDown();
   }
  
   /**
    * Test method for {@link com.boco.jms.MessageProducer#sendMessage(com.boco.dto.User)}.
    */
   public void testSendMessage() {
    User user = new User();
    user.setId(132);
    user.setUsername("JMSTest");
    user.setPassword("password");
    user.setEmail("support@boco.com.cn");
    
    MessageProducer producer = (MessageProducer)context.getBean("msgProducer");
    
    producer.sendMessage(user);
    
   }
  
  }

  //============ 消费者测试用?===============
  /**
   *  TestMsgConsumer.java
   *  created on Jul 22, 2006
   *  Copyrights 2006 BOCO,Inc. All rights reserved.
   */
  package com.boco.jms;
  
  import junit.framework.TestCase;
  
  import org.springframework.context.ApplicationContext;
  import org.springframework.context.support.ClassPathXmlApplicationContext;
  
  import com.boco.dto.User;
  
  /**
   * desc:
   * @author qiujy
   *
   */
  public class TestMsgConsumer extends TestCase {
   private ApplicationContext context;
   /**
    * @param arg0
    */
   public TestMsgConsumer(String arg0) {
    super(arg0);
    context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");
   }
  
   /* (non-Javadoc)
    * @see junit.framework.TestCase#setUp()
    */
   protected void setUp() throws Exception {
    super.setUp();
   }
  
   /* (non-Javadoc)
    * @see junit.framework.TestCase#tearDown()
    */
   protected void tearDown() throws Exception {
    super.tearDown();
   }
  
   /**
    * Test method for {@link com.boco.jms.MessageConsumer#receiveMessage()}.
    */
   public void testReceiveMessage() {
    MessageConsumer consumer = (MessageConsumer)context.getBean("msgConsumer");
    User user = consumer.receiveMessage();
    assertNotNull(user);
    System.out.println( "id========" + user.getId()
        + "\nname======" + user.getUsername()
        + "\npassword==" + user.getPassword()
        + "\nemail=====" + user.getEmail());
   }
  
  }

 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1418938

启动JBOSS服务?先运行TestMsgConsumer.java;再运行TestMsgProducer.java,卛_看到控制台的输出?d~~~~~



Ke 2008-01-15 21:00 发表评论
]]>
使用外部属性文?关于PropertyPlaceholderConfigurer) http://www.aygfsteel.com/keweibo/articles/169870.htmlKeKeSun, 23 Dec 2007 14:23:00 GMThttp://www.aygfsteel.com/keweibo/articles/169870.htmlhttp://www.aygfsteel.com/keweibo/comments/169870.htmlhttp://www.aygfsteel.com/keweibo/articles/169870.html#Feedback1http://www.aygfsteel.com/keweibo/comments/commentRss/169870.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/169870.html<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:com/starxing/test/jdbc.properties</value>
        </property>
<!--
 使用locations属性定义多个配|文?br />        <property name="locations">
            <list>
                <value>classpath:config/maxid.properties</value>
                <value>classpath:config/jdoserver.properties</value>
            </list>
</property>
  -->
    </bean>
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url">
            <value>${database.url}</value>
        </property>
        <property name="driverClassName">
            <value>${database.driver}</value>
        </property>
        <property name="username">
            <value>${database.user}</value>
        </property>
        <property name="password">
            <value>${database.password}</value>
        </property>

    </bean>
</beans>

3.Config.java
package com.starxing.test;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class Config {

    public static void main(String[] args) {
        XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(
                "com/starxing/test/conf.xml"));

        // 如果要在BeanFactory中用,bean factory post-processor必须手动q行:
        PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
        cfg.setLocation(new FileSystemResource(
                "com/starxing/test/jdbc.properties"));
        cfg.postProcessBeanFactory(factory);

        DriverManagerDataSource dataSource = (DriverManagerDataSource) factory
                .getBean("dataSource");
        System.out.println(dataSource.getDriverClassName());

        // 注意QApplicationContext能够自动辨认和应用在其上部v的实C(jin)BeanFactoryPostProcessor的bean。这意味着Q当使用ApplicationContext的时候应用PropertyPlaceholderConfigurer?x)非常的方便。由于这个原因,惌使用q个或者其他bean
        // factory postprocessor的用户用ApplicationContext代替BeanFactroy?br />         ApplicationContext context = new ClassPathXmlApplicationContext(
                "com/starxing/test/conf.xml");
        DriverManagerDataSource dataSource2 = (DriverManagerDataSource) context
                .getBean("dataSource");
        System.out.println(dataSource2.getDriverClassName());
    }

}

相关文:


 使用q一解决Ҏ(gu)Q我们可以生成如下的属性文Ӟ/WEB-INF/jdbc.propertiesQ:(x)
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=

  我们的Bean配置如下Q?/p>

<bean id="propertyConfigurer" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${jdbc.driver}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.user}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>

  如上所qͼ我们定义?jin)一个PropertyPlaceholderConfigurercȝ实例Qƈ其位置属性设|ؓ(f)我们的属性文件。该c被实现为Bean工厂的后处理器,q将使用定义在文件中的属性来代替所有的占位W(${...}valueQ?/p>

  利用q种技术,我们可以从applicationContext.xml中移除所有特定于L的配|属性。通过q种方式Q我们可以自由地文gd新的BeanQ而不必担?j)特定于L属性的同步性。这样可以简化生产部|和l护?/p>



PropertyPlaceholderConfigurer作ؓ(f)一个bean factory post-processor实现Q可以用来将BeanFactory定义中的属性值放|到另一个单独的Java Properties格式的文件中。这使得用户不用对BeanFactory的主XML定义文gq行复杂和危险的修改Q就可以定制一些基本的属性(比如说数据库的urls,用户名和密码Q?

考虑一个BeanFactory定义的片断,里面用占位符定义?jin)DataSourceQ?

在下面这个例子中Q定义了(jin)一个datasourceQƈ且我们会(x)在一个外部Porperties文g中配|一些相兛_性?在运行时Q我们ؓ(f)BeanFactory提供一?tt class="literal">PropertyPlaceholderConfigurerQ它?yu)用Properties文g中的值替换掉q个datasource的属性|(x)

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>

真正的值来自于另一个Properties格式的文?

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

如果要在BeanFactory中用,bean factory post-processor必须手动q行:

XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));
cfg.postProcessBeanFactory(factory);

注意QApplicationContext能够自动辨认和应用在其上部v的实C(jin)BeanFactoryPostProcessor的bean。这意味着Q当使用ApplicationContext的时候应用PropertyPlaceholderConfigurer?x)非常的方便。由于这个原因,惌使用q个或者其他bean factory postprocessor的用户用ApplicationContext代替BeanFactroy?

PropertyPlaceHolderConfigurer不仅仅在你指定的Porperties文g中查扑ֱ性, 如果它在其中没有扑ֈ你想使用的属性,它还?sh)(x)在Java的系lproperties中查找?q个行ؓ(f)能够通过讄配置中的systemPropertiesMode 属性来定制。这个属性有三个| 一个让配置L覆盖Q一个让?span class="emphasis">覆盖Q一个让它仅在properties文g中找不到的时候覆盖?请参?PropertiesPlaceholderConfigurer的JavaDoc获得更多信息?
文章来源:http://www.cublog.cn/u/9295/showart.php?id=261437



Ke 2007-12-23 22:23 发表评论
]]>
在Servlet中调用spring中定义的Beanhttp://www.aygfsteel.com/keweibo/articles/162964.htmlKeKeSun, 25 Nov 2007 05:42:00 GMThttp://www.aygfsteel.com/keweibo/articles/162964.htmlhttp://www.aygfsteel.com/keweibo/comments/162964.htmlhttp://www.aygfsteel.com/keweibo/articles/162964.html#Feedback2http://www.aygfsteel.com/keweibo/comments/commentRss/162964.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/162964.htmlpackage dgut.ke.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.ajaxtags.helpers.AjaxXmlBuilder;
import org.ajaxtags.servlets.BaseAjaxServlet;
import org.springframework.web.context.support.WebApplicationContextUtils;

import dgut.ke.model.Book;
import dgut.ke.service.IBookService;

@SuppressWarnings("serial")
public class BookCallOut extends BaseAjaxServlet {

 private IBookService bookService;


 @Override
 public String getXmlContent(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  
  request.setCharacterEncoding("UTF-8");
  String bookName = request.getParameter("bookName");
  System.out.println("---- " + bookName);
  Book book = (Book) bookService.findForObject(
    "from Book as b where b.bookName=?",new Object[]{bookName});
  
  AjaxXmlBuilder builder = new AjaxXmlBuilder()
         .addItemAsCData("提示标题", "<P>关于书籍:<b>" + book.getBookNo() +"</b>的信息如?<br/></p>");

  
  return builder.toString();
 }


 @Override
 public void init(ServletConfig servletConfig) throws ServletException {
  // 必须在重写方法的W一行调用以下语?br />   super.init(servletConfig);
  bookService = (IBookService) WebApplicationContextUtils
   .getRequiredWebApplicationContext(getServletContext())
   .getBean("bookService");

 }

}



Ke 2007-11-25 13:42 发表评论
]]>
spring发送纯文本文g邮ghttp://www.aygfsteel.com/keweibo/articles/160850.htmlKeKeThu, 15 Nov 2007 14:35:00 GMThttp://www.aygfsteel.com/keweibo/articles/160850.htmlhttp://www.aygfsteel.com/keweibo/comments/160850.htmlhttp://www.aygfsteel.com/keweibo/articles/160850.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/160850.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/160850.htmlpackage dgut.ke.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;

public class MailTest {

 public static void main(String[] args) {
  
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  JavaMailSender mailSender = (JavaMailSender) context.getBean("mailSender");
  SimpleMailMessage mail = new SimpleMailMessage();
  mail.setFrom("sskwfnihc@gmail.com");
  mail.setTo("sskwfnihc@163.com");
  mail.setSubject("KEl你发了(jin)一邮?);
  mail.setText("This is a mailTest example");
  mailSender.send(mail);
  System.out.println("成功发送文本文Ӟ");
 }
}
spring配置文g:
... ...
<!-- 发送电(sh)子邮?-->
 <bean id="mailSender"
  class="org.springframework.mail.javamail.JavaMailSenderImpl"
  abstract="false" lazy-init="default" autowire="default"
  dependency-check="default">
  <property name="host" value="smtp.gmail.com"></property>
  <property name="port" value="465"></property>
  <property name="username">
   <value>sskwfnihc</value>
  </property>
  <property name="password">
   <value>write your password here</value>
  </property>
  <property name="javaMailProperties">
   <props>
    <prop key="mail.smtp.auth">true</prop>
    <prop key="mail.smtp.starttls.enable">true</prop>
    <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
   </props>
  </property>
 </bean>
... ...



Ke 2007-11-15 22:35 发表评论
]]>
DataAccessException http://www.aygfsteel.com/keweibo/articles/157052.htmlKeKeTue, 30 Oct 2007 13:30:00 GMThttp://www.aygfsteel.com/keweibo/articles/157052.htmlhttp://www.aygfsteel.com/keweibo/comments/157052.htmlhttp://www.aygfsteel.com/keweibo/articles/157052.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/157052.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/157052.html q意味着你在应用E序中不必强行捕莯异常,可以交由上层处理.如果直接处理SQLException ,我们需要获得特定数据库的错误代?然后判断该SQLException 的原?包装成自定义异常然后交由上层处理.现在,׃Spring 为我们提供了(jin)一个与底层数据库无关的异常体系,因此可以方便地处理各U数据访问异?Spring 甚至试图译各个数据库厂商的错误代码,然后转换为DataAccessException 异常体系中的某一个合适的子类.
        在应用程序中我们只需要捕获DataAccessException 卛_,׃DataAccessException 是从 NestedRuntimeException l承而来?因此,它完整地保存?sh)(jin)原始异常的信?

Ke 2007-10-30 21:30 发表评论
]]>
spring2.0学习(fn)W记?Bean的作用域)http://www.aygfsteel.com/keweibo/articles/154735.htmlKeKeSun, 21 Oct 2007 09:55:00 GMThttp://www.aygfsteel.com/keweibo/articles/154735.htmlhttp://www.aygfsteel.com/keweibo/comments/154735.htmlhttp://www.aygfsteel.com/keweibo/articles/154735.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/154735.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/154735.htmlBean的作用域

  在spring2.0中,一共定义了(jin)5U作用域Q分别是singleton、prototype、request、session?br /> globalSession。其中后面三U仅对WEB应用E序有效?br />   spring2.0通过scope=""属性来定义Bean有作用域Q而在spring1.x中,׃只有singleton ?br /> prototypeq两U作用域Q因此,spring1.x中定义Bean的作用域是通过singleton=“true|false" ?br /> 定义的。在spring2.0中首先应该考虑用scope属性来定义Bean 的作用域?/p>

Singleton作用?br />   
  spring2.0是默认Bean的作用域是scope="singleton"。即spring的IoC容器仅ؓ(f)每个Bean创徏一?br /> 实例q且保持Bean的引用,换言之,每次调用getBean()Ҏ(gu)hq回的BeanL同一个实例。这cM
于《设计模式》一书中的SingletonQ单例)(j)模式?/p>

  public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {};
    pubilc static Singleton getInstance() {
      return instance;
    }
  }
  ׃构造方法被x(chng)为privateQ因此,在类的外部不可实例化该类Q唯一的实例持有在?rn)态引用中
从外部获取该实例的唯一入口是调用Singleton的静(rn)态方法Singleton.getInstance().

Prototype作用?/p>

  如果需要每ơ返回Bean的新实例Q即每次都新Z个实例,则可以通过讄scope="prototype"?br /> 实现。这h们就告诉?jin)spring容器采用Prototype作用域。采用prototype作用域时Qspring容器M(x)
q回一个创建的新实例,因此spring容器一旦将实例交给客户端,׃再对其进行跟t引用了(jin)Q所?br /> 无法对prototype作用域的Bean定义destory-method,不过仍可以用init-method?br /> 其它三个属性g对WEBE序有效Q这里不作讨论?/p>

Ke 2007-10-21 17:55 发表评论
]]>
spring2.0学习(fn)W记?理解IoC的概?http://www.aygfsteel.com/keweibo/articles/154675.htmlKeKeSun, 21 Oct 2007 04:59:00 GMThttp://www.aygfsteel.com/keweibo/articles/154675.htmlhttp://www.aygfsteel.com/keweibo/comments/154675.htmlhttp://www.aygfsteel.com/keweibo/articles/154675.html#Feedback1http://www.aygfsteel.com/keweibo/comments/commentRss/154675.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/154675.html理解IoC的概?/p>

  IoC全称Inversion of Control,直译为控制反?何谓IoC?在解释此概念之前,我们来看看下面的例子
import ...

public class BookService {
  private BookDAO bookDAO = new DbBookDAO();
  
  public List<Book> listBooks(String author) {
    List<Book> books = bookDAO.listAll();
    return books ;
  }
}

可以看到,listBooksҎ(gu)的功能非常简?卛_出所有书c?而列出所有书c的功能被委托给bookDAO对象.
考虑Cc可能存在多UŞ?如数据库,XML文g{?BookDAOx(chng)为接?因此我们实现?jin)一个具?br /> 子类DbBookDAO.
  现在需要考虑的是,BookService如何持有bookDAO对象.最单的办法?在BookService的内部持?br /> 一个DbBookDAO的实?上面的例子确实是q么做的.考虑一下会(x)发现以下的问?
(1)在BookService中硬~码创徏?jin)BookDAO,如果需要另一UBookDAO的实?则需要修改BookService?br />  代码,换句话就是BookServicelg不能qBookDAO的具体实?
(2)BookDAO的实例无法被其它lg׃n.假设其它的组件也需要引用BookDAO,则多个组件很隑օ享一?br />  BookDAO实例,因ؓ(f)该实例的生命周期定义在了(jin)BookServicelg中了(jin),从而难以共?
(3)如果BookDAO仍需要引用其它资?例如DataSource,则BookService可能q需要负责管理和l护一?br />  DataSource,而这实例不是作ؓ(f)上层lgBookService的职?
(4)试BookService是复杂的,因ؓ(f)首先~写DbBookDAO,倘若DbBookDAOq(sh)赖于DataSource,是相当复?
  从以上几点可以看?如果pȝ中有大量的组?其它生命周期和相互之间的依赖关系,如果q?br /> 自己l护,不但加大的系l的复杂?而且?x)导致组件之间的极?f)紧密的耦合,l而给试和维护带来了(jin)
极大的困?
  在IoC模式?控制权发生了(jin)反{:从应用程序{Ud?jin)IoC容器.lg不再由应用程序负责创建和配置
而是由容器负?应用E序只需直接使用已经创徏q|好的组?

import ...

public class BookService {
  private BookDAO bookDAO ;
  public void setBookDAO(BookDAO bookDAO) {
   this.bookDAO = bookDAO ;
  }
  
  public List<Book> listBooks(String author) {
    List<Book> books = bookDAO.listAll();
    return books ;
  }
}
修改后的bookDAO实例不再由BookService创徏,而是由IoC容器负责某个BookDAO实例通过setBookDAO()
注入.q样做的好处:
(1)BookService不必兛_(j)如何创徏BookDAO的实?也不必关?j)BookDAO的具体实?只需要用它?yu)可以?jin)
 因此化了(jin)BookService的编?
(2)BookDAO的实例由IoC容器理,因此,可以在多个组件之间共?只要它们也实C(jin)相应的setBookDAO()
 Ҏ(gu)可以了(jin).
(3)试BookService也变成十分容易了(jin).

IoC容器负责实例化所有的lg,因此需要告诉容器如何创建组件和各组件之间的依赖关系.



Ke 2007-10-21 12:59 发表评论
]]>
spring2.0学习(fn)W记一(Bean初始?http://www.aygfsteel.com/keweibo/articles/154665.htmlKeKeSun, 21 Oct 2007 04:24:00 GMThttp://www.aygfsteel.com/keweibo/articles/154665.htmlhttp://www.aygfsteel.com/keweibo/comments/154665.htmlhttp://www.aygfsteel.com/keweibo/articles/154665.html#Feedback1http://www.aygfsteel.com/keweibo/comments/commentRss/154665.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/154665.htmlBean初始?/p>

 spring的Ioc容器Ҏ(gu)XML配置文g来初始化Bean.需要注意的一Ҏ(gu),ApplicationContext初始化Bean和基
本的BeanFactory有所不同,基本的BeanFactoryL延迟加蝲Bean,直到W一ơ调用getBean("BeanId")Ҏ(gu)
hBean实例?BeanFactory才会(x)创徏q个Bean,而ApplicationContext在自w初始化时就一ơ性创Z(jin)
所有的Bean,?jin)解q一Ҏ(gu)非常重要?因ؓ(f)ApplicationContext在初始化时就能验证XML配置文g的正?
而用BeanFactory,直到调用getBean("BeanId")Ҏ(gu)获取Bean实例?才可能会(x)发现配置错误而导致抛?br /> 异常.
 只有在非常简单的情况?使用基本的BeanFactory才可能满x(chng)们的需?l大多时候我们?br /> ApplicationContext是最佳的选择.在启动的时候就能检配|文件的错误,q比使用基本的BeanFactory
在运行一D|间后调用getBean("BeanId")抛出异常要好得多.q且,延迟加蝲?x)带来性能上的损失.
ApplicationContext׃在启动时需要一ơ性别实例化所有的Bean,如果定义的Bean比较?则启动的旉
?x)比较?



Ke 2007-10-21 12:24 发表评论
]]>
ApplicationContexthttp://www.aygfsteel.com/keweibo/articles/151696.htmlKeKeWed, 10 Oct 2007 04:53:00 GMThttp://www.aygfsteel.com/keweibo/articles/151696.htmlhttp://www.aygfsteel.com/keweibo/comments/151696.htmlhttp://www.aygfsteel.com/keweibo/articles/151696.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/151696.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/151696.html  org.springframework.context.support.FileSystemXmlApplicationContext
 可以指定XML文g的相对\径或者绝对\径读取定义文?br />  org.springframework.context.support.ClassPathXmlApplicationContext
 从CLASSPATH讄路径中读取XML定义文g
 org.springframework.context.support.XmlWebApplicationContext
 在web应用E序的文件架构中,指定相对位置d定义文g
 
ApplicationContext 可以d多个Bean定义文g,可以在实例化ApplicationContext
的实现类?以数l指定Bean定义文g的位|?例如
 ApplicationContext context = new ClassPathXmlApplicationContext(
  new String[]{"bean-config1.xml","bean-config2.xml"});
也可以用file:/ classpath 或者classpath*:表示所有的Classpath前置路径都匹?
 ApplicationContext context = new ClassPathXmlApplicationContext(
  "classpath*:beans-config.xml");
也可以指?字符,例如实现d所有以"beans"开头的XML配置文g,但要注意的是此方?br /> 只在实际的文件系l中有用,如果是在JAR文g?以是无效?
 ApplicationContext context = new ClassPathXmlApplicationContext(
  "beans*.xml");
当需要多个Bean定义文g,也可以在其中一个文件中使用<import>标签
 ... ...
 <beans>
  <import resource="beans-config1.xml" />
  <import resource="beans-config2" />
  ...
 <beans>
 此方法有一个需要注意的地方是<import>标签必有位于<bean>标签之前,定义文g必须
 在同一个目录或者是CLASSPATH之中,以相对\径指定文件位|?

Ke 2007-10-10 12:53 发表评论
]]>
dwr spring整合 http://www.aygfsteel.com/keweibo/articles/150826.htmlKeKeSun, 07 Oct 2007 04:33:00 GMThttp://www.aygfsteel.com/keweibo/articles/150826.htmlhttp://www.aygfsteel.com/keweibo/comments/150826.htmlhttp://www.aygfsteel.com/keweibo/articles/150826.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/150826.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/150826.htmlAjax,它ɋ览器可以ؓ(f)用户提供更ؓ(f)自然的浏览体?对于j2EE WEB开发h员来?使用DWR框架可以很简单的使用Ajax技?
本文以一个DWR+SPRING的实例来说明DWR的?
1、将dwr.jar攑ֈ应用?WEB-INF/lib目录?
2、配|web.xml,增加如下代码:

  1. <!--初始化WebApplicationContext-->  
  2.  <context-param>  
  3.         <param-name>contextConfigLocation</param-name>  
  4.         <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml</param-value>  
  5.  </context-param>  
  6.  <listener>  
  7.        <listener-class>  
  8.              org.springframework.web.context.ContextLoaderListener   
  9.        </listener-class>  
  10.  </listener>  
  11. <!--配置DWR拦截?->  
  12.  <servlet>  
  13.   <servlet-name>dwr-invoker</servlet-name>  
  14. <!-- 指定DWR核心(j)Servlet的实现类  -->
  15.   <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>  
  16.   <init-param>  
  17.    <param-name>debug</param-name>  
  18.    <param-value>true</param-value>  
  19.   </init-param>  
  20.  </servlet>  
  21.  <servlet-mapping>  
  22.   <servlet-name>dwr-invoker</servlet-name>  
  23.   <url-pattern>/dwr/*</url-pattern>  
  24.  </servlet-mapping>  

3、增中dwr.xml文g
文g内容Q?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">  
  3. <dwr>  
  4.  <allow>  
  5.   <create creator="spring" javascript="DWRUser">  
  6.    <param name="beanName" value="DWRUser"/>  
  7.   </create>  
  8.  </allow>  
  9. </dwr>  

creator属性的值可以是new,struts,spring......因ؓ(f)此处是整合spring来做的,所以设|成“spring”Qjavascript="DWRUser" 表示实例转换成javascript语言后以DWRUser命名Q前台页面可以通过代码Q?lt;script src="../../dwr/interface/DWRUser.js" type="text/javascript"></script>Q来调用。param元素的name属性值可以是class,beanName{,此处用beanName,value得值是定义在applicationContext.xml中某个bean的id倹{?
4、创Z个实体bean供DWR转换成js

 

  1. package com.note.dwr;   
  2. import com.note.bussies.service.IUserService;   
  3. public class User {   
  4.  private IUserService ius;   
  5.     
  6.  public IUserService getIus() {   
  7.   return ius;   
  8.  }   
  9.  public void setIus(IUserService ius) {   
  10.   this.ius = ius;   
  11.  }   
  12.  public User(){   
  13.      
  14.  }   
  15.  public boolean isExist(String username) {   
  16.       Users user = this.ius.getUserByName(username);   
  17.       return (null == user) ? false : true;   
  18.  }   
  19. }  

5、在applicationContext.xml中配|第4步写的bean
  1. ......   
  2.  <bean id="DWRUser" class="com.note.dwr.User">  
  3.   <property name="ius">  
  4.    <ref bean="UserService" />  
  5.   </property>  
  6.  </bean>  
  7. ......  

6、在视图面中调?
先导入以下文Q每个文件的功能q里不再详述
  1. <script type='text/javascript' src='../../dwr/interface/DWRUser.js'></script>  
  2. <script type='text/javascript' src='../../dwr/engine.js'></script>  
  3. <script type='text/javascript' src='../../dwr/util.js'></script>  

因ؓ(f)我的视图文g是放?view/user/下,所以这里用?./../q回到根
具体调用Q?
  1. <script type='text/javascript'>  

     function regUserChked(){   
  2.   var username=$("username").value;   
  3.   DWRUser.isExist(username,showData);//showData回调函数   
  4.  }   
  5.  function showData(data){   
  6.      if(data){   
  7.           DWRUtil.setValue("userMsg","该用户名已经被注册,h换?zhn)的用户名Q?);   
  8.      }else{   
  9.           DWRUtil.setValue("userMsg","恭喜(zhn),该用户名未被注册!");         
  10.      }   
  11.  }   
  12. </script>  
  13. input type="text" name="username" value="" onblur="regUserChked()" /><div id="userMsg"></div>  


Ke 2007-10-07 12:33 发表评论
]]>
常见的事务传播规?/title><link>http://www.aygfsteel.com/keweibo/articles/145987.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 17 Sep 2007 14:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/145987.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/145987.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/145987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/145987.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/145987.html</trackback:ping><description><![CDATA[常见的事务传播规则有如下几种Q? <ol> <li> PROPAGATION_MANDATORYQ?要求调用该方法的U程必须处于事务环境中,否则抛出异常Q? <li> PROPAGATION_NESTEDQ如果执行该Ҏ(gu)的线E已处于事务环境下,依然启动新的事务Q方法在嵌套的事务里执行。如果执行该Ҏ(gu)的线Eƈ未处于事务中Q也启动新的事务Q然后执行该Ҏ(gu)Q此时与 PROPAGATION_REQUIRED相同Q? <li> PROPAGATION_NEVERQ不允许调用该方法的U程处于事务环境下,如果调用该方法的U程处于事务环境下,则抛出异常; <li> PROPAGATION_NOT_SUPPORTEDQ如果调用该Ҏ(gu)的线E处于事务中Q则先暂停当前事务,然户执行该方法; <li> PROPAGATION_REQUIREDQ要求在事务环境中执行该Ҏ(gu)Q如果当前线E已处于事务中,则直接调用,然后执行该方法; <li> PROPAGATION_REQUIRES_NEWQ该Ҏ(gu)要求有一个在新的事务环境中执行,如果当前U程已处于事务中Q先暂停当前事务Q启动新事务后执行该Ҏ(gu)Q如果当前调用线E不处在事务中,则启动新的事务方法后执行Ҏ(gu)Q? <li> PROPAGATION_SUPPORTSQ如果当前执行线E处于事务中Q则执行当前事务Q否则不使用事务?</li> </ol> <img src ="http://www.aygfsteel.com/keweibo/aggbug/145987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-09-17 22:15 <a href="http://www.aygfsteel.com/keweibo/articles/145987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenSessionInView模式q用 http://www.aygfsteel.com/keweibo/articles/145977.htmlKeKeMon, 17 Sep 2007 13:31:00 GMThttp://www.aygfsteel.com/keweibo/articles/145977.htmlhttp://www.aygfsteel.com/keweibo/comments/145977.htmlhttp://www.aygfsteel.com/keweibo/articles/145977.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/145977.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/145977.htmlSpring+Hibernate中OpenSessionInView模式q用
配置OpenSessionInView模式也很单,Spring提供?jin)两U方式:(x)

1、过滤流Filter

<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
 
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
2、Interceptor

<!-- SimpleUrlHandlerMapping -->    
    
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        
<property name="interceptors" ref="openSessionInViewInterceptor"/>        
        
<property name="mappings">
          
<props>       
             。。?nbsp;              
          
</props>    
        
</property>
    
</bean>
    
    
<!-- =========== openSessionInViewInterceptor ==============-->
    
<bean id="openSessionInViewInterceptor"
          class
="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        
<property name="sessionFactory" ref="sessionFactory"/>
    
</bean>

推荐用第二种方式


Ke 2007-09-17 21:31 发表评论
]]>
org.springframework.web.filter.CharacterEncodingFilterhttp://www.aygfsteel.com/keweibo/articles/144650.htmlKeKeWed, 12 Sep 2007 15:27:00 GMThttp://www.aygfsteel.com/keweibo/articles/144650.htmlhttp://www.aygfsteel.com/keweibo/comments/144650.htmlhttp://www.aygfsteel.com/keweibo/articles/144650.html#Feedback1http://www.aygfsteel.com/keweibo/comments/commentRss/144650.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/144650.html <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
 version="2.4">

    <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>
           org.springframework.web.filter.CharacterEncodingFilter
      </filter-class>
      init-param>
       <param-name>encoding</param-name>
       <param-value>GB2312</param-value>
      </init-param>
      <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>true</param-value>
      </init-param>
     </filter>
<!-- 要过滤得cd -->
  <filter-mapping>
  <filter-name>SetCharacterEncoding</filter-name>
  <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

</web-app>
public class CharacterEncodingFilter
extends OncePerRequestFilter

Servlet 2.3/2.4 Filter that allows one to specify a character encoding for requests. This is useful because current browsers typically do not set a character encoding even if specified in the HTML page or form.

This filter can either apply its encoding if the request does not already specify an encoding, or enforce this filter's encoding in any case ("forceEncoding"="true"). In the latter case, the encoding will also be applied as default response encoding on Servlet 2.4+ containers (although this will usually be overridden by a full content type set in the view).



Ke 2007-09-12 23:27 发表评论
]]>
使用java的代理机制进行日志输?/title><link>http://www.aygfsteel.com/keweibo/articles/139260.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sat, 25 Aug 2007 06:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/139260.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/139260.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/139260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/139260.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/139260.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red"><em><strong> 通过面向接口~程实现日志输出</strong></em></span><br>(1)建立一个接口TimeBookInterface,代码如下<br>/*******TimeBookInterface.java********/<br>package com.gc.dao;</p> <p>public interface TimeBookInterface{</p> <p> public void doAuditing(String name);<br>}<br>(2)~写接口实现c?代码如下<br>/*******TimeBook.java********/<br>package com.gc.dao.impl;</p> <p>public class TimeBook implements TimeBookInterface{</p> <p> public void doAuditing(String name){<br> <br>  //审查数据的相关程?br>  ......<br> }<br>}<br>(3)~写一个代理类,用来实现日志输出,其代码如?br>/*******TimeBookProxy.java********/<br>package com.gc.dao.impl;</p> <p>import org.apache.log4j.Level;<br>import org.apache.log4j.Logger;</p> <p>public class TimeBookProxy{</p> <p> private Logger logger = Logger.getLogger(this.getClass().getName());<br> private TimeBookInterface timeBookInterface;<br> public TimeBookProxy(TimeBookInterface timeBookInterface){<br> <br>  this.timeBookInterface = timeBookInterface;<br> }<br> //实际业务处理<br> public void doAuditing(String name){<br> <br>  logger.log(Level.INFO,name+"开始审核数?);<br>  timeBookInterface.doAuditing(name);<br>  logger.log(Level.INFO,name+"审核数据l束");<br> }<br>}<br>(4)~写试代码c?br>......<br>public static void main(String[] args){<br>//针对接口q行~程<br> TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());<br> timeBookProxy.doAuditing("张三");<br>}</p> <p><span style="COLOR: red"><strong><em> 使用java的代理机制进行日志输?/em></strong></span><br>(1)~写一个日志信息的代理cLogProxy,q个代理cdC(jin)接口InvocationHandler,<br> 可以对Q何接口实现日志信息的输出.其代理如?br>package com.gc.dao;</p> <p>import java.lang.reflect.InvocationHandler;<br>import java.lang.reflect.Method;<br>import java.lang.reflect.Proxy;</p> <p>import org.apache.log4j.Level;<br>import org.apache.log4j.Logger;<br>//代理cdC(jin)接口InvocationHandler<br>public class LogProxy implements InvocationHandler{</p> <p> private Logger logger = Logger.getLogger(this.getClass().getName());<br> private Object delegate;<br> //l定对象<br> public Object bing(Object delegate){<br>  this.delegate = delegate;<br>  return Proxy.new ProxyInstance(delegate.getClass().getClassLoader(),delegate.getClass().getInterfaces(),this);<br> }<br> //针对接口~程<br> public Object invoke(Object proxy,Mehtod method,Object[] args)throws Throwable{<br> <br>  Object result = null;<br>  try{<br>  //在方法调用前后进行日志输?br>   logger.log(Level.INFO,args[0] + "开始审核数?);<br>   result = method.invoke(delegate,args);<br>   logger.log(Level.INFO,args[0] + "审核数据l束");<br>  }<br>  catch(Exception e){<br>   logger.log(Level.INFO,e.toString());<br>  }<br>  return result;<br> }<br>}<br>(2)建立一个接口TimeBookInterface,代码如下<br>/*******TimeBookInterface.java********/<br>package com.gc.dao;</p> <p>public interface TimeBookInterface{</p> <p> public void doAuditing(String name);<br>}<br>(3)~写接口实现c?代码如下<br>/*******TimeBook.java********/<br>package com.gc.dao.impl;</p> <p>public class TimeBook implements TimeBookInterface{</p> <p> public void doAuditing(String name){<br> <br>  //审查数据的相关程?br>  ......<br> }<br>}<br>(4)~写试代码c?br>......<br>public static void main(String[] args){<br> //实现?jin)对日志cȝ重用<br> LogProxy logProxy = new LogProxy();<br> TimeBookInterface timeBookInterface = (TimeBookInterface)logProxy.bind(new TimeBook());<br> timeBookProxy.doAuditing("张三");<br>}<br>代码来自spring从入门到_N一?/p> <img src ="http://www.aygfsteel.com/keweibo/aggbug/139260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-08-25 14:21 <a href="http://www.aygfsteel.com/keweibo/articles/139260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 集合注入方式http://www.aygfsteel.com/keweibo/articles/139118.htmlKeKeFri, 24 Aug 2007 07:51:00 GMThttp://www.aygfsteel.com/keweibo/articles/139118.htmlhttp://www.aygfsteel.com/keweibo/comments/139118.htmlhttp://www.aygfsteel.com/keweibo/articles/139118.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/139118.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/139118.htmlspring 集合注入方式

List
 <bean id="helloWorld" class="...">
  <property name="message">
   <list>
    <value>one</value>
    <value>two</value>
    <value>three</value>
   </list>
  </property>
 </bean>
Set
 <bean id="helloWorld" class="...">
  <property name="message">
   <set>
    <value>one</value>
    <value>two</value>
    <value>three</value>
   </set>
  </property>
 </bean>
Map
 <bean id="helloWorld" class="...">
  <property name="message">
   <map>
    <entry key="keytwo">
     <value>one</value>
    </entry>
    <entry key="keytwo">
     <value>two</value>
    </entry>
   </map>
  </property>
 </bean>
Properties
 <bean id="helloWorld" class="...">
  <property name="message">
   <props>
    <prop key="keyone">one</prop>
    <prop key="keytwo">two</prop>
   </props>
  </property>
 </bean>



Ke 2007-08-24 15:51 发表评论
]]>
spring中bean的高U属性之list, set, map以及(qing)props元素(含D? (? http://www.aygfsteel.com/keweibo/articles/138216.htmlKeKeMon, 20 Aug 2007 12:09:00 GMThttp://www.aygfsteel.com/keweibo/articles/138216.htmlhttp://www.aygfsteel.com/keweibo/comments/138216.htmlhttp://www.aygfsteel.com/keweibo/articles/138216.html#Feedback0http://www.aygfsteel.com/keweibo/comments/commentRss/138216.htmlhttp://www.aygfsteel.com/keweibo/services/trackbacks/138216.html   对应的spring的配|文件D例如下:(x)
<? xml version="1.0" encoding="gb2312" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd"
>

< beans >

 
< bean  id ="chinese"  class ="Chinese" >
 
< property  name ="friends" >
            
< list >
                
< value > 张三 </ value >
                
< value > 李四 </ value >
                
< value > 王五 </ value >
            
</ list >
  
</ property >
  
< property  name ="score" >
            
< map >
                
< entry  key ="数学" >
                    
< value > 60 </ value >
                
</ entry >
                
< entry  key ="p" >
                    
< value > 70 </ value >
                
</ entry >
                
< entry  key ="语文" >
                    
< value > 80 </ value >
                
</ entry >
                
< entry  key ="物理" >
                    
< value > 90 </ value >
                
</ entry >
                
< entry  key ="化学" >
                    
< value > 95 </ value >
                
</ entry >
            
</ map >
  
</ property >
  
< property  name ="basicInfo" >
            
< props >
                
< prop  key ="w高" > 165 </ prop >
                
< prop  key ="体重" > 45kg </ prop >
                
< prop  key ="学历" > 大学本科 </ prop >
            
</ props >
   
</ property >
   
< property  name ="interest" >
            
< set >
                
< value > 唱歌 </ value >
                
< value > </ value >
                
< value > 书法 </ value >
            
</ set >
   
</ property >

</ bean >

</ beans >


  对应的javacMؓ(f):

public   class  Chinese  implements  People  {
    
private  List friends  =   new  ArrayList();
    
private  Map score  =   new  HashMap();
    
private  Properties basicInfo  =   new  Properties();
    
private  Set interest  =   new  HashSet();
    
// 省略对应setҎ(gu)
    .
}


Ke 2007-08-20 20:09 发表评论
]]>
使用Timer实现定时?/title><link>http://www.aygfsteel.com/keweibo/articles/137976.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 19 Aug 2007 12:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/137976.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/137976.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/137976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/137976.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/137976.html</trackback:ping><description><![CDATA[<p>利用spring实现定时器的开发过E包括以下三个步?<br>(1)创徏定时dc?<br>(2)注册定时dc?q|Q务计划和d调度?<br>(3)在WEB目中启动定时服?<br>------------------------------------------------------------------------------------------------------------<br>例子(定时dc?<br>package dgut.ke.timer;</p> <p>import java.util.TimerTask;</p> <p>public class MainTask extends TimerTask {</p> <p> @Override<br> public void run() {<br>  // TODO Auto-generated method stub<br>  System.out.println("--------------执行定时d---------------");<br> }</p> <p>}<br>------------------------------------------------------------------------------------------------------------<br>文g/WEB-INF/TimerConfig.xml<br><?xml version="1.0" encoding="UTF-8"?><br><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a ><br><beans><br> <!-- 注册定时执行实体 --><br> <bean id="mainTask" class="dgut.ke.timer.MainTask"></bean><br> <!-- 注册定时信息 --><br> <bean id="stTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"><br>  <!-- 首次执行d前需要等?U钟 --><br>  <property name="delay"><br>   <value>2000</value><br>  </property><br>  <!-- d执行的周?--><br>  <property name="period"><br>   <value>4000</value><br>  </property><br>  <!-- 具体的执行Q?--><br>  <property name="timerTask"><br>   <ref local="mainTask"/><br>  </property><br> </bean><br> <!-- 配置d调度?--><br> <bean id="timeFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"><br>  <!-- 注入定时器列?--><br>  <property name="scheduledTimerTasks"><br>   <list><br>    <ref local="stTask"/><br>   </list><br>  </property><br> </bean><br></beans><br>------------------------------------------------------------------------------------------------------------</p> 文gweb.xml<br><?xml version="1.0" encoding="UTF-8"?><br><web-app version="2.4" <br> xmlns="<a <br> xmlns:xsi="<a <br> xsi:schemaLocation="<a >http://java.sun.com/xml/ns/j2ee</a> <br> <a ><br>  <br>  <!-- 启动定时服务 --><br>  <context-param><br>   <param-name>contextConfigLocation</param-name><br>   <param-value>/WEB-INF/TimerConfig.xml</param-value><br>  </context-param><br>  <listener><br>   <listener-class><br>    org.springframework.web.context.ContextLoaderListener<br>   </listener-class><br>  </listener><br></web-app> <img src ="http://www.aygfsteel.com/keweibo/aggbug/137976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-08-19 20:11 <a href="http://www.aygfsteel.com/keweibo/articles/137976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>拦截?/title><link>http://www.aygfsteel.com/keweibo/articles/137948.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Sun, 19 Aug 2007 07:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/keweibo/articles/137948.html</guid><wfw:comment>http://www.aygfsteel.com/keweibo/comments/137948.html</wfw:comment><comments>http://www.aygfsteel.com/keweibo/articles/137948.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/keweibo/comments/commentRss/137948.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/keweibo/services/trackbacks/137948.html</trackback:ping><description><![CDATA[<p>在映请求中d一个拦截器,自定义拦截器必须实现org.springframework.web.servlet.HandlerInterceptor接口?br>HandlerInterceptor的示例代码如下:(x)<br>public interface HandlerInterceptor<br>{<br>   //在处理器执行前调?br>boolean preHandle(HttpServletRequest request, HttpServletResponse response,   Object handler) throws Exception;<br><br>   //在处理器执行后调?br>void postHandle(HttpServletRequest request, HttpServletResponse response,   Object handler,   ModelAndView modelAndView ) throws Exception;<br>   //在整个请求处理完后调?br>void afterCompletion(HttpServletRequest request, HttpServletResponse response,   Object handler,   Exception    ex) throws Exception;<br>}<br>----------------------------------------------------------------------------------------------------------------------------<br>文gNotLeaveWord.java<br>package dgut.ke.interceptor;</p> <p>import java.util.Calendar;</p> <p>import javax.servlet.RequestDispatcher;<br>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;</p> <p>import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;</p> <p>public class NotLeaveWord extends HandlerInterceptorAdapter <br>{<br> private int startTime;<br> private int endTime;<br> private String interceptorPage;<br>  <br> /*通过依赖注入*/<br> public void setStartTime(int startTime) {<br>  this.startTime = startTime;<br> }<br> public void setEndTime(int endTime) {<br>  this.endTime = endTime;<br> }<br> public void setInterceptorPage(String interceptorPage) {<br>  this.interceptorPage = interceptorPage;<br> }<br> public int getStartTime() {<br>  return startTime;<br> }<br> public int getEndTime() {<br>  return endTime;<br> }<br> public String getInterceptorPage() {<br>  return interceptorPage;<br> }<br> /*q行拦截处理*/<br> public boolean preHandle(HttpServletRequest request,<br>       HttpServletResponse response,<br>       Object handler)throws Exception<br> {<br>  Calendar cal = Calendar.getInstance();<br>  int hour = cal.get(java.util.Calendar.HOUR_OF_DAY);<br>  if( hour > startTime && hour < endTime)<br>  {<br>   request.setAttribute("startTime", this.getStartTime());<br>   request.setAttribute("endTime", this.getEndTime());<br>   RequestDispatcher rd = request.getRequestDispatcher(this.getInterceptorPage());<br>   rd.forward(request, response);<br>   return false;<br>  }<br>  else<br>  {<br>   return true ;<br>  } <br> }<br> <br>}<br>-----------------------------------------------------------------------------------------------------------------</p> 文gdispatcherServlet-servlet.xml<br><?xml version="1.0" encoding="UTF-8"?><br><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a ><br><beans><br><!-- 定义映射 --><br> <bean id="urlMapping"<br>  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"<br>  abstract="false" singleton="true" lazy-init="default"<br>  autowire="default" dependency-check="default"><br>  <!-- 讄拦截?--><br>  <property name="interceptors"><br>   <list><br>    <ref local="notLeaveWord"/><br>   </list><br>  </property><br>  <property name="mappings"><br>   <props><br>    <prop key="helloWorld.do">helloWorld</prop><br>   </props><br>  </property><br> </bean><br><!-- 定义视图 --><br> <bean id="viewResolver"<br>  class="org.springframework.web.servlet.view.InternalResourceViewResolver"<br>  abstract="false" singleton="true" lazy-init="default"<br>  autowire="default" dependency-check="default"><br>  <property name="viewClass"><br>   <value><br>   org.springframework.web.servlet.view.JstlView<br>   </value><br>  </property><br>  <!-- 定义jsp所在的目录 --><br>  <property name="prefix"><value>/</value></property><br>  <property name="suffix"><value>.jsp</value></property><br> </bean><br><!-- 定义控制?--><br> <bean id="helloWorld" class="dgut.ke.action.HelloWorld"<br>  abstract="false" singleton="true" lazy-init="default"<br>  autowire="default" dependency-check="default"><br>  <property name="helloWorld"><br>   <value>Spring MVC 例子</value><br>  </property><br>  <property name="viewPage"><br>   <value>index</value><br>  </property><br> </bean><br><!-- 拦截器设|?--><br> <bean id="notLeaveWord" class="dgut.ke.interceptor.NotLeaveWord"<br>  abstract="false" singleton="true" lazy-init="default"<br>  autowire="default" dependency-check="default"><br>  <property name="startTime"><br>   <value>10</value><br>  </property><br>  <property name="endTime"><br>   <value>20</value><br>  </property><br>  <property name="interceptorPage"><br>   <value>outTime.jsp</value><br>  </property><br> </bean><br></beans><br>-------------------------------------------------------------------------------------------------------------<br>文gweb.xml<br><?xml version="1.0" encoding="UTF-8"?><br><web-app version="2.4" <br> xmlns="<a <br> xmlns:xsi="<a <br> xsi:schemaLocation="<a >http://java.sun.com/xml/ns/j2ee</a> <br> <a ><br>  <br>  <servlet><br>   <servlet-name>dispatcherServlet</servlet-name><br>   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><br>   <!-- 初始化参?--><br>   <init-param><br>    <param-name>contextConfigLocation</param-name><br>    <param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value><br>   </init-param><br>   <load-on-startup>1</load-on-startup><br>  </servlet><br>  <br>  <servlet-mapping><br>   <servlet-name>dispatcherServlet</servlet-name><br>   <url-pattern>*.do</url-pattern><br>  </servlet-mapping><br>  <br>  <welcome-file-list><br>    <welcome-file>index.jsp</welcome-file><br>  </welcome-file-list><br></web-app><br> <img src ="http://www.aygfsteel.com/keweibo/aggbug/137948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/keweibo/" target="_blank">Ke</a> 2007-08-19 15:46 <a href="http://www.aygfsteel.com/keweibo/articles/137948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">ϻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ҧ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ߴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޻</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ո</a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">㽭ʡ</a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޼</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯׯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">߱</a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">ŷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ˮ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>