﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-LifeNote -随笔分类-tomcat</title><link>http://www.blogjava.net/lifenote/category/28041.html</link><description>&amp;nbsp;
Try to find something different in your life and then write it down&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;strong&gt;Java乐园：&lt;a href='http://www.java-bj.cn' target='_blank'&gt;&lt;font color='red' size="+1"&gt;www.java-bj.cn&lt;/font&gt;&lt;/a&gt;  资料下载&lt;/strong&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 15 Jan 2008 04:41:40 GMT</lastBuildDate><pubDate>Tue, 15 Jan 2008 04:41:40 GMT</pubDate><ttl>60</ttl><item><title>Tomcat,Weblogic 等服务器  SSL 安全登陆的例子---附证书文件生成器</title><link>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 15 Jan 2008 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/175432.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/175432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/175432.html</trackback:ping><description><![CDATA[<p>公司今天一个登陆的地方要修改，需要加一个SSL安全登陆,于是查些资料并总结如下，希望对有用的着的朋友有帮助<br />
文件打包地址：http://www.blogjava.net/Files/lifenote/tomcat配置ssl.rar<br />
一下为帮助说明：<br />
<br />
1.1.&nbsp;安全登录 SSL<br />
1.1.1&nbsp;&nbsp;WebLogic下面SSL配置：<br />
1．生成 keystoreFile：<br />
&nbsp;* keystoreFile 文件的生成：<br />
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks</p>
<p>&nbsp;* csr 文件的生成：<br />
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks</p>
<p>&nbsp;* 注意： http 的默认端口是80，https 的默认端口是433，ftp 的默认端口是21。<br />
2．部署keystore 文件<br />
在 &lt;http://hostname:7001/console&gt;&nbsp; 中配置刚才生成的 testKey.jks 文件。</p>
<p>1.1.2&nbsp;Tomcat 下面SSL配置</p>
<p><br />
1．生成 keystoreFile：<br />
&nbsp;* keystoreFile 文件的生成：<br />
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks</p>
<p>Example for inner test：<br />
[root@localhost ~]# <br />
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks<br />
Enter keystore password:&nbsp; someday2007<br />
What is your first and last name?<br />
&nbsp; [Unknown]:&nbsp; lifenote<br />
What is the name of your organizational unit?<br />
&nbsp; [Unknown]:&nbsp; Java<br />
What is the name of your organization?<br />
&nbsp; [Unknown]:&nbsp; Sunxc<br />
What is the name of your City or Locality?<br />
&nbsp; [Unknown]:&nbsp; Beijing<br />
What is the name of your State or Province?<br />
&nbsp; [Unknown]:&nbsp; Beijing<br />
What is the two-letter country code for this unit?<br />
&nbsp; [Unknown]:&nbsp; ZH<br />
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?<br />
&nbsp; [no]:&nbsp; y</p>
<p>Enter key password for &lt;localhost-tomcat&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RETURN if same as keystore password):&nbsp; someday2007<br />
[root@localhost ~]#</p>
<p>&nbsp;</p>
<p>&nbsp;* csr 文件的生成：<br />
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks</p>
<p>&nbsp;* 注意： http 的默认端口是80，https 的默认端口是433，ftp 的默认端口是21。</p>
<p><br />
2．部署keystore 文件<br />
&nbsp; 打开 server.xml 文件，修改内容如下：<br />
&nbsp;<br />
&nbsp;* 只需去掉 server.xml 中对SSL定义的注释，在加上 keystoreFile、keystorePass 这两个属性即可。<br />
&nbsp; &lt;Service<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Catalina"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8080"<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这里 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Connector port="8443" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="e:/temp_E/ssl/testKey.jks" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="aaaaaa"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8009"<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;...<br />
Example for inner test：<br />
&nbsp;&nbsp;&nbsp; &lt;Connector port="443" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="password"/&gt;</p>
<p><br />
&nbsp;注意需默认要使用 443 而不是 8443，要使用8443要在apache中配置，保证从apache请求tomcat 采用 &lt;https://ip:8443/&gt;... 的格式。</p>
<p><br />
1.1.3&nbsp;使用http访问WebService s的客户端配置<br />
Servlet服务器配置好SSL之后，客户端可以使用https访问了。<br />
对于用户使用浏览器访问https的方式，浏览器会弹出安装证书的对话框，确认之后可以正常使用https访问。<br />
&nbsp;对于WebService 通过https方式访问，按照一下步骤：<br />
1．&nbsp;WebService客户端要先取得keyStore文件；<br />
2．&nbsp;虚拟机系统使用 System.setProperties(&#8230;) 设置keyStore信息；<br />
3．&nbsp;使用 url=&lt;https://ip:port/...&gt; 访问WebService服务</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/175432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-15 12:32 <a href="http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.OutOfMemoryError 的解决办法</title><link>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 09 Jan 2008 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/173982.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/173982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/173982.html</trackback:ping><description><![CDATA[最近在使用Tomcat +Tapestry的时候遇见一个问题，由于Tapestry修改些内容后要重新启动（即使配置了一下那参数有时候也要重启）当我修改了页面的内容 需要调试不断刷新，发现页面显示的速度越来越慢 最后就出现了 500错误java.lang.OutOfMemoryError&nbsp; 内存溢出，在网上查了一下资料<br />
最后总结如下希望可以帮你解决同样的问题<br />
解决java.lang.OutOfMemoryError的方法有如下几种：<br />
1。增加jvm的内存大小。方法有：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）在执行某个class文件时候，可以使用java&nbsp;-Xmx256M&nbsp;aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）对tomcat容器，可以在启动时对jvm设置内存限度。对tomcat，可以在catalina.bat中添加：<br />
&nbsp;&nbsp;set&nbsp;CATALINA_OPTS=-Xms128M&nbsp;-Xmx256M<br />
&nbsp;&nbsp;&nbsp;set&nbsp;JAVA_OPTS=-Xms128M&nbsp;-Xmx256M<br />
或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M&nbsp;-Xmx256M
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）对resin容器，同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件，内容如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;off<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;"httpd.exe"&nbsp;&nbsp;"-Xms128M"&nbsp;"-Xmx256M"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:end&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中"-Xms128M"为最小内存，"-Xmx256M"为最大内存。</p>
<p>&nbsp;2.&nbsp;&nbsp;&nbsp;&nbsp;优化程序，释放垃圾。</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/173982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-01-09 13:27 <a href="http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(tomcat、weblogic)Jndi查找数据源配置</title><link>http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 24 Dec 2007 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/170005.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/170005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/170005.html</trackback:ping><description><![CDATA[<p>&nbsp;这是我在项目当中积累的资料关于配置tomcat和 weblogic的数据源，贴出来和大家分享，有什么问题还请多指教，共同学习，共同进步<br />
一、tomcat数据源的配制<br />
★★注意将数据库驱动程序最好放在common里，tomcat最先加载这里的驱动，放在server里有时候会出现找不到驱动程序的错误</p>
<p>&nbsp;在tomcat5.5中需要下载apache-tomcat-5.5admin.tar.rar 这个包才可以进行配制<br />
&nbsp;&nbsp; 1.首先进入tomcat的配制数据源的页面Data Sources中配制jndi等连接信息如(jndi为hdb)<br />
&nbsp;&nbsp; 2.在自己应用中的WEB-INF中的web.xml中添加如下：<br />
&nbsp;&lt;resource-ref&gt;<br />
&nbsp;&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; Resource reference to a factory for java.sql.Connection<br />
&nbsp;&nbsp;&nbsp;&nbsp; instances that may be used for talking to a particular<br />
&nbsp;&nbsp;&nbsp;&nbsp; database that is configured in the server.xml file.<br />
&nbsp;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp; &lt;res-ref-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; hdb<br />
&nbsp;&nbsp; &lt;/res-ref-name&gt;<br />
&nbsp;&nbsp; &lt;res-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; javax.sql.DataSource<br />
&nbsp;&nbsp; &lt;/res-type&gt;<br />
&nbsp;&nbsp; &lt;res-auth&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; Container<br />
&nbsp;&nbsp; &lt;/res-auth&gt;<br />
&nbsp;&lt;/resource-ref&gt;<br />
&nbsp;&nbsp;&nbsp; 3.在META-INF中添加context.xml文件内容如下：<br />
&nbsp;&nbsp;&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&nbsp;&lt;Context&gt;<br />
&nbsp;&nbsp; &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;<br />
&nbsp;&nbsp; &lt;Resource name="hdb" auth="Container"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource" username="wangwin" password="wangwin"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="oracle.jdbc.driver.OracleDriver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:oracle:thin:@127.0.0.1:1521:ora9"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="10" maxIdle="2"/&gt;<br />
&nbsp;&lt;/Context&gt;<br />
&nbsp;&nbsp; 4.在程序中通过JNDI得到连接对象内容如下：<br />
&nbsp;&nbsp; try {<br />
&nbsp;Context initCtx = new InitialContext();<br />
&nbsp;Context envCtx = (Context) initCtx.lookup("java:comp/env");//这里这是必须的。。。<br />
&nbsp;DataSource ds = (DataSource)(envCtx.lookup( "hdb" ));<br />
&nbsp;if (ds != null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = ds.getConnection();／／得到连接对象测试内容<br />
&nbsp;&nbsp;&nbsp;&nbsp; conn.setAutoCommit(false);<br />
&nbsp;&nbsp;&nbsp;&nbsp; Statement stm = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stm.executeQuery("select * from tshp_flow");<br />
&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;System.out.println(rs.getString(1));<br />
&nbsp;&nbsp;System.out.println(rs.getString(2));<br />
&nbsp;&nbsp;System.out.println(rs.getString(3));<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;} catch (NamingException ex) {<br />
&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;}<br />
二、weblogic数据源的配制<br />
&nbsp;1.打开weblogic的控制台-服务-JDBC-连接缓冲池 配制数据库的连接信息<br />
&nbsp;2.服务-JDBC-数据源创建JNDI－继续－选择刚刚配制好的数据库JDBC<br />
&nbsp;3.得到连接对象</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/170005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-24 12:02 <a href="http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>★★oracle易忘函数用法★★</title><link>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 14 Dec 2007 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167677.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167677.html</trackback:ping><description><![CDATA[<p>===================★★oracle易忘函数用法★★=====================================<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开发积累资料<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:SunXianchao<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006年于湖南长沙<br />
==============================================================================<br />
一般的to_char是这样用的to_char(sysdate,'YYYY-MM-DD hh:mi:ss AM') ，也有几个突出点的用法：</p>
<p>to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看这是这个月第几个星期</p>
<p>to_char(sysdate, 'mm')&nbsp; 查看这是一年中第几个月</p>
<p>to_char(sysdate, 'yyyy') 查看年份last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天，add_months(sysdate,10)查看若干个月后的今天，next_day(sysdate,'星期五')给个日期查看后面的最近的星期几的日期，不过这个星期五要是换成英文居然有问题，第2个参数可以是数字1-7，分别表示周日到周六。</p>
<p>下面贴个全的，需要的时候顺便查一下。</p>
<p>一、PL/SQL单行函数和组函数详解</p>
<p>函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类：单行函数和组函数。</p>
<p>本文将讨论如何利用单行函数以及使用规则。<br />
1、SQL中的单行函数</p>
<p>SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。</p>
<p>SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename) </p>
<p><br />
单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</p>
<p>2、NULL和单行函数</p>
<p>在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数:NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。</p>
<p>下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿。</p>
<p>column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2 </p>
<p><br />
不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：</p>
<p>update empset salary=(salary+bonus)*1.1 </p>
<p><br />
这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。</p>
<p>所以正确的语句是：</p>
<p>update empset salary=(salary+nvl(bonus,0)*1.1 </p>
<p><br />
3、单行字符串函数</p>
<p>单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串。</p>
<p>ASCII()</p>
<p>c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()</p>
<p>SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122 </p>
<p><br />
CHR()[NCHAR_CS]</p>
<p>i是一个数字，函数返回十进制表示的字符。</p>
<p>select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B </p>
<p><br />
CONCAT(,)</p>
<p>c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同</p>
<p>select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda <br />
INITCAP()</p>
<p>c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。</p>
<p>select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici </p>
<p><br />
INSTR(,[,[,]])</p>
<p>c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1。</p>
<p>select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2 </p>
<p><br />
INSTRB(,[,i[,j])</p>
<p>与INSTR()函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()。</p>
<p>LENGTH()</p>
<p>c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。</p>
<p>select LENGTH('Ipso Facto') ergo from dualergo10 </p>
<p><br />
LENGTHb()</p>
<p>与LENGTH()一样，返回字节。</p>
<p>lower()</p>
<p>返回c的小写字符，经常出现在where子串中。</p>
<p>select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite </p>
<p><br />
LPAD(,[,])</p>
<p>c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。</p>
<p>select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe </p>
<p><br />
LTRIM(,)</p>
<p>把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>select LTRIM('Mississippi','Mis') from dualLTRppi </p>
<p><br />
RPAD(,[,])</p>
<p>在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似。</p>
<p>RTRIM(,)</p>
<p>把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>REPLACE(,[,])</p>
<p>c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。</p>
<p>select REPLACE('uptown','up','down') from dualREPLACEdowntown </p>
<p><br />
STBSTR(,[,])</p>
<p>c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。</p>
<p>select SUBSTR('Message',1,4) from dualSUBSMess </p>
<p><br />
SUBSTRB(,[,])</p>
<p>与SUBSTR大致相同，只是I,J是以字节计算。</p>
<p>SOUNDEX()</p>
<p>返回与c1发音相似的词。</p>
<p>select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250 </p>
<p><br />
TRANSLATE(,,)</p>
<p>将c1中与c2相同的字符以c3代替</p>
<p>select TRANSLATE('fumble','uf','ar') test from dualTEXTramble </p>
<p><br />
TRIM([[]] from c3)</p>
<p>将c3串中的第一个，最后一个，或者都删除。</p>
<p>select TRIM(' space padded ') trim from dual TRIMspace padded </p>
<p><br />
UPPER()</p>
<p>返回c1的大写，常出现where子串中</p>
<p>select name from dual where UPPER(name) LIKE 'KI%'NAMEKING </p>
<p><br />
4、单行数字函数</p>
<p>单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</p>
<p>ABS()</p>
<p>返回n的绝对值</p>
<p>ACOS()</p>
<p>反余弦函数，返回-1到1之间的数。n表示弧度</p>
<p>select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 </p>
<p><br />
ASIN()</p>
<p>反正弦函数，返回-1到1，n表示弧度</p>
<p>ATAN()</p>
<p>反正切函数，返回n的反正切值，n表示弧度。</p>
<p>CEIL()</p>
<p>返回大于或等于n的最小整数。</p>
<p>COS()</p>
<p>返回n的余玄值，n为弧度</p>
<p>COSH()</p>
<p>返回n的双曲余玄值，n 为数字。</p>
<p>select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847 </p>
<p><br />
EXP()</p>
<p>返回e的n次幂，e=2.71828183.</p>
<p>FLOOR()</p>
<p>返回小于等于N的最大整数。</p>
<p>LN()</p>
<p>返回N的自然对数，N必须大于0</p>
<p>LOG(,)</p>
<p>返回以n1为底n2的对数</p>
<p>MOD()</p>
<p>返回n1除以n2的余数<br />
POWER(,)</p>
<p>返回n1的n2次方</p>
<p>ROUND(,)</p>
<p>返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。</p>
<p>select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54 </p>
<p><br />
SIGN()</p>
<p>如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0</p>
<p>SIN()</p>
<p>返回n的正玄值,n为弧度。</p>
<p>SINH()</p>
<p>返回n的双曲正玄值,n为弧度。</p>
<p>SQRT()</p>
<p>返回n的平方根,n为弧度</p>
<p>TAN()</p>
<p>返回n的正切值,n为弧度</p>
<p>TANH()</p>
<p>返回n的双曲正切值,n为弧度</p>
<p>TRUNC(,)</p>
<p>返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</p>
<p>5、单行日期函数</p>
<p>单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</p>
<p>ADD_MONTHS(,)</p>
<p>返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</p>
<p>LAST_DAY()</p>
<p>函数返回包含日期d的月份的最后一天</p>
<p>MONTHS_BETWEEN(,)</p>
<p>返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</p>
<p>NEW_TIME(,,)</p>
<p>d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</p>
<p>NEXT_DAY(,)</p>
<p>返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。</p>
<p>select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 </p>
<p><br />
ROUND([,])</p>
<p>将日期d按照fmt指定的格式舍入，fmt为字符串。</p>
<p>SYADATE</p>
<p>函数没有参数，返回当前日期和时间。</p>
<p>TRUNC([,])</p>
<p>返回由fmt指定的单位的日期d<br />
6、单行转换函数</p>
<p>单行转换函数用于操作多数据类型，在数据类型之间进行转换。</p>
<p>CHARTORWID()</p>
<p>c 使一个字符串，函数将c转换为RWID数据类型。</p>
<p>SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') </p>
<p><br />
CONVERT(,[,])</p>
<p>c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</p>
<p>HEXTORAW()</p>
<p>x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</p>
<p>RAWTOHEX()</p>
<p>x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</p>
<p>ROWIDTOCHAR()</p>
<p>函数将ROWID数据类型转换为CHAR数据类型。</p>
<p>TO_CHAR([[,)</p>
<p>x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。</p>
<p>NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string" </p>
<p><br />
TO_DATE([,[,)</p>
<p>c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</p>
<p>TO_MULTI_BYTE()</p>
<p>c表示一个字符串，函数将c的担子截字符转换成多字节字符。</p>
<p>TO_NUMBER([,[,)</p>
<p>c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</p>
<p>TO_SINGLE_BYTE()</p>
<p>将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</p>
<p>7、其它单行函数</p>
<p>BFILENAME(,) </p>
<p><br />
dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</p>
<p>DECODE(,,[,,,[])</p>
<p>x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</p>
<p>DUMP(,[,[,[,]]])</p>
<p>x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</p>
<p>EMPTY_BLOB()</p>
<p>该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</p>
<p>EMPTY_CLOB()</p>
<p>该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</p>
<p>GREATEST()</p>
<p>exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。<br />
LEAST()</p>
<p>exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
<p>UID</p>
<p>该函数没有参数，返回唯一标示当前数据库用户的整数。</p>
<p>USER</p>
<p>返回当前用户的用户名</p>
<p>USERENV()</p>
<p>基于opt返回包含当前会话信息。opt的可选值为：</p>
<p>ISDBA　 会话中SYSDBA脚色响应，返回TRUE</p>
<p>SESSIONID 　返回审计会话标示符</p>
<p>ENTRYID 返回可用的审计项标示符</p>
<p>INSTANCE在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。</p>
<p>LANGUAGE返回语言、地域、数据库设置的字符集。</p>
<p>LANG返回语言名称的ISO缩写。</p>
<p>TERMINAL为当前会话使用的终端或计算机返回操作系统的标示符。</p>
<p>VSIZE()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x是一个表达式。返回x内部表示的字节数。</p>
<p>二、SQL中的组函数</p>
<p>组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</p>
<p>1、组(多行)函数</p>
<p>与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</p>
<p>AVG([{DISYINCT|ALL}])</p>
<p>返回数值的平均值。缺省设置为ALL</p>
<p>SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413 </p>
<p><br />
COUNT({*|DISTINCT|ALL} )</p>
<p>返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</p>
<p>MAX([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</p>
<p>MIN([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的最小值。</p>
<p>STDDEV([{DISTINCT|ALL}])</p>
<p>返回选者的列表项目的标准差，所谓标准差是方差的平方根。</p>
<p>SUM([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的数值的总和。</p>
<p>VARIANCE([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的统计方差。</p>
<p>2、用GROUP BY给数据分组</p>
<p>正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。</p>
<p>select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982 </p>
<p><br />
在这个例子中，我们用state字段分类;如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。</p>
<p>select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982 </p>
<p><br />
3、用HAVING子句限制分组数据</p>
<p>现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：</p>
<p>错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</p>
<p>这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：</p>
<p>SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000; </p>
<p><br />
4、嵌套函数</p>
<p>函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。</p>
<p>嵌套函数可以包括在组函数中嵌套单行函数，或者组函数嵌套入单行函数或组函数中。比如下面的例子：</p>
<p>SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2 </p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/167677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-14 10:02 <a href="http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 软件空间</title><link>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 14 Dec 2007 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167656.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167656.html</trackback:ping><description><![CDATA[<a href="http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99">注册了一个网站，使用的是下面的这个空间，常来网，无限空间大小完全免费，上传速度很不错，感觉挺好推荐给大家，来注册一个空间上传资料使用<br />
http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99</a><br />
  <img src ="http://www.blogjava.net/lifenote/aggbug/167656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-14 09:23 <a href="http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tapestry 开发笔记（积累）</title><link>http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 13 Dec 2007 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167528.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167528.html</trackback:ping><description><![CDATA[<p>====================================================================================<br />
'&nbsp;说明：Tapestry 开发笔记<br />
'&nbsp;Note Author:&nbsp;Sunxianchao<br />
'&nbsp;阅读日期：&nbsp;2007-9-18(北京.七彩谷)<br />
'====================================================================================<br />
<br />
<br />
<br />
'先做个小广告 免费的无限空间还可以就是要积分 下面是我的注册地址 直接注册就可以了 奖励10个积分<br />
http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99<br />
麻烦帮忙顶一个 多谢<br />
<br />
<br />
【各种组建使用】<br />
说明：只是说明一些需要注意的东西，更多的学习参考Tapestry官方文档<br />
1、For<br />
source:是对应的java类里的List 对象或者是个数组 需要抽象 或者提供set get方法<br />
value:是循环这个source对象代表当前的一个 ，需要在page文件中设置问一个属性，可以不在对应的java类里有这个属性<br />
index:是循环的索引值 同value一样 在page文件中设置一个属性即可 &lt;property name="index"/&gt;<br />
在循环的时候 会自动为vlaue和index赋当前的值</p>
<p>2、Foreach 和For一样使用</p>
<p>3、Hidden组件 总是多余S的处理<br />
&nbsp;&lt;input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/&gt;</p>
<p><br />
4、 Insert 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;input type="text" jwcid="name@Insert" value="ognl:user.name"/&gt; <br />
&nbsp;&nbsp;&nbsp; 页面表现时,将会到页面类中寻找getUser().getName()方法获取初值并输出 <br />
&nbsp;&nbsp;&nbsp; 相当于在页面上显示数据.</p>
<p>5、 TextField 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;input type="text" jwcid="username@TextField" value="ognl:username"/&gt; <br />
&nbsp;&nbsp;&nbsp; 页面表现时,将会到页面类中寻找getUsername()方法获取初值 <br />
&nbsp;&nbsp;&nbsp; *如果是修改信息页面,通常初始值要在页面表现之前由setUsername()手动设置从数据库中读取出来的值 <br />
&nbsp;&nbsp;&nbsp; 表单提交时,通过setUsername()写入新值(即用户输入值),在类中通过getUsername()获取新值 <br />
&nbsp;&nbsp;&nbsp; 相当于在修改个人信息时,首先读出用户名赋予文本框(用户名)初值,用户修改时填入新值,后台获取之 <br />
&nbsp;&nbsp;&nbsp; *Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true") <br />
&nbsp;&nbsp;&nbsp; readonly属性设置只读 readonly="true"为只读(后台可读取) <br />
&nbsp;&nbsp;&nbsp; *disabled属性设置是否可写 diabled="true"为不可写(后台也不可读取)</p>
<p>6、 TextArea 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"&gt;&lt;/textarea&gt; <br />
&nbsp;&nbsp;&nbsp; 页面表现时,将会到页面类中寻找getContent()方法获取初值 <br />
&nbsp;&nbsp;&nbsp; 工作原理同TextField</p>
<p>7、 RadioGroup/Radio 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="headImage@RadioGroup" selected="ognl:headImage"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="1"/&gt;头像1 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="2"/&gt;头像2 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="3"/&gt;头像3 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="4"/&gt;头像4 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="5"/&gt;头像5 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="6"/&gt;头像6 <br />
&nbsp;&nbsp;&nbsp; &lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性值，并且只有一个Radio能够被选中. <br />
&nbsp;&nbsp;&nbsp; 页面提交时，RadioGroup组件就利用OGNL表达式向headImage字段写入被选中的Radio组件的value参数值. <br />
&nbsp;&nbsp;&nbsp; 页面表现时(修改页面),将会到页面类中寻找getHeadImage()方法获取初值,然后寻找@Radio组件中与其相同的组件并勾选上.</p>
<p>8、 PropertySelection 组件 <br />
&nbsp;&nbsp;&nbsp; 使用PropertySelection组件必须要构造一个类来实现IPropertySelectionModel接口，并且重写该接口的5个方法. <br />
&nbsp;&nbsp;&nbsp; public int getOptionCount() //提供下拉菜单的长度 <br />
&nbsp;&nbsp;&nbsp; public Object getOption(int index) //提供select标签的option <br />
&nbsp;&nbsp;&nbsp; public String getLabel(int index) //提供select标签的Label值，也就是下拉菜单显示的内容 <br />
&nbsp;&nbsp;&nbsp; public String getValue(int index) //提供select标签的value值 <br />
&nbsp;&nbsp;&nbsp; public Object translateValue(String value) //selected后的返回值，value值未必就是我们需要的返回值，可以在这个方法里面对返回的value做对应的转换或修改. <br />
e.g.1. 性别下拉框 <br />
&nbsp;&nbsp;&nbsp; &lt;select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option selected&gt;先生&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;女士&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/select&gt; </p>
<p><br />
代码<br />
GenderSelectionModel.java&nbsp;&nbsp; <br />
public class GenderSelectionModel implements IPropertySelectionModel {&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static final String male = "先生";&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static final String female = "女士";&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static final String[] genderOptions = { male, female };&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getOptionCount() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return genderOptions.length;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object getOption(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.translateValue(genderOptions[index]);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getLabel(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return genderOptions[index].toString();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getValue(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return genderOptions[index];&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object translateValue(String value) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value.equals("先生")) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "1";&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "0";&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
}&nbsp; </p>
<p>&nbsp;</p>
<p>代码<br />
ModUserInfo.java&nbsp;&nbsp; <br />
public IPropertySelectionModel getSupportedGender() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return new GenderSelectionModel();&nbsp;&nbsp; <br />
}&nbsp; </p>
<p><br />
&nbsp;&nbsp;&nbsp; 存入数据库中"1"代表先生,"0"代表女士,通过translateValue(String value)方法转换 <br />
&nbsp;&nbsp;&nbsp; 页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender(). <br />
&nbsp;&nbsp;&nbsp; 然后通过getGender()方法获取初值,比如获取"0",则在页面显示时寻找value值为"0"的选项即为"女士",并选择之作为初始选择项.</p>
<p>e.g.2. 日志类型下拉框 <br />
&nbsp;&nbsp;&nbsp; &lt;select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;心情日记&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;情感天地&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;生活感触&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/select&gt; </p>
<p><br />
代码<br />
TypeSelectionModel.java&nbsp;&nbsp; <br />
public class TypeSelectionModel implements IPropertySelectionModel {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private List typeList = new ArrayList();&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public TypeSelectionModel(List typeList) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.typeList = typeList;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getOptionCount() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeList.size();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object getOption(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((LogType)typeList.get(index)).getValue();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getLabel(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((LogType) typeList.get(index)).getName();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getValue(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((LogType) typeList.get(index)).getValue();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object translateValue(String value) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
}&nbsp; </p>
<p>&nbsp;</p>
<p>代码<br />
ModLog.java&nbsp;&nbsp; <br />
public IPropertySelectionModel getSupportedType() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; TypeSelectionModel typeSelectionModel =&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new TypeSelectionModel(loadType(getUser().getUserId()));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return typeSelectionModel;&nbsp;&nbsp; <br />
}&nbsp;&nbsp; <br />
&nbsp; <br />
private List loadType(int userid) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ...//从数据库载入该用户的日志类型列表&nbsp;&nbsp; <br />
}&nbsp; </p>
<p><br />
&nbsp;&nbsp;&nbsp; 页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType(). <br />
&nbsp;&nbsp;&nbsp; 然后通过value属性给出的初始值即,getLogType()方法获取初值,比如获取"2",则在页面显示时寻找value值为"2"的选项即为"生活感触",并选择之作为初始选择项.</p>
<p>9、 Form组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;form jwcid="logForm@Form"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... <br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&nbsp;&nbsp;&nbsp; Form的监听(listener)方法可以有两种方式: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 在Form组件中声明. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form jwcid="logForm@Form" listener="ognl:listener:onLogin"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 在submit类型组件中声明. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/&gt;或者 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"&gt;&lt;img src="..." width="" height=""/&gt;&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前一种方式当Form中只要有submit就会触发监听方法,后一种方式是Form中有多个submit,各自实现不同的监听方法.</p>
<p>G) Foreach 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Foreach" source="ognl:logList" value="ognl:item"&gt; <br />
&nbsp;&nbsp;&nbsp; 循环组件,遍历source参数,在表现其内容前更新value参数,将Foreach组件所包含的内容重复表现,其中可以通过value参数获取所需显示内容. <br />
&nbsp;&nbsp;&nbsp; 本例中,页面表现时通过getLogList()方法获取日志列表,循环取出其中数据更新item(日志对象)并予以显示.其中item需要在页面规范(.page)文件中声明: <br />
&nbsp;&nbsp;&nbsp; &lt;property name="item"/&gt; <br />
&nbsp;&nbsp;&nbsp; *class参数用来寻找类似CSS的文件对Foreach进行修饰. <br />
&nbsp;&nbsp;&nbsp; Foreach组件: class="ognl:beans.evenOdd.next" <br />
&nbsp;&nbsp;&nbsp; Page文件: &lt;bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/&gt; <br />
&nbsp;&nbsp;&nbsp; CSS文件: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}</p>
<p>10、 Conditional 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'&gt;先生&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'&gt;女士&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; conditional参数为true时运行Conditional组件中的HTML模板内容. <br />
&nbsp;&nbsp;&nbsp; 在Tapestry4.0以后就不支持该组件了, 可以使用其他组件来实现: <br />
&nbsp;&nbsp;&nbsp; 1. Contrib:Choose和Contrib:When <br />
&nbsp;&nbsp;&nbsp; &lt;library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/&gt;(.application文件中引入Contrib类包) <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@contrib:Choose"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'&gt;先生&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'&gt;女士&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; 2. If组件 <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@If" condition='ognl:item.sex.equals("1")'&gt;先生&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@If" condition='ognl:item.sex.equals("0")'&gt;女士&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; 3. Else组件<br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Else"&gt;man&lt;/span&gt; </p>
<p>【============================ts的函数执行顺序========================================】<br />
对之前的该文章进行了一些修正，主要是针对finishLoad()方法。 <br />
我觉得对初学者会有一些帮助。 <br />
下面这几个函数是我在使用的，它们的执行顺序依次从上到下。 <br />
1.protected void finishLoad() {} *** <br />
2.public void pageValidate(PageEvent event) {} <br />
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br />
4.public void pageBeginRender(PageEvent event) {} <br />
// 如果有表单提交，则将form中的各字段的值赋给页面类 <br />
5. ...... 赋值 <br />
6.public void submit() // 表单提交等用listenter:调用的方法 <br />
7.protected void prepareForRender(IRequestCycle cycle) {} <br />
---------------------------------------------------- <br />
1.protected void finishLoad() {} <br />
这个函数最先执行，但是它实际上没有什么用处（我感觉）。因为： <br />
　　这个函数只在页面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱：如果你的tomcat启动时使用了-Dorg.apache.tapestry.disable-caching=true(为了调试方便而设)，那么你每次刷新页面时，它都会执行（因为每个request都会新生成一个页面类对象），造成了它总是执行的假象。在实际的部署时，会使用caching，则这个函数执行的机会很少。所以要注意。 <br />
　　初始化的代码放在4 pageBeginRender()中 <br />
2.public void pageValidate(PageEvent event) {} <br />
如果实现了PageValidateListener接口，则可以在这里进行验证，比如访问权限等。执行完1后，它就开始执行。 <br />
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br />
如果实现了IExternalPage接口，则可以从这里取得由外面传过来的参数。执行2后，执行到这里。在这里可以把那些参数取出，赋给页面类。 <br />
4.public void pageBeginRender(PageEvent event) {} <br />
执行完3后，将执行本函数。但是这时从客户端传过来的参数还没有被赋值(如果提交了表单的话)。这里可以进行一些初始化操作。 <br />
5.执行完4后，如果有表单提交，在这里将会取出那些值，赋给对应的字段。(注意：只是将表单中有的值赋过来) <br />
6.public void submit() <br />
如果有表单提交的话，在这里将进行对应的操作。因为此时各字段已经取好值了，所以可以拿来直接用。 <br />
7.protected void prepareForRender(IRequestCycle cycle) {} <br />
最后才执行这个方法。我们可以在其中进行为了在页面上显示数据而进行的操作，比如取得什么对象什么的，因为这里页面类的属性赋值已经结束，可以直接拿来使用了。 <br />
注意：如果执行了6，则还要执行4，再执行7。如果没有6，4完了就直接是7。 <br />
以上是我所总结的执行顺序，不当之处请指出。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>----------------------------------------------------- <br />
最开始学tapestry的时候，觉得&#8220;怎么有这么多地方需要持久啊&#8221;。原来以前只知道pageBeginRender这个函数，什么初始化操作都放在它里面。可是它是在赋值之前执行，所以拿到的字段多都是空的，却都以为是没有持久化的缘故。所以在客户端里放了一大堆的@Hidden，或者session中持久，非常麻烦，，，对tapestry也产生的怀疑。现在才知道那些需要取得客户端传来的参数的代码，最好放在prepareForRender里，很多不必要的持久都可以省掉了</p>
 <img src ="http://www.blogjava.net/lifenote/aggbug/167528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-13 16:21 <a href="http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转自BeanSoft----配置并运行 Tomcat 服务器</title><link>http://www.blogjava.net/lifenote/archive/2007/12/12/167158.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 12 Dec 2007 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/12/167158.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167158.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/12/167158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167158.html</trackback:ping><description><![CDATA[<p>配置并运行 Tomcat 服务器(入门整理)</p>
<p>by <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#66;&#101;&#97;&#110;&#83;&#111;&#102;&#116;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">BeanSoft@126.com</a></p>
<p>安装tomcat后,启动不了.<br />
错误提示:<br />
<!--(zanox&#32852;&#30431;HTML&#20195;&#30721;&#24320;&#22987; --><!--(&#22312;&#27491;&#24120;&#21151;&#33021;&#19979;&#19981;&#33021;&#26356;&#25913;HTML&#20195;&#30721;!)--><a href="http://ad.zanox.com/ppc/?7784563C837240749T"></a>&nbsp;<!--(zanox&#32852;&#30431;HTML&#20195;&#30721;&#32467;&#26463;--># ./startup.sh<br />
The BASEDIR environment variable is not defined correctly<br />
This environment variable is needed to run this program<br />
原因:Linux上文件的执行权限造成的.很多文件不能运行.<br />
解决办法:<br />
cd $CATALINA_HOME/bin<br />
chmod u+x *<br />
这个是普通用户会出现这种问题, 如果是 root 或者超级用户, 只需要<br />
chmod u+x *.sh.</p>
<embed pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" src="http://beansoft.java-cn.org/download/tomcat_on_linux.swf" width="809" height="665" type="application/x-shockwave-flash" bgcolor="#FFFFFF" quality="high"></embed> 
<img src ="http://www.blogjava.net/lifenote/aggbug/167158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-12 10:40 <a href="http://www.blogjava.net/lifenote/archive/2007/12/12/167158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转自BeanSoft----配置并运行 Tomcat 服务器(入门整理) </title><link>http://www.blogjava.net/lifenote/archive/2007/12/12/167157.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 12 Dec 2007 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/12/167157.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167157.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/12/167157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167157.html</trackback:ping><description><![CDATA[<div class="singlepost">配置并运行 Tomcat 服务器<br />
1) 下载并安装对应操作系统上的 JDK 5 或者 6<br />
<a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a> 记下安装路径例如: /opt/jdk15 或者 c:\jdk15.<br />
2) 下载并安装 Tomcat 5 或者 6<br />
<a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a><br />
下载后的是压缩包. 解压缩到磁盘目录, 记下安装路径例如 /opt/apache-tomcat-5.5.23 或者 c:\apache-tomcat-5.5.23 .<br />
3) 配置环境变量<br />
Windows 2000 ~ XP:<br />
我的电脑 -&gt; 右键选择 "属性" -&gt; "高级"面板 -&gt; "环境变量"按钮-&gt; 新建或者修改 用户变量.<br />
需要设置:<br />
JAVA_HOME=c:\jdk15<br />
PATH=%JAVA_HOME%\bin;%PATH%;<br />
CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;<br />
Windows 下可以不设置 CATALINA_HOME 也能使用.<br />
查看配置结果: 新开 CMD 窗口, 键入: set JAVA_HOME<br />
Linux:<br />
命令行或者图形模式下改变目录到当前用户:<br />
cd /myname #改变到当前用户目录下<br />
ls -a #查看所有文件<br />
vi .bash_profile # 修改当前用户环境变量文件, 或者用 gedit 文本编辑器在打开文件对话框输入 .bash_profile<br />
在文件末尾加入下列内容(注意大小写和分隔符):<br />
export JAVA_HOME=/opt/jdk15<br />
export CLASSPATH=.:$JAVA_HOME/tools.jar<br />
export PATH=$PATH:$JAVA_HOME/bin<br />
export CATALINA_HOME=/opt/apache-tomcat-5.5.23<br />
这是仅对当前用户注销后重新登录后生效, 立即生效请键入:<br />
source .bash_profile<br />
. 还有一种办法需要 root 权限, 修改 etc/profile 加入和上面相同的内容, 注销后生效.<br />
4) 启动和停止 Tomcat.<br />
Windows:<br />
%CATALINAE_HOME%\bin\startup.bat 启动后会出现一个新的标题为 Tomcat 的窗口, 关闭后进程就结束了.<br />
%CATALINAE_HOME%\bin\shutdown.bat 正常停止 Tomcat<br />
打开 IE 键入 <a href="http://localhost:8080/">http://localhost:8080/</a> 看到欢迎页面即成功.<br />
Linux:<br />
$CATALINAE_HOME/bin/startup.sh 启动 Tomcat<br />
$CATALINAE_HOME/bin/shutdown.sh 停止 Tomcat<br />
打开 Mozilla 键入 <a href="http://localhost:8080/">http://localhost:8080/</a> 看到欢迎页面即成功.<br />
手工杀死进程用: <br />
ps -ef | grep java<br />
kill -9 &lt;进程ID&gt;<br />
日志查看:<br />
tail -f $CATALINAE_HOME/logs/catalina.log<br />
启动后的输出信息都类似:<br />
Using CATALINA_BASE: E:\_Tarena\server\apache-tomcat-5.5.23<br />
Using CATALINA_HOME: E:\_Tarena\server\apache-tomcat-5.5.23<br />
Using CATALINA_TMPDIR: E:\_Tarena\server\apache-tomcat-5.5.23\temp<br />
Using JRE_HOME: C:\Java\jdk1.7.0<br />
重复启动后 Tomcat 会报错说明 8080 端口已被占用.<br />
所有这些文件都是调用 java 解释器启动用 J2SE 技术编写的服务器.<br />
5) Tomcat 目录结构<br />
├─bin 启动和关闭Tomcat的脚本文件<br />
├─common 在common目录下的lib, classes 目录，存放Tomcat服务器和所有web应用都能访问的类库(可以放 JDBC 驱动)<br />
├─conf 配置文件目录<br />
├─logs 日志目录<br />
├─server 服务器特定的文件<br />
├─shared <br />
├─temp 临时文件目录<br />
├─webapps Web 程序所在目录<br />
│ ├─balancer<br />
│ ├─jsp-examples<br />
│ ├─ROOT 默认应用 <a href="http://localhost:8080/">http://localhost:8080/</a><br />
│ ├─servlets-examples <a href="http://localhost:8080/servlets-examples">http://localhost:8080/servlets-examples</a><br />
│ ├─tomcat-docs Servlet 的 javadoc 等<br />
│ └─webdav<br />
└─work 各种由 jsp 生成的 servlet 文件放在这个目录下<br />
6) Web 应用的目录结构(Java EE 规范)<br />
Web 应用程序有四个部分:<br />
一个公开目录<br />
一个 WEB-INF/web.xml 文件 规范规定的Web应用部署描述符<br />
一个 WEB-INF/classes 目录 存放当前Web程序所用的类文件<br />
一个 WEB-INF/lib 目录 存放当前Web程序所用的jar文件<br />
WEB-INF 目录下的文件不能被客户端访问.<br />
一个 Web 应用程序的最小的文件要求是需要一个 WEB-INF 目录和其下的 web.xml
<p>web.xml 的最少内容:<br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; </p>
<p>&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee%22">http://java.sun.com/xml/ns/j2ee%22</a><br />
xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance%22">http://www.w3.org/2001/XMLSchema-instance%22</a><br />
xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a><a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd%22">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd%22</a><br />
version="2.4"&gt;<br />
&lt;/web-app&gt; </p>
<p>相关截图: </p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/linux_change_env%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="224" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/linux_change_env_thumb.png" width="589" border="0"  alt="" /> </a></p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/linux_gedit_bash_profile%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="525" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/linux_gedit_bash_profile_thumb.png" width="663" border="0"  alt="" /> </a></p>
<p>&nbsp;</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/win_sys_properties%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="497" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/win_sys_properties_thumb.png" width="419" border="0"  alt="" /> </a><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/win_sys_env%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="430" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/win_sys_env_thumb.png" width="384" border="0"  alt="" /> </a></p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/win_env_java_home%5B2%5D.gif" atomicselection="true"><img height="139" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/win_env_java_home_thumb.gif" width="347"  alt="" /> </a></p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/web-app%5B2%5D.gif" atomicselection="true"><img height="394" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/web-app_thumb.gif" width="350"  alt="" /> </a></p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/Java%20SE%20Downloads%5B2%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="1630" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/Java%20SE%20Downloads_thumb.png" width="1102" border="0"  alt="" /> </a></p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Tomcat_E5E5/Apache%20Tomcat%5B2%5D.png" atomicselection="true"> </a></p>
</div>
  <img src ="http://www.blogjava.net/lifenote/aggbug/167157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2007-12-12 10:39 <a href="http://www.blogjava.net/lifenote/archive/2007/12/12/167157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>