<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>ralf_realman</title>
    <description></description>
    <link>http://ralf-realman.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>struts+spring 最优整合</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/30949" style="color:red;">http://ralf-realman.javaeye.com/blog/30949</a>&nbsp;
          发表时间: 2006年10月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          将 Strut 动作管理委托给 Spring。您可以通过在 struts-config 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下，所以它可以填充动作的 JavaBean 属性，并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。 <br /><br />清单 5 中的 Action 类与清单 4 中的相同。但是 struts-config 有一些不同： <br /><br />清单 5. Spring 整合的委托方法 <br /><br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1" ?> <br /><br />&lt;!DOCTYPE <br />struts-config PUBLIC <br />          "-//Apache Software Foundation<br />		  //DTD Struts Configuration 1.1//EN" <br />          "http://jakarta.apache.org<br />		  /struts/dtds/struts-config_1_1.dtd"> <br /><br />&lt;struts-config> <br /> &lt;form-beans> <br />    &lt;form-bean name="searchForm"  <br />      type="org.apache.struts.<br />	  validator.DynaValidatorForm"> <br />               &lt;form-property name="isbn"    <br />			   type="java.lang.String"/> <br />    &lt;/form-bean> <br />   <br />  &lt;/form-beans> <br /><br /> &lt;global-forwards <br /> type="org.apache.struts.<br /> action.ActionForward"> <br />     &lt;forward   name="welcome"                <br />	 path="/welcome.do"/> <br />     &lt;forward   name="searchEntry"            <br />	 path="/searchEntry.do"/> <br />     &lt;forward   name="searchSubmit"           <br />	 path="/searchSubmit.do"/> <br /> &lt;/global-forwards> <br /><br /> &lt;action-mappings> <br />    &lt;action    path="/welcome" <br />	forward="/WEB-INF/pages/welcome.htm"/> <br />    &lt;action    path="/searchEntry" <br />	forward="/WEB-INF/pages/search.jsp"/> <br />    &lt;action    path="/searchSubmit"  <br />             type="org.springframework.<br />			 web.struts.DelegatingActionProxy" |(1) <br />             input="/searchEntry.do" <br />             validate="true" <br />             name="searchForm"> <br />             &lt;forward name="success" <br />			 path="/WEB-INF/pages/detail.jsp"/> <br />             &lt;forward name="failure" <br />			 path="/WEB-INF/pages/search.jsp"/> <br />    &lt;/action>   <br /><br /> &lt;/action-mappings> <br /><br /> &lt;message-resources <br /> parameter="ApplicationResources"/> <br /><br /><br /> &lt;plug-in className="org.apache.struts.<br /> validator.ValidatorPlugIn"> <br />    &lt;set-property  <br />    property="pathnames"  <br />    value="/WEB-INF/validator-rules.xml,<br />	/WEB-INF/validation.xml"/> <br /> &lt;/plug-in> <br /><br /><br /> &lt;plug-in  <br />    className="org.springframework.web.<br />	struts.ContextLoaderPlugIn"> <br />    &lt;set-property <br />	property="contextConfigLocation" <br />	value="/WEB-INF/beans.xml"/> <br /> &lt;/plug-in> <br /><br />  <br />&lt;/struts-config><br /> <br /><br />清单 5 是一个典型的 struts-config.xml 文件，只有一个小小的差别。它注册 Spring 代理类的名称，而不是声明动作的类名，如（1）处所示。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。这就是我们使用 ContextLoaderPlugIn 声明的环境。 <br /><br />将一个 Struts 动作注册为一个 Spring bean 是非常直观的，如清单 6 所示。我利用动作映射使用 标记的名称属性（在这个例子中是 "/searchSubmit"）简单地创建了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充： <br /><br />清单 6. 在 Spring 环境中注册一个 Struts 动作 <br /><br /><br />&lt;?xml version="1.0" encoding="UTF-8"?> <br />&lt;!DOCTYPE beans PUBLIC "<br />-//SPRING//DTD BEAN//EN"  <br /> "http://www.springframework.<br /> org/dtd/spring-beans.dtd"> <br /><br />&lt;beans> <br />  &lt;bean id="bookService" <br />  class="ca.nexcel.books.<br />  business.BookServiceImpl"/> <br /><br />  &lt;bean name="/searchSubmit"    <br />        class="ca.nexcel.books.<br />		actions.SearchSubmit"> <br />     &lt;property name="bookService"> <br />        &lt;ref bean="bookService"/> <br />     &lt;/property> <br />  &lt;/bean> <br /><br />&lt;/beans><br /> <br /><br /><br /><br />动作委托的优点 <br />Struts动作不了解Spring，不对代码作任何改 <br /><br />变就可用于非Spring应用程序中。RequestProcessor的改变不会影响它，并且它可以利用 Spring AOP 特性的优点。 <br /><br />动作委托的优点不止如此。一旦让 Spring 控制您的 Struts 动作，您就可以使用 Spring 给动作补充更强的活力。例如，没有 Spring 的话，所有的 Struts 动作都必须是线程安全的。 <br /><br />如果您设置 标记的 singleton 属性为“false”，那么不管用何种方法，您的应用程序都将在每一个请求上有一个新生成的动作对象。 <br /><br />您可能不需要这种特性，但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如，当实例化 Struts 动作时， 标记的 init-method 属性被用于运行一个方法。 <br /><br />类似地，在从容器中删除 bean 之前，destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法，它们以一种与 Servlet 生命周期相同的方式进行管理。 <br /><br />拦截 Struts <br /><br />前面提到过，通过将 Struts 动作委托给 Spring 框架而整合 Struts 和 Spring 的一个主要的优点是：您可以将 Spring 的 AOP 拦截器应用于您的 Struts 动作。通过将 Spring 拦截器应用于 Struts 动作，您可以用最小的代价处理横切关注点。 <br /><br />虽然 Spring 提供很多内置拦截器，但是我将向您展示如何创建自己的拦截器并把它应用于一个 Struts 动作。为了使用拦截器，您需要做三件事： <br /><br />创建拦截器。 <br /><br />注册拦截器。 <br /><br />声明在何处拦截代码。 <br /><br />这看起来非常简单的几句话却非常强大。例如，在清单 7 中，我为 Struts 动作创建了一个日志记录拦截器。 这个拦截器在每个方法调用之前打印一句话： <br /><br />清单 7. 一个简单的日志记录拦截器 <br /><br /><br />package ca.nexcel.books.interceptors; <br /><br />import org.springframework.<br />aop.MethodBeforeAdvice; <br /><br />import java.lang.reflect.Method; <br /><br />public class LoggingInterceptor <br />implements MethodBeforeAdvice <br />{ <br /><br />   public void before(Method method, <br />   Object[] objects, Object o)<br />   throws Throwable <br />   { <br />    System.out.println("logging before!"); <br />    } <br />}<br /> <br /><br />这个拦截器非常简单。before()方法在拦截点中每个方法之前运行。在本例中，它打印出 <br /><br />一句话，其实它可以做您想做的任何事。下一步就是在Spring配置文件中注册这个拦截器 <br /><br />，如清单 8 所示： <br /><br />清单 8. 在 Spring 配置文件中注册拦截器 <br /><br /><br />&lt;?xml version="1.0" encoding="UTF-8"?> <br />&lt;!DOCTYPE beans PUBLIC "-/<br />/SPRING//DTD BEAN//EN"  <br />"http://www.springframework.<br />org/dtd/spring-beans.dtd"> <br /><br />&lt;beans> <br />  &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/> <br /><br />  &lt;bean name="/searchSubmit"  <br />        class="ca.nexcel.books.actions.SearchSubmit"> <br />     &lt;property name="bookService"> <br />        &lt;ref bean="bookService"/> <br />     &lt;/property> <br />  &lt;/bean> <br /><br />  &lt;!--  Interceptors -->  <br />  &lt;bean name="logger"     <br />    class="ca.nexcel.books.interceptors.<br />	LoggingInterceptor"/> |(1) <br /><br />  &lt;!-- AutoProxies --> <br />  &lt;bean name="loggingAutoProxy"  <br />        class="org.springframework.aop.<br />		framework.autoproxy. <br />          BeanNameAutoProxyCreator"> |(2) <br />    &lt;property name="beanNames"> <br />          &lt;value>/searchSubmit&lt;/valuesgt; |(3) <br />    &lt;/property> <br />    &lt;property name="interceptorNames"> <br />        &lt;list> <br />          &lt;value>logger&lt;/value> |(4) <br />        &lt;/list> <br />    &lt;/property> <br />   &lt;/bean> <br /><br />&lt;/beans><br /> <br /><br /><br />您可能已经注意到了，清单8扩展了清单6中所示的应用程序以包含一个拦截器。具体细节如下：在(1)处，我注册了这个拦截器。(2)处，我创建了一个bean名称自动代理，它描述如何应用拦截器。还有其他的方法定义拦截点，但是这种方法常见而简便。 <br /><br />在 (3) 处，我将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作，则只需要在 "beanNames" 下面创建附加的 标记。 <br /><br />在 (4) 处，当拦截发生时，我执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于“beanNames”。 <br /><br />就是这样。就像这个例子所展示的，将您的 Struts 动作置于 Spring 框架的控制之下，为处理您的 Struts 应用程序提供了一系列全新的选择。在本例中，使用动作委托可以轻松地利用 Spring 拦截器提高 Struts 应用程序中的日志记录能力。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/30949#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Oct 2006 16:36:41 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/30949</link>
        <guid>http://ralf-realman.javaeye.com/blog/30949</guid>
      </item>
      <item>
        <title>sky 夺冠了！！！╭∩╮（︶︿︶）╭∩╮鄙视韩国人！！！</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/30946" style="color:red;">http://ralf-realman.javaeye.com/blog/30946</a>&nbsp;
          发表时间: 2006年10月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天WCG 2006 刚刚落下帷幕，中国之队的成绩可以说是差强人意吧，sc不是韩国人的天下，就连引以为豪的cs也被WNV的韩国分队给做了，幸好有sky在魔兽项目夺冠了，实现了WCG史上的第一次卫冕。<br /><br />通过这次比赛使我更加认识了韩国人的丑恶嘴脸，sky“作弊”淘汰了他们的gostop（不久以后就会在war3界中消失），三星这个sb公司竟然仗着自己是主要赞助商的身份，连决赛都不转播。说到这，我不得不提起三星这个韩国垃圾企业，当年靠着在中国卖那个彩蛋手机在中国大发特发，它的手机一向以带电时间短，价格高，功能少为卖点，而且卖到中国的价钱是他们本国的n倍，竟然在中国还有人买。就是这样一个企业靠着赚中国人的钱，成了WCG的主要赞助商，打压中国选手。你们说这样的企业还让它在中国混吗，赚中国人的钱吗？强烈抵制三星和韩国人。<br /><br />我身边接触过韩国人的朋友都说韩国人很小气，很恶心！不再被韩剧迷惑了！！！
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/30946#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Oct 2006 16:30:12 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/30946</link>
        <guid>http://ralf-realman.javaeye.com/blog/30946</guid>
      </item>
      <item>
        <title>jsf + spring +hibernate 自己做的一个例子，主要是看一些基本配置</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/30945" style="color:red;">http://ralf-realman.javaeye.com/blog/30945</a>&nbsp;
          发表时间: 2006年10月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近好久没有发帖了，有点懒了(*^__^*)<br /><br />最近刚做完一个 jsf的小例子，麻雀虽小，但是五脏俱全。下面我就把 它贴出来，具体的配置文件可以看 附件<br /><br /><br />下面我贴的都是配置中的一部分，都是需要注意的地方<br /><br />1： web。xml<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><br />  &lt;!-- spring app 上下文--><br />  &lt;context-param><br />    &lt;param-name>contextConfigLocation&lt;/param-name><br />    &lt;param-value>/WEB-INF/appconfig/appcontext_resource.xml,/WEB-INF/appconfig/appcontext_dao.xml,/WEB-INF/appconfig/appcontext.xml&lt;/param-value><br />  &lt;/context-param><br />  &lt;context-param><br />	&lt;param-name>log4jConfigLocation1&lt;/param-name><br />	&lt;param-value>WEB-INF\classes\log4j.properties&lt;/param-value><br />&lt;/context-param><br />  &lt;!-- 如果 faces-config.xml不在/WEB-INF下，需要指定位置，如下代码<br />  &lt;context-param><br />    &lt;param-name>javax.faces.CONFIG_FILES&lt;/param-name><br />    &lt;param-value>/WEB-INF/xxx/faces-config.xml&lt;/param-value><br />  &lt;/context-param><br />  --><br />  <br />  <br />  &lt;filter><br />        &lt;filter-name>encodingFilter&lt;/filter-name><br />        &lt;filter-class>com.rain.ralf.servlet.SetCharacterEncodingFilter&lt;/filter-class><br />        &lt;init-param><br />            &lt;param-name>encoding&lt;/param-name><br />            &lt;param-value>UTF-8&lt;/param-value><br />        &lt;/init-param><br />        &lt;init-param><br />            &lt;param-name>ignore&lt;/param-name><br />            &lt;param-value>true&lt;/param-value><br />        &lt;/init-param><br />    &lt;/filter><br />    &lt;filter-mapping><br />		&lt;filter-name>encodingFilter&lt;/filter-name><br />		&lt;url-pattern>/*&lt;/url-pattern><br />	&lt;/filter-mapping><br />  &lt;!-- spring 监听器 --><br />  &lt;listener><br />    &lt;listener-class>org.springframework.web.context.ContextLoaderListener&lt;/listener-class><br />  &lt;/listener><br />  &lt;!-- 配置 jsf   --><br />  &lt;servlet><br />    &lt;display-name>FacesServlet&lt;/display-name><br />    &lt;servlet-name>FacesServlet&lt;/servlet-name><br />    &lt;servlet-class>javax.faces.webapp.FacesServlet&lt;/servlet-class><br />    &lt;load-on-startup>1&lt;/load-on-startup><br />  &lt;/servlet><br /><br />  &lt;servlet><br />	&lt;servlet-name>log4j-init&lt;/servlet-name><br />	&lt;servlet-class>com.rain.ralf.servlet.Log4jInit&lt;/servlet-class><br />	&lt;init-param><br />		&lt;param-name>log4jConfigLocation&lt;/param-name><br />		&lt;param-value>WEB-INF\classes\log4j.properties&lt;/param-value><br />	&lt;/init-param><br />	&lt;load-on-startup>2&lt;/load-on-startup><br />	&lt;/servlet><br />	<br />  &lt;servlet-mapping><br />    &lt;servlet-name>FacesServlet&lt;/servlet-name><br />    &lt;url-pattern>*.jsf&lt;/url-pattern><br />  &lt;/servlet-mapping><br />&lt;/web-app><br /><br /><br />2：face-config.xml <br /><br /><br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"><br /><br />&lt;faces-config><br />	<br />	&lt;managed-bean><br />		&lt;managed-bean-name>addUser&lt;/managed-bean-name><br />		&lt;managed-bean-class>com.rain.ralf.web.addUserBean&lt;/managed-bean-class><br />		&lt;managed-bean-scope>request&lt;/managed-bean-scope><br />		&lt;managed-property><br />		<span style="color: red">&lt;property-name>userServiecs&lt;/property-name><br />		&lt;value>#{userServiecs}&lt;/value><br />		&lt;/managed-property></span><br />	&lt;/managed-bean><br />		<br />	<br />		<br />		<br />	<br />	<br />&lt;navigation-rule><br />		&lt;description>add user&lt;/description><br />		&lt;from-view-id>/pages/addUser.jsp&lt;/from-view-id><br />		&lt;navigation-case><br />			&lt;from-outcome>sucess&lt;/from-outcome><br />			&lt;to-view-id>/pages/Sucess.jsp&lt;/to-view-id><br />		&lt;/navigation-case><br />		&lt;/navigation-rule>	<br />	&lt;/navigation-rule><br />	<br />		<br />		<br />	&lt;!-- 写在最后 用sprig的变量解析器代替jsf的变量解析器--><br />	<span style="color: red">&lt;application><br />		&lt;variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver&lt;/variable-resolver><br />	&lt;/application></span><br />	<br /><br /><br /><br />&lt;/faces-config><br /><br />这里需要注意红色部分的地方，其实jsf本身就使用的ioc的思想，所以通过红色部分你可以直接在代码中直接 使用 service对象 。例如在 com.rain.ralf.web.addUserBean这个backbean中使用业务层的对象 <br /><br /><br />public class addUserBean {<br /><br />   <span style="color: red">private UserService userServiecs;<br />   public void setUserServiecs(UserService userServices) {<br />		this.userServiecs = userServices;<br />   }</span><br /><br />    public String addUser() {<br />		<br />		<br />		try {<br />			<span style="color: red">userServiecs.insertUserServices(uv);</span><br />			return "sucess";<br />		} catch (Exception e) {<br />			// TODO Auto-generated catch block<br />			e.printStackTrace();<br />			return null;<br />		}<br />	}<br /><br />}<br /><br />这样红色字体的 userServiecs对象就能直接使用了 ，其他的配置文件可以参考附件
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/30945#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Oct 2006 16:11:02 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/30945</link>
        <guid>http://ralf-realman.javaeye.com/blog/30945</guid>
      </item>
      <item>
        <title>人生的一些规律---it人提防过劳死</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/27757" style="color:red;">http://ralf-realman.javaeye.com/blog/27757</a>&nbsp;
          发表时间: 2006年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          晚上9-11点为免疫系统（淋巴）排毒时间，此段时间应安静或听音乐；<br /><br />　　晚间11-凌晨1点，肝的排毒，需在熟睡中进行；<br /><br />　　凌晨1-3点，胆的排毒，亦同；<br /><br />　　凌晨3-5点，肺的排毒。此即为何咳嗽的人在这段时间咳得最剧烈，因排毒动作已走到肺；不应用止咳药，以免抑制废积物的排除；<br /><br />　　凌晨5-7点，大肠的排毒，应上厕所排便；<br /><br />　　早上7-9点，小肠大量吸收营养的时段，应吃早餐；<br /><br />　　疗病者最好早吃，在6点半前，养生者在7点半前，不吃早餐者应改变习惯，即使拖到9、10点吃都比不吃好；<br /><br />　　半夜至凌晨4点为脊椎造血时段，必须熟睡，不宜熬夜。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/27757#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Oct 2006 23:11:24 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/27757</link>
        <guid>http://ralf-realman.javaeye.com/blog/27757</guid>
      </item>
      <item>
        <title>关于Apache Portable Runtime and Tomcat</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/27754" style="color:red;">http://ralf-realman.javaeye.com/blog/27754</a>&nbsp;
          发表时间: 2006年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在从Tomcat 5.0.28转向5.5.X时，在启动时发现出现如下信息<br />[org.apache.catalina.core.AprLifecycleListener]-[INFO] The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: （...你的系统环境PATH路径...）<br /><br />在停止时发现出现如下信息<br />[org.apache.catalina.core.AprLifecycleListener]-[INFO] Failed shutdown of Apache Portable Runtime<br /><br /><br /><br />但是APR的支持需要安装三个本地组件<br />APR support requires three main native components to be installed: <br />1、APR library <br />2、JNI wrappers for APR used by Tomcat (libtcnative) <br />3、OpenSSL libraries <br /><br />解决：Windows下的安装配置与使用<br />1、先去 http://tomcat.heanet.ie/native/ 下载编译好的 tcnative-1.dll 文件，也可以下载tomcat-native.zip自己进行编译<br />2、修改一下 catalina.bat，加上<br />　　set CATALINA_OPTS="-Djava.library.path=../../APR/lib"<br />因为我把这个DLL放在与Tomcat目录同级的APR/lib目录下，所以采用了相对路径。或者把dll加到你的系统变量PATH里之类的，最简单的方法应当就是把tcnative-1.dll文件放在Tomcat的bin目录下：）<br /><br />这样设置后，启动可以看到信息如下：<br />[org.apache.coyote.http11.Http11AprProtocol]-[INFO] Initializing Coyote HTTP/1.1 on http-9091<br />在停止时发现出现如下信息<br />[org.apache.coyote.http11.Http11AprProtocol]-[INFO] Pausing Coyote HTTP/1.1 on http-9091<br />......<br />[org.apache.coyote.http11.Http11AprProtocol]-[INFO] Stopping Coyote HTTP/1.1 on http-9091
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/27754#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Oct 2006 21:53:15 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/27754</link>
        <guid>http://ralf-realman.javaeye.com/blog/27754</guid>
      </item>
      <item>
        <title>poi的初步使用</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/26954" style="color:red;">http://ralf-realman.javaeye.com/blog/26954</a>&nbsp;
          发表时间: 2006年10月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          请到网站http://jakarta.apache.org/site/downloads/downloads_poi.cgi右击超链接2.5.1.zip下载压缩包poi-bin-2.5.1-final-20040804.zip。我们主要用到poi-2.5.1-final-20040804.jar这个库文件。请把poi-2.5.1-final-20040804.jar这个文件的路径添加到系统环境变量classpath中，否则无法编译下面的示例程序。<br /><br />POI提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excel对象、样式和格式，还有辅助操作等<br /><br />最主要的几个对象如下所示：<br /><br /><span style="color: orange">POI对象名称                  所对应的Excel对象</span> <br />HSSFWorkbook             <span style="color: cyan">工作簿</span> <br />HSSFSheet                <span style="color: cyan">工作表</span> <br />HSSFRow                  <span style="color: cyan">行</span> <br />HSSFCell                 <span style="color: cyan">单元格</span><br /><br />下面我们来看如下的例子，使用表3.1中的对象在程序的当前目录下创建一个Excel文件test.xls，在第一个单元格中写入内容，然后读出第一个单元格的内容。<br />完整的程序如下：<br />import org.apache.poi.hssf.usermodel.HSSFWorkbook;<br />import org.apache.poi.hssf.usermodel.HSSFSheet;<br />import org.apache.poi.hssf.usermodel.HSSFRow;<br />import org.apache.poi.hssf.usermodel.HSSFCell;<br />import java.io.FileOutputStream;<br />import java.io.FileInputStream;<br />public class CreateXL <br />{ public static String xlsFile="test.xls";   //产生的Excel文件的名称<br />  public static void main(String args[])<br />  {<br />   try<br />    {<br />HSSFWorkbook workbook = new HSSFWorkbook();  //产生工作簿对象<br />    HSSFSheet sheet = workbook.createSheet();    //产生工作表对象<br />    //设置第一个工作表的名称为firstSheet<br />//为了工作表能支持中文，设置字符编码为UTF_16<br />workbook.setSheetName(0,"firstSheet",HSSFWorkbook.ENCODING_UTF_16);<br />    //产生一行<br />HSSFRow row = sheet.createRow((short)0);<br />    //产生第一个单元格<br />HSSFCell cell = row.createCell((short) 0);<br />//设置单元格内容为字符串型<br />    cell.setCellType(HSSFCell.CELL_TYPE_STRING);<br />//为了能在单元格中写入中文，设置字符编码为UTF_16。<br />    cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />    //往第一个单元格中写入信息<br />    cell.setCellValue("测试成功");<br />    FileOutputStream fOut = new FileOutputStream(xlsFile);<br />    workbook.write(fOut);<br />    fOut.flush();<br />    fOut.close();<br />    System.out.println("文件生成...");<br />    //以下语句读取生成的Excel文件内容<br />    FileInputStream fIn=new FileInputStream(xlsFile);<br />HSSFWorkbook readWorkBook= new HSSFWorkbook(fIn);<br />HSSFSheet readSheet= readWorkBook.getSheet("firstSheet");<br />HSSFRow readRow =readSheet.getRow(0);<br />HSSFCell readCell = readRow.getCell((short)0);<br />System.out.println("第一个单元是：" + readCell.getStringCellValue()); <br />    }<br />   catch(Exception e) <br />     {<br />     System.out.println(e);<br />     }<br />  }<br />}<br /><br /><br /><span style="font-size: 18pt"><span style="color: green">与数据库结合使用 </span></span><br />      使用POI，结合JDBC编程技术，我们就可以方便地将数据库中的数据导出生成Excel报表。其关键代码如下：<br />/*把数据集rs中的数据导出至Excel工作表中。<br />*传入参数：数据集rs，Excel文件名称xlsName，工作表名称sheetName。<br />*/<br />public static void  resultSetToExcel(ResultSet rs,String xlsName,String sheetName) throws Exception<br /> {<br />    HSSFWorkbook workbook = new HSSFWorkbook();<br />    HSSFSheet sheet = workbook.createSheet();<br />workbook.setSheetName(0,sheetName,HSSFWorkbook.ENCODING_UTF_16);<br />    HSSFRow row= sheet.createRow((short)0);;<br />    HSSFCell cell;<br />    ResultSetMetaData md=rs.getMetaData();<br />int nColumn=md.getColumnCount();<br />//写入各个字段的名称<br />    for(int i=1;i&lt;=nColumn;i++)<br />        {  <br />          cell = row.createCell((short)(i-1));<br />       cell.setCellType(HSSFCell.CELL_TYPE_STRING);<br />       cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />            cell.setCellValue(md.getColumnLabel(i));<br />           }<br />         int iRow=1;<br />    //写入各条记录，每条记录对应Excel中的一行<br />    while(rs.next())<br />       {row= sheet.createRow((short)iRow);;<br />        for(int j=1;j&lt;=nColumn;j++)<br />         {  <br />           cell = row.createCell((short)(j-1));<br />             cell.setCellType(HSSFCell.CELL_TYPE_STRING);<br />             cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />             cell.setCellValue(rs.getObject(j).toString());<br />            }<br />           iRow++;<br />       }<br />       FileOutputStream fOut = new FileOutputStream(xlsName);<br />    workbook.write(fOut);<br />    fOut.flush();<br />    fOut.close();<br />    JOptionPane.showMessageDialog(null,"导出数据成功！");<br />  }
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/26954#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 10 Oct 2006 16:04:18 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/26954</link>
        <guid>http://ralf-realman.javaeye.com/blog/26954</guid>
      </item>
      <item>
        <title>Tapestry 中文乱码</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/25217" style="color:red;">http://ralf-realman.javaeye.com/blog/25217</a>&nbsp;
          发表时间: 2006年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在*.application中加入下面语句：<br /><br />&lt;property name="org.apache.tapestry.template-encoding" value="GB2312"/><br /><br />当然，上面的property也支持component,page等。<br /><br />今天还有一些收获：<br /><br />1、Foreach不能出现在Form中，要在From中显示list，可以用ListEdit。<br /><br />2、Rollover需要与Body配合，否则不能运行，最好是这样：&lt;Body jwcid="@Body">***Rollover***&lt;/body>简单明了。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/25217#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Sep 2006 13:13:12 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/25217</link>
        <guid>http://ralf-realman.javaeye.com/blog/25217</guid>
      </item>
      <item>
        <title>Tapestry 4.0 学习笔记v1</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24984" style="color:red;">http://ralf-realman.javaeye.com/blog/24984</a>&nbsp;
          发表时间: 2006年09月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry <br /><br />页面对象 <br /><br />在page文件中声明属性，可以不必在java文件中声明以及其get、set方法 <br />t4默认getXXX()抽象方法中的XXX为页面属性，.page不用声明，并使用@InitialValue("value")赋初值. <br />页面对象实例会被缓存（有潜在非法访问问题），解决方法： <br />覆盖initialize()方法，初始化实例变量。（在放入缓存池时天会调用initialize()） <br />在.page中声明实例变量,.java声明get\set方法(可有可无)，t4自动生成代码初始化 <br />实现PageBeginRenderListener接口，在页面render之前初始化参数，可防止空指针异常<br />开发调试 <br /><br />禁止缓存参数 <br />-Dorg.apache.tapestry.disable-caching=true -Dorg.apache.tapestry.enable-reset-service=true <br /><br />调试参数 <br /><br />set JAVA_OPTS="-Dorg.apache.tapestry.disable-caching=true" set JPDA_ADDRESS=8000 set JPDA_TRANSPORT=dt_socket catalina jpda start<br />activate()不会立即转页，它仅保存页面对象引用在IRequestCycle中。listener执行结束后才会转业。<br /> <br />获得转页页面对象 <br /><br />.page不用任何声明，.java提供抽象方法和元数据 <br />.page中inject页面属性，.java中提供抽象方法<br />使用元数据inject页面和属性，可以不用在.page中进行声明 <br />获得页面使用@injectPage("pageName") <br />t4中若发现该类包含一个未实现的“getXXX”方法，会默认产生一个实例变量XXX。该实例变量没有初始化方法，可以在getXXX()声明@InitialValue("literal:initValue")解决<br /><br />表单验证 <br /><br />delegate <br />方案1：打印出错信息需要new一个ValidationDelegate。 <br />方案2：.page文件中配置&lt;bean>标签 <br />方案3：.page中不配置&lt;bean>，抽象方法上使用元数据@Bean<br />validators <br />.page文件中每个需要验证的表单元素组件绑定一个validators <br />表达式：validators:+判断条件+[错误提示]<br />空输入问题 <br />t4默认空都可以验证通过 <br />通过[value="validators:required"]来保证输入不为空<br />Fieldlable可以与TextField绑定显示错误信息 <br />客户端验证 <br />在Form组件中绑定&lt;binding name="clientValidationEnabled" value="true"/><br />若表单输入验证正确，逻辑上的验证应该在监听方法中进行 <br />例如：苹果库存只有20，用户买进50，这是非法的 <br />验证时应向ValidationDelegate记录出错信息<br />创建delegate <br />delegate.setFormComponent((IFormComponent) getComponent("XXX")); <br />delegate.recordFieldInputValue(Integer.toString(XXXX)); <br />delegate.record("XXX must be >=0",ValidationConstraint.TOO_SMALL);<br />每个页面对象都报含一个Map，保存bean。（没有则自动创建，返回页面池时bean自动销毁1）若要在.page中获得一个已定义的Bean，使用beans前缀调用。例如：beans.beanId.beanProperty。 <br />For、Foreach使用时，要在.page中对&lt;source>集合对象内的元素声明&lt;property>。以方便t4，生成get、set方法。<br /> <br /> 组件复用 <br /><br />t4中一个组件不能用两次，即一个jwcid不能在.html中重复出现 <br />解决方案：组件重命名。&lt;compoment id="rename" copy-of="name"><br />“Class@XXX”表示访问一个class的XXX静态方法或静态变量 <br />判断按钮是否clicked三种方式 <br /> 对每个button使用一个Form组件 <br /> 给每个button添加一个“tag”，通过tag值判断which按钮be clicked <br /> 为每个button添加一个listener（简单、面向对象，推荐使用）<br /><br /> submit提交原理 <br /><br />监听方法获得参数的方式 <br />1、实现IRequestCycle会的监听方法的参数 <br />2、声明带正确参数顺序的监听方法，t4自动boxing <br />* public type method(parameters) <br />* public type method(IRequestCycle cycle, parameters) <br />* public type method() <br />* public type method(IRequestCycle cycle) <br />页面提交后，t4会从页面pool重新获得或创建page object。因此提交前后同一页面的页面对象引用是不一样的，实例变量可能会一样也不可能一样。 <br /> 因此不要在页面对象在定义成员变量（包括页面组件对应的成员变量），因为跨页面访问他们总是无效的有潜在危险。 <br />上面问题的解决方案 <br />1、使用客户端持久化需要访问的持久化成员变量，声明get、set抽象方法，用@Persist("client")注释。 使用时应判断get方法是否为null，因为这种持久化方式不会初始化变量 <br />2、使用抽象get、set方法，由t4来实现。<br />HiveMind模块 <br />session对象可以在hivemodule.xml中配置 <br />hivemodule.xml存放于WEB-INF/classes/META-INF 目录下。或.jar文件的META-INF目录下 <br />hivemodule.xml每个模块的id必须唯一，一般以模块包名作为id<br /> session <br />获得方式 <br />1、声明抽象方法，通过元数据injectState("ObjectName")注释 <br />2、声明抽象方法，在.page中&lt;inject>对象<br />判断存在方式 <br />annotation <br />1、声明抽象方法，该方法命名格式为getXXX()或者isXXX() <br />2、使用元数据注释@InjectStateFlag("sessionObj")<br />.page声明&lt;inject type="state-flag" property="userExists" object="sessionObj"/><br />注销：使用Servicelink组件的restart service。该service删除sessionObj，并且从定向到首页。<br /> t4通过无参的构造器来创建对象 <br />安全处理 <br />1、关键性页面应该在页面中进行用户验证，防止匿名用户访问。页面对象实现PageValidateListener接口。 <br />2、htmlA-〉login-〉htmlA方式解决方案 <br />该页面类实现IExternalPage，该接口可接受参数<br />参数维护 <br /> 客户端保存参数（推荐） <br />1、使用Hidden组件，并提供该属的get、set方法实现 <br />2、使用元数据@Persist("client")，不能够声明abstract的set、get方法<br />session保存参数<br />snippets <br />默认表达式 <br />.html中为literal <br />.page中为OGNL <br />property access <br />mathematical expressions <br />method invocations <br />reference static fields of public classes <br />create new objects, including lists and maps<br />URL中的sp，t3叫服务参数、t4叫监听参数 <br />page对象查询 <br />1、.page中声明 <br />2、在.application声明org.apache.tapestry.page-class-packages中查找(推荐)<br />特殊页面组件 <br />1、$remove$，删除该html元素（即仅去掉某元素） <br />2、$content$，只生成该元素标签间的的html code， 该元素以外其它元素忽略去掉（即仅保留某元素标签内的内容）<br />国际化 <br />html中使用技巧 <br />1、&lt;span key="hello">Hello&lt;/span>指名说用字典key <br />2、必须为&lt;span>标签，且key自不必加前缀（如message：，OGNL：）<br />不同地区的页面风格，以XXX_CN.html这种方式命名 <br />字典文件 <br />1、每个page可以拥有一个poperties <br />2、在WEB-INF下建立${servletname}.properties，所有page共享<br />自定义组件 <br />组件配置文件推荐最合理是放在WEB-INF下 <br />contrib中的控件的使用 <br />&lt;library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/><br />input校验 <br />推荐使用writer.beginEmpty("input") <br />使用writer.begin("input")和writer.end()<br />rewinding（重绕），可以理解为刷新 <br />form.isRewinding() <br />cycle.isRewinding()<br />参数 <br />组件参数初始化 <br />.jwc中&lt;parameter>设置初始化 <br />finishLoad()方法中初始化<br />参数类型 <br />formal：是被定义在组件规范中的组件参数。每个formal parameter有一个特定（区分大小写）的名称，并且被标为required或者optional。 <br />informa：是Html元素的属性参数。<br />页面配置 <br />绑定方式 <br />1、静态绑定：即只读，绑定的值在组件规范中指定 <br />2、动态绑定：组件需要的时候，动态绑定通过其指定的JavaBean获得值
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24984#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Sep 2006 15:36:56 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24984</link>
        <guid>http://ralf-realman.javaeye.com/blog/24984</guid>
      </item>
      <item>
        <title>Tapestry页面提交执行顺序</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24762" style="color:red;">http://ralf-realman.javaeye.com/blog/24762</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一，页面是页面，页面跳转的时候，需要清空properties数据，否则，这些数据保存在session里面，很容易造成bug。打个比方说吧，initialize()这个方法，的确，在页面表现的时候，执行两次。页面表现之前，初始化你的页面，然后页面表现你的业务逻辑，比如你要显示什么新闻呀等等。。。最后，页面在结束表现之前，再次执行这个方法，将你的properties还原为初始值，这样，在你的下次再访问该页面的时候，不会因为properties的值已经改变而造成意想不到的错误。<br /><br />第二，提交一般是指表单，也就是formSubmit。如果你希望这个表单在提交之前就有初始值，也很容易，将ognl对应的get方法对应的成员变量初始化一个值就可以。比如说用initialize()来初始化。在你submit之后，ognl会自动调用properties相应的set方法赋值，你在form对应的监听方法进行数据处理就可以了。<br /><br />第三，其它的Tapestry自带方法就不说了。什么validate()等等，都不提，只讲这5个方法： <br />initialize() <br />detach() <br />attach() <br />pageBeginRender() <br />pageAfterRender() <br />它们的执行是有先后顺序的，其中只有initialize()方法会执行两次，其它的都执行一次。这些特点，足够你利用来做很多事。 <br />页面在表现（render）的时候，我只以direct service举例: <br />1）执行initialize()，初始化该页面的properties，这些properties都应该是客户端的瞬时状态。 <br />2）执行attach(IEngine value)，获取你的engine。所以，你可以利用这个方法往你的web容器里面加载服务。 <br />3）执行pageBeginRender()，同样是用来在页面表现之前，给你希望的变量赋值。。比如说，我基本上是用这个方法来获取Visit对象中储存的session值。 <br />4）页面表现业务逻辑。你的什么Foreach啊，等等，现在才开始执行。 <br />5）执行pageEndRender()。在你的页面业务逻辑表现完之后，如果你希望有什么后续工作，可以在这里执行。 <br />6）执行detach()的super()，也就是执行AbstractPage里面Tapestry自己的detach()，目的是为了清空该页面所调用的engine,visit,requestCycle。因为如果不清空的话，比如什么用户信息的话，就可能会泄露。这个方法的存在是Tapestry基于安全性的考虑。 <br />7）执行initialize()，再次将你的properties恢复为初始值。 <br />8）执行detach()里面，你自己写的内容。。 <br />以上仅仅最简单的情况下，这5种方法的执行顺序。。。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24762#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:17:37 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24762</link>
        <guid>http://ralf-realman.javaeye.com/blog/24762</guid>
      </item>
      <item>
        <title>Tapestry入门问题集(一) [转] </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24760" style="color:red;">http://ralf-realman.javaeye.com/blog/24760</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1 方法PageBeginRender(PageEvent event)没有被执行 <br />  出现此问题的原因常见的有两种:一是页面类没有implements PageRenderListener,二是在page文件中指定页面类不正确 <br /><br />2 自定义组件问题 <br />  组件类必须继承BaseComponent或AbstractComponent类或其子类,需要用到模板(html)的组件需继承BaseComponent类,不需要用的则继承AbstractComponent类. <br /><br />3.page与html分离方法: <br />  把.page的定义加入到.application文件中 <br />&lt;page name="AAA" specification-path="/page/AAA.page"/> <br />然后在.page文件中要添加&lt;context-asset name="＄template" path="template/AAA.html"/><br /><br />4.启动Web服务器时加启动参数，则修改html和page文件不需要重新启动，如果用MyEclipse,在eclipse-->Preferences-->myEclipse-->Tomcat5-->JDK中设置 :<br />-Dorg.apache.tapestry.enable-reset-service=true<br />-Dorg.apache.tapestry.disable-caching=true<br /><br />5.JSP可以通过request.getParameter（）来获取，那么Tapestry通过什么方法来获取呢，目前发现两种办法：<br /><br />1). String nodeIdStr = this.getRequestCycle().getRequestContext()<br />     .getRequest().getParameter("你想获取的参数名");<br /><br />2).Object[] parameters = cycle.getServiceParameters(); 然后在parameters 取参数，比如第一个参数是整数<br /><br /> int page = ((Integer) parameters[0]).intValue();这种方法复杂一些
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24760#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:10:52 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24760</link>
        <guid>http://ralf-realman.javaeye.com/blog/24760</guid>
      </item>
      <item>
        <title>PropertySelection组件如何设置的value初始值 [转] </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24759" style="color:red;">http://ralf-realman.javaeye.com/blog/24759</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          PropertySelection在使用时必须提供一个类来实现IPropertySelectionModel接口。该接口有五个方法，其中getOption方法就用来定位PropertySelection的value参数初始值在下拉菜单中的位置。 <br /><br />所以，要在下拉菜单中定位，有两个条件： <br />第一：value参数有初值； <br />第二：public Object getOption(int index) 方法返回的值要与value参数中值对应。 <br /><br />比如你的下拉菜单来自str[] ={a1,a2,a3}，你要定位a2，那么第一提供value参数： <br />public String selected = a2; <br />那么public Object getOption(int index) 的返回值，必须与selected对应，比如： <br /><br />public Object getOption(int index) { <br />return str[index] <br />} <br /><br />那么在PropertySelected便历时，即index=1（从0开始）时，正好就能够得到selected的值，那么就实现定位了。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24759#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:10:25 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24759</link>
        <guid>http://ralf-realman.javaeye.com/blog/24759</guid>
      </item>
      <item>
        <title>Tapestry的函数的执行顺序 [转] </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24758" style="color:red;">http://ralf-realman.javaeye.com/blog/24758</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对之前的该文章进行了一些修正，主要是针对finishLoad()方法。 <br /><br />我觉得对初学者会有一些帮助。 <br /><br />下面这几个函数是我在使用的，它们的执行顺序依次从上到下。 <br /><br /><br />1.protected void finishLoad() {}  *** <br /><br />2.public void pageValidate(PageEvent event) {} <br /><br />3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br /><br />4.public void pageBeginRender(PageEvent event) {} <br /><br />   // 如果有表单提交，则将form中的各字段的值赋给页面类 <br />5.   ...... 赋值 <br /><br />6.public void submit() // 表单提交等用listenter:调用的方法 <br /><br />7.protected void prepareForRender(IRequestCycle cycle) {} <br /><br />---------------------------------------------------- <br /><br />1.protected void finishLoad() {} <br />   这个函数最先执行，但是它实际上没有什么用处（我感觉）。因为： <br />　　这个函数只在页面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱：如果你的tomcat启动时使用了-Dorg.apache.tapestry.disable-caching=true(为了调试方便而设)，那么你每次刷新页面时，它都会执行（因为每个request都会新生成一个页面类对象），造成了它总是执行的假象。在实际的部署时，会使用caching，则这个函数执行的机会很少。所以要注意。 <br />　　初始化的代码放在4 pageBeginRender()中 <br /><br />2.public void pageValidate(PageEvent event) {} <br />    如果实现了PageValidateListener接口，则可以在这里进行验证，比如访问权限等。执行完1后，它就开始执行。 <br /><br />3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br />    如果实现了IExternalPage接口，则可以从这里取得由外面传过来的参数。执行2后，执行到这里。在这里可以把那些参数取出，赋给页面类。 <br /><br />4.public void pageBeginRender(PageEvent event) {} <br />    执行完3后，将执行本函数。但是这时从客户端传过来的参数还没有被赋值(如果提交了表单的话)。这里可以进行一些初始化操作。 <br /><br />5.执行完4后，如果有表单提交，在这里将会取出那些值，赋给对应的字段。(注意：只是将表单中有的值赋过来) <br /><br />6.public void submit() <br />    如果有表单提交的话，在这里将进行对应的操作。因为此时各字段已经取好值了，所以可以拿来直接用。 <br /><br />7.protected void prepareForRender(IRequestCycle cycle) {} <br />    最后才执行这个方法。我们可以在其中进行为了在页面上显示数据而进行的操作，比如取得什么对象什么的，因为这里页面类的属性赋值已经结束，可以直接拿来使用了。 <br />    注意：如果执行了6，则还要执行4，再执行7。如果没有6，4完了就直接是7。 <br /><br /><br />以上是我所总结的执行顺序，不当之处请指出。 <br /><br />----------------------------------------------------- <br /><br />最开始学tapestry的时候，觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRender这个函数，什么初始化操作都放在它里面。可是它是在赋值之前执行，所以拿到的字段多都是空的，却都以为是没有持久化的缘故。所以在客户端里放了一大堆的@Hidden，或者session中持久，非常麻烦，，，对tapestry也产生的怀疑。现在才知道那些需要取得客户端传来的参数的代码，最好放在prepareForRender里，很多不必要的持久都可以省掉了。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24758#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:09:57 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24758</link>
        <guid>http://ralf-realman.javaeye.com/blog/24758</guid>
      </item>
      <item>
        <title>Tapestry资源列表</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24757" style="color:red;">http://ralf-realman.javaeye.com/blog/24757</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1 官方站点: <br />http://jakarta.apache.org/tapestry/ <br />2 邮件列表存档 <br />http://news.gmane.org/gmane.comp.java.tapestry.user <br />3 组件 <br />t-deli:http://www.t-deli.com/ <br />tapestry-javaforge:http://howardlewisship.com/tapestry-javaforge/ <br />tacos:http://tacos.sourceforge.net/ <br />tapfx:http://tapfx.sourceforge.net/ <br />4 blog: <br />http://howardlewisship.com/blog/ <br />5 tapestry 应用 <br />cognition,一个快速WEB开发框架:http://dev.thelabllc.com/cognition/ <br />trails,rails的tapestry实现：https://trails.dev.java.net/ <br />appfuse:https://appfuse.dev.java.net/ <br />MaCaTa:http://web.aanet.com.au/websystems/index.html <br />Honeycomb:http://honeycomb.javaforge.com/ <br />6 hivemind <br />HiveMind Utilities:http://hivetranse.sourceforge.net/web/index.html <br />HiveBoard:http://sourceforge.net/projects/hiveboard
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24757#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:09:29 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24757</link>
        <guid>http://ralf-realman.javaeye.com/blog/24757</guid>
      </item>
      <item>
        <title>判断页面是否登陆或过期 [转] </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24756" style="color:red;">http://ralf-realman.javaeye.com/blog/24756</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          public abstract class MyBasePage extends BasePage implements<br />  PageValidateListener {<br /><br /> /* <br />  * 判断session是否清空，如果为空则跳到提示页面<br />  * @see org.apache.tapestry.event.PageValidateListener#pageValidate(org.apache.tapestry.event.PageEvent)<br />  */<br /> public void pageValidate(PageEvent event) {<br />  Visit visit = (Visit) getVisit();<br /><br />  if (visit != null)<br />   return;<br />  throw new PageRedirectException("SessionTimeOut";<br /> }<br />}<br /><br />然后自己所写的类继承MyBasePage,而不是BasePage,不过记住注销方法里面需要设置visit=null<br /><br /><br />import javax.servlet.http.HttpSession;<br /><br />import org.apache.tapestry.IRequestCycle;<br />import org.apache.tapestry.engine.BaseEngine;<br /><br />public class MyEngine extends BaseEngine {<br />private static org.apache.log4j.Logger logger = org.apache.log4j.LogManager<br />.getLogger(MyEngine.class.getName());<br /><br />private static final long serialVersionUID = -628778836971125385L;<br /><br />private transient boolean killSession; //是否要进行session注销操作，默认为false<br /><br />// public String getStaleSessionPageName() {<br />// return "Home";<br />// }<br /><br />/** 下面的方法用于注销用户 */<br /><br />protected void cleanupAfterRequest(IRequestCycle cycle) {<br /><br />super.cleanupAfterRequest(cycle);<br />if (killSession) {<br />try {<br />HttpSession session = cycle.getRequestContext().getSession();<br />if (session != null) {<br />session.invalidate();<br />logger.debug("注销用户";<br />}<br />} catch (IllegalStateException ex) {<br /><br />}<br />}<br />}<br /><br />public void logout() {<br />killSession = true;<br />Visit visit = (Visit) this.getVisit();<br />if (visit != null) {<br />visit.setAppKey(null);<br />visit.setBnetid(null);<br />visit.setCalledUserIdList(null);<br />visit.setIsadmin(false);<br />visit.setCalledUserIdList(null);<br />visit.setIsSet(false);<br />visit.setRole(0);<br />visit.setRulePriority(null);<br />visit.setSeluserid(null);<br />visit.setTupttosave(null);<br />visit.setUserEmail(null);<br />visit.setUserid(null);<br />visit.setUsername(null);<br />}<br /><br />}<br /><br />}
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24756#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:08:49 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24756</link>
        <guid>http://ralf-realman.javaeye.com/blog/24756</guid>
      </item>
      <item>
        <title>简单分页类 [转] </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24755" style="color:red;">http://ralf-realman.javaeye.com/blog/24755</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          public abstract class PagingPage extends BasePage implements PageRenderListener <br />{ <br />    /***************************************************** <br />     *分页功能 <br />     *****************************************************/ <br />     <br />    protected int getPagesize() <br />    { <br />        return 12; <br />    } <br />     <br />    /**数据源设置 <br />     * @return 数据源 <br />     */ <br />    public abstract ArrayList iniPage(); <br />     <br />    public abstract void setCurrentpage(String value); <br />    public abstract void setPagecount(String value); <br /><br />    public abstract void setCmd(String cmd); <br />    public abstract String getCmd(); <br />     <br />    public abstract void setPageList(List list); <br />    public abstract List getPageList(); <br />   <br />    public abstract void setPageNo(String pageno); <br />    public abstract String getPageNo(); <br />     <br />    private int getPageCount() <br />    { <br />        int pagesize = getPagesize(); <br />        ArrayList temp = iniPage(); <br />        if(temp!=null && temp.size()!=0) <br />     { <br />     int count = temp.size(); <br />     int pagecount = count/pagesize; <br />     if(count > pagesize*pagecount) <br />     { <br />     pagecount++; <br />     } <br />     return pagecount; <br />     } <br />        else <br />        { <br />            return 0; <br />        } <br />    } <br /><br />    /** 初始化绑定表格 <br />     *count:记录数 <br />     *pagecount：分页数 <br />     *currentpage:当前页码 <br />     */ <br />    public void bind(int page) <br />    { <br />//     设置数据源 <br />     List list = new ArrayList(); <br />     ArrayList temp = iniPage(); <br />     <br />     int pagecount = getPageCount(); <br />     int currentpage = page; <br />     int pagesize = getPagesize(); <br /><br />     setPageNo(Integer.toString(page)); <br />     //绑定到表格 <br />     if(temp!=null && temp.size()!=0) <br />     { <br />     int count = temp.size(); <br />      <br />     setCurrentpage(Integer.toString(currentpage)); <br />     <br />     setPagecount(Integer.toString(pagecount));   <br />     <br />     if(count&lt;=pagesize*page) <br />     { <br />     for(int i=pagesize*(page-1);i&lt;count;i++) <br />     { <br />     list.add(temp.get(i)); <br />     } <br />     } <br />     else <br />     { <br />     for(int i=pagesize*(page-1);i&lt;pagesize*page;i++) <br />     { <br />     list.add(temp.get(i)); <br />     } <br />     } <br />     } <br />        else <br />        { <br />            setCurrentpage(null); <br />            setPagecount(null); <br />        } <br />     setPageList(list); <br />    } <br />     <br />    /** <br />     * 页面呈现 <br />     */ <br />    public void pageBeginRender(PageEvent event) <br />    { <br />     if(getCmd()!=null) <br />        { <br />         int cmd =0; <br />         cmd = Integer.parseInt(getCmd()); <br />         int pagecount = getPageCount(); <br />         int pageno = Integer.parseInt(getPageNo()); <br />         switch(cmd) <br />{ <br />             case 1: <br />                 if(pageno!=1) <br />                 { <br />                     pageno--; <br />                 } <br />              bind(pageno); <br />              break; <br />         case 2: <br />             if(pageno!=pagecount) <br />             { <br />                 pageno++; <br />             } <br />         bind(pageno); <br />         break; <br />         case 3: <br />         bind(1); <br />             break; <br />         case 4: <br />         bind(pagecount); <br />              break; <br />         default: <br />         bind(1); <br />} <br />        } <br />     else <br />     { <br />     bind(1); <br />     } <br />    } <br />} <br /><br />zhanghui代无忌补充：&lt;tr> <br />        &lt;td height="23" colspan="14" class="infoblock">&lt;div align="right"> 第&lt;span jwcid="@Insert" value="ognl:currentpage">1&lt;/span>页 共&lt;span jwcid="@Insert" value="ognlagecount">10&lt;/span>页 &lt;a jwcid="first@LinkSubmit" selected="ognl:cmd" tag="ognl:3">首页&lt;/a> &lt;a jwcid="pre@LinkSubmit" selected="ognl:cmd" tag="ognl:1">上一页&lt;/a> &lt;a jwcid="next@LinkSubmit" selected="ognl:cmd" tag="ognl:2">下一页&lt;/a> &lt;a jwcid="last@LinkSubmit" selected="ognl:cmd" tag="ognl:4">尾页&lt;/a> &lt;/div>&lt;/td> <br />     &lt;/tr>
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24755#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:07:34 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24755</link>
        <guid>http://ralf-realman.javaeye.com/blog/24755</guid>
      </item>
      <item>
        <title>Tapestry4分页组件参考（一） </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24754" style="color:red;">http://ralf-realman.javaeye.com/blog/24754</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          import java.util.Collection;<br />import org.apache.tapestry.*;<br />import org.apache.tapestry.listener.ListenerInvoker;<br />import org.apache.tapestry.form.Submit;<br /><br />public abstract class Pagination extends Submit {<br />    private static final String FIRST_ID = "showFirstPage";<br />    private static final String PREV_ID = "showPrevPage";<br />    private static final String NEXT_ID = "showNextPage";<br />    private static final String LAST_ID = "showLastPage";<br />    private static final String GOTO_ID = "showGotoPage";<br />    private static final String TO_PAGE_ID = "toPage";<br /><br />    public abstract IAsset getFirstImage();<br /><br />    public abstract IAsset getPrevImage();<br /><br />    public abstract IAsset getNextImage();<br /><br />    public abstract IAsset getLastImage();<br /><br />    public abstract IAsset getGotoImage();<br /><br />    public abstract Object getFlag();<br /><br />    public abstract int getToPageValue();<br /><br />    public abstract void setToPageValue(int value);<br /><br />    public abstract PaginationModel getModel();<br /><br />    public abstract IActionListener getListener();<br /><br />    public abstract ListenerInvoker getListenerInvoker();<br /><br />    public void renderFormComponent(IMarkupWriter writer,<br />        IRequestCycle cycle) {<br /><br />        String id = this.getId();<br />        Log.getLogger().debug("render Id = " + id);<br />        PaginationModel model = getModel();<br />        //****************************************************<br />         buildInfo(writer, model);<br />        buildHidden(writer, id);<br /><br />        buildImage(writer, id, FIRST_ID, getFirstImage().buildURL());<br />        buildImage(writer, id, PREV_ID, getPrevImage().buildURL());<br />        buildImage(writer, id, GOTO_ID, getGotoImage().buildURL());<br />        buildText(writer, TO_PAGE_ID, model.getCurrentPage() + "");<br />        buildImage(writer, id, NEXT_ID, getNextImage().buildURL());<br />        buildImage(writer, id, LAST_ID, getLastImage().buildURL());<br />        //renderIdAttribute(writer, cycle);<br />        //renderInformalParameters(writer, cycle);<br />    }<br /><br />    protected void rewindFormComponent(IMarkupWriter writer,<br />        IRequestCycle cycle) {<br />        final IActionListener listener = getListener();<br />        if (listener != null) {<br />            Log.getLogger().debug("Invoke Listener");<br />            final ListenerInvoker listenerInvoker = getListenerInvoker();<br />            Object parameters = getParameters();<br /><br />            if (parameters != null) {<br />                if (parameters instanceof Collection) {<br />                    cycle.setListenerParameters( ( (Collection) parameters).<br />                        toArray());<br />                }<br />                else {<br />                    cycle.setListenerParameters(new Object[] {parameters});<br />                }<br />            }<br />            listenerInvoker.invokeListener(<br />                listener, Pagination.this, cycle);<br />        }<br /><br />        String id = this.getId();<br />        Log.getLogger().debug("render Id = " + id);<br />        PaginationModel model = getModel();<br />        updateModel(id, model, cycle);<br /><br />        final IActionListener action = getAction();<br />        final IRequestCycle cycleTemp = cycle;<br />        if (action != null) {<br />            final ListenerInvoker listenerInvoker = getListenerInvoker();<br />            Runnable notify = new Runnable() {<br />                public void run() {<br />                    listenerInvoker.invokeListener(action, Pagination.this,<br />                        cycleTemp);<br />                }<br />            };<br />            getForm().addDeferredRunnable(notify);<br />        }<br />    }<br /><br />    private static void updateModel(String id, PaginationModel model,<br />        IRequestCycle cycle) {<br />        if (model == null) {<br />            Log.getLogger().debug("updateModel is Null");<br />            return;<br />        }<br />        Log.getLogger().debug("Id = " + id);<br />        String selected = cycle.getParameter(id);<br />        Log.getLogger().debug("Now Is:" + selected);<br /><br />        if (FIRST_ID.equals(selected)) {<br />            model.goTo(1);<br />        }<br />        else if (PREV_ID.equals(selected)) {<br />            model.goTo(model.getCurrentPage() - 1);<br />        }<br />        else if (NEXT_ID.equals(selected)) {<br />            model.goTo(model.getCurrentPage() + 1);<br />        }<br />        else if (LAST_ID.equals(selected)) {<br />            model.goTo(model.getPageCount());<br />        }<br />        else {<br />            String toPageValue = cycle.getParameter(TO_PAGE_ID);<br />            Log.getLogger().debug("To Page Is:" + toPageValue);<br />            try {<br />                int toPage = Integer.valueOf(toPageValue);<br />                model.goTo(toPage);<br />            }<br />            catch (Exception ex) {<br /><br />            }<br />        }<br />    }<br /><br />    private static void buildImage(IMarkupWriter writer,<br />        String hiddenId, String name, String src) {<br />        writer.beginEmpty("input");<br />        writer.attribute("type", "image");<br />        writer.attribute("name", name);<br />        writer.attribute("id", name);<br />        writer.attribute("border", 0);<br />        writer.attribute("src", src);<br />        writer.attribute("onclick",<br />            "javascript:" + hiddenId + ".value='" + name + "'");<br />    }<br /><br />    private static void buildText(IMarkupWriter writer,<br />        String name, String value) {<br />        writer.beginEmpty("input");<br />        writer.attribute("type", "text");<br />        writer.attribute("name", name);<br />        writer.attribute("id", name);<br />        writer.attribute("value", value);<br />        writer.attribute("size", "3");<br />    }<br /><br />    private static void buildHidden(IMarkupWriter writer, String name) {<br />        writer.beginEmpty("input");<br />        writer.attribute("type", "hidden");<br />        writer.attribute("name", name);<br />        writer.attribute("id", name);<br />        writer.attribute("value", "");<br />    }<br /><br />    private static void buildInfo(IMarkupWriter writer, PaginationModel m) {<br />        StringBuilder sb = new StringBuilder(<br />            "总记录数:&lt;font color=\"#F67103\">");<br />        sb.append(m.getRowCount());<br />        sb.append("&lt;/font>条  当前显示:&lt;font color=\"#F67103\">");<br />        sb.append(m.getCurrentPage()).append("/").append(m.getPageCount());<br />        sb.append("&lt;/font>页&lt;/font>");<br />        writer.printRaw(sb.toString());<br />    }<br /><br />    public abstract Object getParameters();<br />}<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;!DOCTYPE component-specification PUBLIC<br />  "-//Apache Software Foundation//Tapestry Specification 4.0//EN"<br />  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"><br />&lt;component-specification class="com.web.component.pagination.Pagination" allow-body="no" allow-informal-parameters="yes"><br />    &lt;description>Pagination Component&lt;/description><br />    &lt;parameter name="model" required="yes"/><br />    &lt;parameter name="listener"/><br />    &lt;parameter name="action"/><br />    &lt;parameter name="parameters"/><br /><br />    &lt;parameter name="firstImage" default-value="asset:first"/><br />    &lt;parameter name="prevImage" default-value="asset:prev"/><br />    &lt;parameter name="nextImage" default-value="asset:next"/><br />    &lt;parameter name="lastImage" default-value="asset:last"/><br />    &lt;parameter name="gotoImage" default-value="asset:goto"/><br /><br />    &lt;asset name="first" path="first.gif"/><br />    &lt;asset name="prev" path="prev.gif"/><br />    &lt;asset name="next" path="next.gif"/><br />    &lt;asset name="last" path="last.gif"/><br />    &lt;asset name="goto" path="goto.gif"/><br />    &lt;inject property="listenerInvoker" object="infrastructure:listenerInvoker"/><br />&lt;/component-specification><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />&lt;font color="#0000ff">    总记录数:<br />    &lt;font color="#ff00ff"><br />        &lt;span jwcid="@Insert" value="ognl:model.rowCount"/><br />    &lt;/font><br />    条  当前显示:<br />    &lt;font color="#ff00ff"><br />        &lt;span jwcid="@Insert" value="ognl:model.currentPage"/><br />        /<br />        &lt;span jwcid="@Insert" value="ognl:model.pageCount"/><br />    &lt;/font><br />    页<br />&lt;/font><br />&lt;a jwcid="showFirstPage">&lt;&lt;&lt;/a><br />&lt;a jwcid="showPrevPage">&lt;&lt;/a><br />&lt;a jwcid="showToPage">To&lt;/a><br />&lt;input jwcid="toPage" type="text" size="3"/><br />&lt;a jwcid="showNextPage">&gt;&lt;/a><br />&lt;a jwcid="showLastPage">&gt;&gt;&lt;/a>
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24754#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:07:08 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24754</link>
        <guid>http://ralf-realman.javaeye.com/blog/24754</guid>
      </item>
      <item>
        <title>Tapestry4分页组件参考（二） </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24753" style="color:red;">http://ralf-realman.javaeye.com/blog/24753</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          import java.util.List;<br />import java.util.ArrayList;<br />import org.apache.hivemind.util.Defense;<br />import com.eshore.tips.web.page.common.Log;<br />import java.io.Serializable;<br /><br />public class PaginationModel implements Serializable{<br />    protected int rowCount;<br />    protected int pageSize;<br />    protected int currentPage;<br />    protected List dataList;<br /><br />    /**<br />     * 通过数据列表创建模型,适用于小表分页<br />     * @param data 数据列表<br />     * @param pageSize 每页行数<br />     */<br />    public PaginationModel(List data, int pageSize) {<br />        Defense.notNull(data, "数据列表");<br />        if (pageSize &lt;= 0) {<br />            throw new IllegalArgumentException("分页尺寸非正数");<br />        }<br />        this.dataList = data;<br />        this.rowCount = data.size();<br />        this.pageSize = pageSize;<br />        this.currentPage = 1;<br />        Log.getLogger().debug("建立分页模型: " + toString());<br /><br />    }<br /><br />    public PaginationModel(int rowCount, int pageSize) {<br />        if (rowCount &lt; 0) {<br />            throw new IllegalArgumentException("行数为负数");<br />        }<br />        if (pageSize &lt;= 0) {<br />            throw new IllegalArgumentException("分页尺寸非正数");<br />        }<br />        this.dataList = new ArrayList();<br />        this.rowCount = rowCount;<br />        this.pageSize = pageSize;<br />        this.currentPage = 1;<br />        Log.getLogger().debug("建立分页模型: " + toString());<br />    }<br /><br />    public int getRowCount() {<br />        return rowCount;<br />    }<br /><br />    public void setRowCount(int rowCount) {<br />        this.rowCount = rowCount;<br />    }<br /><br />    public int getPageSize() {<br />        return pageSize;<br />    }<br /><br />    public void setPageSize(int pageSize) {<br />        this.pageSize = pageSize;<br />    }<br /><br />    public int getCurrentPage() {<br />        return currentPage;<br />    }<br /><br />    public boolean hasNextPage() {<br />        return currentPage * pageSize &lt; rowCount;<br />    }<br /><br />    public boolean hasPrevPage() {<br />        return currentPage > 1;<br />    }<br /><br />    public int getPageCount() {<br />        if (rowCount == 0) {<br />            return 1;<br />        }<br />        return (rowCount - 1) / pageSize + 1;<br />    }<br /><br />    public void goTo(int toPage) {<br />        if (toPage &lt; 1) {<br />            currentPage = 1;<br />        }<br />        else if (toPage > getPageCount()) {<br />            currentPage = getPageCount();<br />        }<br />        else {<br />            currentPage = toPage;<br />        }<br />        Log.getLogger().debug("转到第 " + currentPage + " 页");<br />    }<br /><br />    public List getPaginationData() {<br />        int from = (currentPage - 1) * pageSize;<br />        int to = from + pageSize;<br />        if (to &lt;= rowCount) {<br />            return dataList.subList(from, to);<br />        }<br />        else {<br />            return dataList.subList(from, rowCount);<br />        }<br /><br />    }<br /><br />    public String toString() {<br />        return String.format(<br />            "总行数=%d,每页行数=%d,页数=%d,当前页=%d",<br />            rowCount, pageSize, this.getPageCount(), currentPage)<br />                + super.toString();<br />    }<br /><br />}
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24753#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:06:33 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24753</link>
        <guid>http://ralf-realman.javaeye.com/blog/24753</guid>
      </item>
      <item>
        <title>Tapestry上传多附件 [转] </title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24752" style="color:red;">http://ralf-realman.javaeye.com/blog/24752</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以发送5个附件为实例：<br /><br /> private IUploadFile file0;<br /><br /> public IUploadFile getFile0() {<br />  return file0;<br /> }<br /><br /> public void setFile0(IUploadFile value) {<br />  file0 = value;<br /> }<br /><br /> protected void initialize() {<br />  file0 = null;<br /> }<br /> private IUploadFile file1;<br /><br /> public IUploadFile getFile1() {<br />  return file1;<br /> }<br /><br /> public void setFile1(IUploadFile value) {<br />  file1 = value;<br /> }<br /> private IUploadFile file2;<br /><br /> public IUploadFile getFile2() {<br />  return file2;<br /> }<br /><br /> public void setFile2(IUploadFile value) {<br />  file2 = value;<br /> }<br /> private IUploadFile file3;<br /><br /> public IUploadFile getFile3() {<br />  return file3;<br /> }<br /><br /> public void setFile3(IUploadFile value) {<br />  file3 = value;<br /> }<br /> private IUploadFile file4;<br /><br /> public IUploadFile getFile4() {<br />  return file4;<br /> }<br /><br /> public void setFile4(IUploadFile value) {<br />  file4 = value;<br /> }<br /><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />List affixList = new ArrayList();<br />  System.out.println("file=    "+ this.getFile0());<br />  if (this.getFile0()!= null) {<br />   affixList.add(this.getFile0());<br />  }<br />  if (this.getFile1() != null) {<br />   affixList.add(this.getFile1());<br />  }<br />  if (this.getFile2()!= null) {<br />   affixList.add(this.getFile2());<br />  }<br />  if (this.getFile3()!= null) {<br />   affixList.add(this.getFile3());<br />  }<br />  if (this.getFile4()!= null) {<br />   affixList.add(this.getFile4());<br />  }<br /><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />List affixPathList = MailUtil.saveTempFile(visit.getUserid(),affixList);<br /><br /> /**<br />  * 将上传的附件保存在临时文件夹<br />  * @param dirName  String<br />  * @param affixList List<br />  * @throws Exception<br />  * @return List<br />  */<br /> public static List saveTempFile(String dirName, List affixList)<br />   throws Exception {<br />  List filePathList = new ArrayList();<br />  try {<br />   String dirPath = makeMailDir(dirName + "//temp");<br /><br />   if (!affixList.isEmpty()) {<br />    Iterator it = affixList.iterator();<br />    while (it.hasNext()) {<br />     IUploadFile uploadFile = (IUploadFile) it.next();<br />     String fileName = uploadFile.getFileName();<br />     File file = new File(dirPath + fileName);<br />     uploadFile.write(file);<br />     filePathList.add(dirPath + fileName);<br /><br />    }<br />    logger.debug("已将附件写进服务器临时文件夹");<br />   }<br /><br />  } catch (Exception ex) {<br />   logger.error("in method saveTempFile", ex);<br />   throw ex;<br />  }<br />  return filePathList;<br /> }<br /><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />mail.setAffixList(affixPathList);
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24752#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 12:05:54 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24752</link>
        <guid>http://ralf-realman.javaeye.com/blog/24752</guid>
      </item>
      <item>
        <title>在eclipse中修改tapestry的page不需要重启的配置</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24737" style="color:red;">http://ralf-realman.javaeye.com/blog/24737</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在eclipse->myeclipse->Application servers->tomcat->jdk->Optional Java VM Arguments 下写上如下<br /><br />-Dorg.apache.tapestry.disable-caching=true<br />-Dorg.apache.tapestry.enable-reset-service=true
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24737#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 10:35:48 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24737</link>
        <guid>http://ralf-realman.javaeye.com/blog/24737</guid>
      </item>
      <item>
        <title>用BeanNameAutoProxyCreator 配置spring的事务处理</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24733" style="color:red;">http://ralf-realman.javaeye.com/blog/24733</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;beans><br />    &lt;!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --><br />    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><br />        &lt;property name="sessionFactory"><br />            &lt;ref bean="sessionFactory"/><br />        &lt;/property><br />    &lt;/bean><br /> <br />    &lt;bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"><br />        &lt;property name="transactionManager" ref="transactionManager"/>?<br />          &lt;property name="transactionAttributes"><br />             &lt;props><br />                  &lt;prop key="*">PROPAGATION_REQUIRED&lt;/prop><br />                  &lt;prop key="find*">PROPAGATION_REQUIRED,readOnly&lt;/prop><br />             &lt;/props><br />          &lt;/property><br />    &lt;/bean><br /> <br />    &lt;bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><br />        &lt;property name="beanNames"><br />            &lt;value>*Service,*Manager&lt;/value><br />        &lt;/property><br />        &lt;property name="interceptorNames"><br />            &lt;list><br />                &lt;value>transactionInterceptor&lt;/value><br />                &lt;!-- 此处增加新的Interceptor --><br />            &lt;/list><br />        &lt;/property><br />    &lt;/bean><br /> <br />    &lt;bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"><br />        &lt;property name="transactionInterceptor" ref="transactionInterceptor"/>?<br />    &lt;/bean><br /> <br />    &lt;bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/><br /> <br />&lt;/beans><br /><br /><br /><br />以后每次的增量是这一段：<br /><br />&lt;bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/><br /><br /><br /><br />其中bean sessionFactory和beandatasource 省略。<br /><br />默认情况下SPRING只有在RuntimeException时才回滚事务，要使其它异常也回滚，需要在配置中作一些改变
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24733#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 09:57:16 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24733</link>
        <guid>http://ralf-realman.javaeye.com/blog/24733</guid>
      </item>
      <item>
        <title>log4j的配置文件结构</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24732" style="color:red;">http://ralf-realman.javaeye.com/blog/24732</a>&nbsp;
          发表时间: 2006年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          log4j.rootLogger=INFO, A1 , R <br />log4j.appender.A1=org.apache.log4j.ConsoleAppender <br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n<br />log4j.appender.R=org.apache.log4j.RollingFileAppender<br />log4j.appender.R.File=$TOMCAT_HOME/logs/log4j.log <br />##将$TOMCAT_HOME换成tomcat的安装目录,也可以指定一个存在的任意目录 <br /><br />log4j.appender.R.MaxFileSize=100KB<br />log4j.appender.R.MaxBackupIndex=1<br />log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n<br />下面的内容摘自springside的手册<br />Log4j提供的appender有以下几种：<br />　　org.apache.log4j.ConsoleAppender（控制台），<br />　　org.apache.log4j.FileAppender（文件），<br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />　　org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br /><br />Log4j提供的layout有以下几种：<br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br /><br />　　Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息<br /><br />　　%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL<br />　　%r 输出自应用启动到输出该log信息耗费的毫秒数<br />　　%c 输出所属的类目，通常就是所在类的全名<br />　　%t 输出产生该日志事件的线程名<br />　　%n 输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n”<br />　　%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />　　%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24732#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Sep 2006 09:55:09 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24732</link>
        <guid>http://ralf-realman.javaeye.com/blog/24732</guid>
      </item>
      <item>
        <title>Tapestry页面的初始化</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24703" style="color:red;">http://ralf-realman.javaeye.com/blog/24703</a>&nbsp;
          发表时间: 2006年09月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          页面一执行，就会触发一个监听器PageEnderListener。 <br />实现PageEnderListener 接口，并重写PageBeginRender 方法，就使得Border <br />组件在表现之前，能够触发PageBeginRender 方法。 <br />public void pageBeginRender(PageEvent event) { <br />Visit visit = (Visit) this.getPage().getVisit(); <br />if (visit.getUsername() != null) { <br />this.setUsername(visit.getUsername()); //从Visit对象中获取用户名 <br />this.setRegister(true); //确定用户已经登陆 <br /><br /><br />} <br />}
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24703#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Sep 2006 16:42:00 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24703</link>
        <guid>http://ralf-realman.javaeye.com/blog/24703</guid>
      </item>
      <item>
        <title>学习Tapestry的链接初体验</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24702" style="color:red;">http://ralf-realman.javaeye.com/blog/24702</a>&nbsp;
          发表时间: 2006年09月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.对于ExternalLink，传递参数的方式却与DirectLink 组件恰恰相反。该组件利用page 参数指明跳转页面，利用parameters <br />参数向URLs 中添加传递值。所以，必须在下一个页面来 <br />接收URLs 中传递过来的值。 <br />&lt;a href="#" jwcid="@ExternalLink" page="SecondPage" parameters='ognl:new <br />java.lang.Integer("1")'>帐目&lt;/a> <br />在这里，生成带有一个Integer 对象的URLs，跳转到SecondPage 页面： <br />为了从URLs中获取传递过来的参数，需要在SecondPage.java <br />文件中实现IExternalPage类及activateExternalPage 方法。在activateExternalPage <br />方法中接收出地过来的参数： <br />/** 实现ExternalLink所必须的方法，参数通过URLs传递过来*/ <br />public void activateExternalPage( <br />Object[] parameters, <br />IRequestCycle cycle) { <br />Integer ig = (Integer)parameters[0]; //获取URLs的参数 <br />this.setColumnNo(ig); <br /><br />} <br /><br />2.至于PageLink 组件，相当于不带参数传递功能的ExternalLink 组件。仅仅需要在该组件的page 参数中写入下一个页面的名称即可。 <br />&lt;a href="#" jwcid="@PageLink" page="FirstPage">购买&lt;/a>
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24702#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Sep 2006 16:40:09 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24702</link>
        <guid>http://ralf-realman.javaeye.com/blog/24702</guid>
      </item>
      <item>
        <title>禁用myeclipse 4.1.1捆绑的spindle，重新安装spindle</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24563" style="color:red;">http://ralf-realman.javaeye.com/blog/24563</a>&nbsp;
          发表时间: 2006年09月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          因为myeclipse内部捆绑了spindle插件，因而无法安装更新版的spindle、和tapestry.palette插件<br /><br />1、在myeclipse安装目录建disabled_features和disabled_plugins主要是用来备份移除spindle文件<br /><br />2、从features移动com.genuitec.myeclipse.tapestry_4.1.0目录到disabled_features目录；从plugins目录移动com.iw.plugins.spindle.core_4.0.3、com.iw.plugins.spindle.docs_4.1.0、com.iw.plugins.spindle.ui_4.0.3、net.sf.solareclipse.ui_0.4.0.spindle-dep-6、net.sf.solareclipse.xml.ui_0.4.0.spindle-dep-6到disabled_plugins目录<br /><br />3、修改myeclipse安装目录下eclipse\features\com.genuitec.myeclipse.enterprise.workbench_4.1.1\feature.xml文件，注释以下内容：   <br />&lt;includes<br />         id="com.genuitec.myeclipse.tapestry"<br />         version="4.1.0"<br />         name="MyEclipse Tapestry / Spindle Support"/><br />4、可以正常的安装使用新版的spindle和tapestry.palette插件了
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24563#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Sep 2006 17:00:06 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24563</link>
        <guid>http://ralf-realman.javaeye.com/blog/24563</guid>
      </item>
      <item>
        <title>我的博客</title>
        <author>ralf_realman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ralf-realman.javaeye.com">ralf_realman</a>&nbsp;
          链接：<a href="http://ralf-realman.javaeye.com/blog/24254" style="color:red;">http://ralf-realman.javaeye.com/blog/24254</a>&nbsp;
          发表时间: 2006年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          妈的，老子第一次写。。。。。。
          <br/>
          <span style="color:red;">
            <a href="http://ralf-realman.javaeye.com/blog/24254#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 12 Sep 2006 16:24:58 +0800</pubDate>
        <link>http://ralf-realman.javaeye.com/blog/24254</link>
        <guid>http://ralf-realman.javaeye.com/blog/24254</guid>
      </item>
  </channel>
</rss>