﻿<?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-业精于勤荒于嬉,行成于思毁于随</title><link>http://www.blogjava.net/minmoon/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:59:11 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:59:11 GMT</pubDate><ttl>60</ttl><item><title>J2me开发</title><link>http://www.blogjava.net/minmoon/archive/2006/11/01/78480.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Wed, 01 Nov 2006 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/11/01/78480.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/78480.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/11/01/78480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/78480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/78480.html</trackback:ping><description><![CDATA[
		<a href="http://www.csdn.net/subject/j2meTools/">
				<br />一些资料:<br /><br /><br /><br /><br />http://www.csdn.net/subject/j2meTools/</a>
		<br />
		<br />
		<a href="http://news.csdn.net/news/newstopic/24/24127.shtml">http://news.csdn.net/news/newstopic/24/24127.shtml</a>
		<br />
		<br />
		<br />
		<br />
<img src ="http://www.blogjava.net/minmoon/aggbug/78480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-11-01 15:30 <a href="http://www.blogjava.net/minmoon/archive/2006/11/01/78480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏</title><link>http://www.blogjava.net/minmoon/archive/2006/09/12/69170.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Tue, 12 Sep 2006 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/09/12/69170.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/69170.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/09/12/69170.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/69170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/69170.html</trackback:ping><description><![CDATA[有个输家，就一定有个赢家。我是输家，但我四周望了一圈，却没看到半个赢家，我想，赢家应该也是我了，你说呢?<img src ="http://www.blogjava.net/minmoon/aggbug/69170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-09-12 15:35 <a href="http://www.blogjava.net/minmoon/archive/2006/09/12/69170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vi命令详解</title><link>http://www.blogjava.net/minmoon/archive/2006/05/13/45983.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Sat, 13 May 2006 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/05/13/45983.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/45983.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/05/13/45983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/45983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/45983.html</trackback:ping><description><![CDATA[vi命令是unix下常用而重要命令，可在全屏幕方式下编辑一个或多个文件。若在vi执行时 <br />没有指定一个文件，那么vi命令会自动产生一个无名的空的工作文件。若指定的文件不存在， <br />那么就按指定的文件名创建一个新的文件。若对文件的修改不保存的话，v i命令并不改变原 <br />来文件的内容。  
<p></p><p>　　注意：vi命令并不锁住所编辑的文件，因此多个用户可能在同时编辑一个文件，那么最后 <br />保存的文件版本将被保留。 </p><p>下面是vi命令使用的一些选项及含义：          </p><p>　　-c sub-command 在对指定的文件编辑前，先执行指定的命令 sub-command . </p><p>　　-r filename 恢复指定的文件filename .          </p><p>　　-R 将指定的文件以只读的方式放入编辑器中，这样不会保存对文件的任何修 改。 </p><p>　　-y number 将编辑窗口的大小设为number行。          </p><p>　　下面是vi编辑所处的三种模式：          </p><p>　　.命令模式 进入vi时所处的模式。在此模式下用户可输入各种子命令对进行*作，如删除行、 <br />粘贴行、移向下一个字、移向不同行等。 </p><p>　　.文本输入模式 在此模式下可以修改一行的内容并增添新行。在命令模式下键入a 、i 或 <br />c键可进入文本输入模式，按Escape键可返回命令模式。 </p><p>　　.命令项模式 在此模式下，可以通过子命令输入更多的参数。如：w子命令要求输入一文 <br />件名，"/"子命令要求输入一个查找项。用户使用Escape键返回命令模式。 </p><p><br />下面是自命令模式下执行的，在同一行上移动的自命令：          </p><p>　　h 将光标左移一格。          </p><p>　　l 将光标右移一格。          </p><p>　　j 将光标下移一格。          </p><p>　　k 将光标上移一格。          </p><p>　　w 将光标移到下一个小字的前面。          </p><p>　　W 将光标移到下一个大字的前面。          </p><p>　　b 将光标移到前一个小字的前面。          </p><p>　　B 将光标移到前一个大字的前面。          </p><p>　　e 将光标移到下一个小字的后面。          </p><p>　　E 将光标移到前一个大字的后面。          </p><p>　　fc 把光标移到同一行的下一个c字符处。          </p><p>　　Fc 把光标移到同一行的前一个c字符处。          </p><p>　　tc 把光标移到同一行的下一个字符c的前一格。          </p><p>　　Tc 把光标移到同一行的前一个字符c的后一格。          </p><p>　　number| 把光标移到递number列上。          </p><p>下面是命令模式下在行间移动的子命令：          </p><p>　　+或Enter 把光标移至下一行第一个非空白字符。          </p><p>　　- 把光标移至上一行第一个非空白字符。          </p><p>　　0 把光标移到当前行的第一个字符处。          </p><p>　　$ 把光标移到当前行的最后一个字符处。          </p><p>　　H 把光标移到屏幕最顶端一行。          </p><p>　　L 把光标移到屏幕最底端一行。          </p><p>　　M 把光标移到屏幕中间。          </p><p>下面是命令模式下改变屏幕显示的子命令：          </p><p>　　z- 把当前行作为屏幕的最后一行，并重新显示屏幕。          </p><p>　　z. 把当前行作为屏幕的中间一行，并重新显示屏幕。          </p><p>　　Ctrl+l 重新显示屏幕当前内容。          </p><p>　　/pattern/z- 寻找pattern的下一个位置，并把所在行设为屏幕的最后一行。 </p><p>下面是在命令模式下用来显示页面的子命令：          </p><p>　　Ctrl + f向后滚一页。          </p><p>　　Ctrl + d向后滚半页。          </p><p>　　Ctrl + b向前滚一页。          </p><p>　　Ctrl + u向前滚半页。          </p><p>　　Ctrl + e屏幕向下滚一行。          </p><p>　　Ctrl + y屏幕项上滚一行。          </p><p>下面是在命令模式下用来查找字符串所使用的子命令：          </p><p>　　/pattern 向后寻找指定的pattern ,若遇到文件尾，则从头再开始。 </p><p>　　？pattern 向前寻找指定的pattern ,若遇到文件头，则从尾再开始。 </p><p>　　n 在上次指定的方向上，再次执行上次定义的查找。          </p><p>　　N 在上次指定的方向的相反方向上，再次执行上次定义的查找。          </p><p>　　/pattern/+number 将光标停在包含pattern的行后面第number行上。 </p><p>　　/pattern/-number 将光标停在包含pattern的行前面第number行上。 </p><p>　　% 移到匹配的"（）"或"{}"上。          </p><p>下面是在文本输入模式下用来输入文本的子命令（用户可在任何时候按Escape返回到命令模式）： </p><p>　　a 在光标之后开始输入文本。          </p><p>　　A在行尾开始输入文本。          </p><p>　　i在光标之前开始输入文本。          </p><p>　　I在行首第一个非空白字符前输入文本。          </p><p>　　o在光标所在行后插入一空行。          </p><p>　　O在光标所在行前插入一空行。          </p><p>下面是在命令模式下改变文本所使用的子命令（用户可在任何的时候按Escape键返回到命令模式）： </p><p>　　cc或S 修改一整行。          </p><p>　　C 改变一行光标位置以后的部分。          </p><p>　　cw 改变光标所在单词。          </p><p>　　dd删除当前行。          </p><p>　　D 删除光标所在行光标后面的内容。          </p><p>　　dw删除光标所在的单词。          </p><p>　　J 把下一行内容加到本行行尾。          </p><p>　　rc把光符所在字符替换成c .          </p><p>　　R 覆盖本行内容。          </p><p>　　u恢复上一次的修改。          </p><p>　　x删除光标所在的字符。          </p><p>　　~ 改变光标所在出字符的大小写。          </p><p>　　. 重复上一个*作。          </p><p>　　&lt;&lt;把当前行移到左边。          </p><p>　　&gt;&gt;把当前行移到右边。          </p><p>下面是用于文件中拷贝文本的字命令：          </p><p>　　p 将缓冲区内容取到光标所在行的下面一行。          </p><p>　　P 将缓冲区内容取到光标所在行的上面一行。          </p><p>　　"bd 将文本删除至有名缓冲区b .          </p><p>　　"bp 张贴有名缓冲区b中内容。          </p><p>　　yy把当前行放入缓冲区。          </p><p>　　Y 把当前行放入缓冲区。          </p><p>　　Yw把光标所在的单词放入缓冲区。          </p><p>下面是用于保存文件的子命令：          </p><p>　　:w 回写修改后的文件。          </p><p>　　:w filename 当filename不存在时，把修改后的文件存为文件filename ,当文件filename <br />存在时，报错。 </p><p>　　!w filename 如果文件filename存在时，把修改后的文件保存为文件filename . </p><p>下面列出了在vi编辑的多个文件之间切换所用的子命令：          </p><p>　　:n开始编辑vi激活的文件列表中的下一个文件。          </p><p>　　:n filenames 指定将被编辑的新的文件列表。          </p><p>下面列出了用于在当前文件和另外一个文件间切换的子命令：          </p><p>　　:e filename 使用filename激活vi （在vi中装入另一个文件filename）。 </p><p>　　e!重新装入当前文件，若当前文件有改动，则丢弃以前的改动。          </p><p>　　:e+filename 使用filename激活vi ,并从文件尾部开始编辑。 </p><p>　　:e+number filename 使用filename激活vi ,并在第number行开始编辑。 </p><p>　　:e# 开始编辑另外一个文件。          </p><p>下面是在本文件中加入其他文件代码所使用的子命令：          </p><p>　　:r filename读取filename文件，并将其内容加到当前文件后。   </p><p>　　:r ! command执行command文件，并将其输出加到当前文件后。   </p><p>下面是vi中其他的子命令：          </p><p>　　ctrl+g 取得正在编辑文件的有关信息。          </p><p>　　:sh启动sh ，从sh中返回可用exit或ctrl+d .          </p><p>　　:! Command 执行命令command .          </p><p>　　!!重新执行上次的:! Command子命令。          </p><p>　　:q退出vi ，若用户对编辑的文件有所修改，系统不会让用户使用q命令退出。   </p><p>　　:q!退出vi而不管是否对文件有改动。          </p><p>　　ZZ或:wq 保存对文件的修改并退出vi .          </p><p>　　用户可在一个特殊的文件.exrc中定义特殊的vi命令。在vi中使用这些命令时，必须在该 <br />命令前加上一个冒号( ：) 。</p><img src ="http://www.blogjava.net/minmoon/aggbug/45983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-05-13 15:13 <a href="http://www.blogjava.net/minmoon/archive/2006/05/13/45983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精通Log4j</title><link>http://www.blogjava.net/minmoon/archive/2006/04/26/43247.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Wed, 26 Apr 2006 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/04/26/43247.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/43247.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/04/26/43247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/43247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/43247.html</trackback:ping><description><![CDATA[
		<p> log4j虽然总的来说是比较容易使用的，但是要是想比较精通的操纵它还是有很多地方值得探讨的。<br />    这几天有空，把项目中大家用到的log4j实现的功能分了一下类，大致分为下面三类:<br />    &lt;1&gt;所有的日志信息都输出到log.log.<br />    &lt;2&gt;对于一些特殊的日志（如启动时候的日志），输出到log/startup/startup.log.<br />    &lt;3&gt;对于某些特殊包下面的日志，如com.aspire包下面的error信息都输出到error.log    <br />    有了这几个功能，相信对于大部分的系统都是够用的了，下面这个例子就是实现了这几个功能:<br />    (至于其他的一些配置，如格式这些的就不说明,有很多这种资料)<br />    <br />    ***********  log4j 配置文件  ************    <br />    <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;<br />&lt;log4j:configuration xmlns:log4j="<a href="http://jakarta.apache.org/log4j/">http://jakarta.apache.org/log4j/</a>" threshold="debug"&gt;</p>
		<p>&lt;appender name="file" class="org.apache.log4j.RollingFileAppender"&gt;<br /> &lt;param name="File" value="log.log"/&gt;<br /> &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br /> &lt;param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n"/&gt;<br /> &lt;/layout&gt;<br />&lt;/appender&gt;</p>
		<p>&lt;appender name="error" class="org.apache.log4j.RollingFileAppender"&gt;<br />  &lt;param name="File" value="error.log"/&gt;<br />  &lt;param name="MaxBackupIndex" value="300"/&gt;<br />  &lt;param name="Encoding" value="GB2312"/&gt;<br />  &lt;param name="MaxFileSize" value="20MB"/&gt;<br />  &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />   &lt;param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/&gt;<br />  &lt;/layout&gt;<br />    &lt;filter class="org.apache.log4j.varia.LevelRangeFilter"&gt;<br />  &lt;!-- 过滤,只记录error信息--&gt;<br />  &lt;param name="LevelMin" value="error"/&gt;<br />  &lt;param name="LevelMax" value="error"/&gt;<br />  &lt;param name="acceptOnMatch" value="true"/&gt;<br />    &lt;/filter&gt;<br />&lt;/appender&gt;<br />&lt;appender name="startup" class="com.aspire.TimeSizeRollingFileAppender"&gt;<br />  &lt;!--该类使自己从FileAppender派生，可以自己控制输出文件的路径 --&gt;<br />  &lt;param name="File" value="log/startup/startup.log" /&gt;<br />  &lt;param name="Encoding" value="GBK" /&gt;<br />  &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />   &lt;param name="ConversionPattern" value="%m %d{ISO8601}- %m%n %p %l%n" /&gt;<br />  &lt;/layout&gt;<br />&lt;/appender&gt;</p>
		<p>&lt;logger name="biz.startup"&gt;<br />&lt;!--Logger logger = Logger.getLogger("biz.startup") 可以这样来调用本logger--&gt;<br />  &lt;level value="debug" /&gt;<br />  &lt;appender-ref ref="startup" /&gt;<br />&lt;/logger&gt;</p>
		<p>&lt;logger name="com.aspire" additivity="false"&gt;<br />&lt;!--Log log = LogFactory.getLog(TestLog4j.class) 此时如果TestLog4j<br />    位于com.aspire包下面，那么使用本logger<br /> --&gt;<br />  &lt;level value="debug"/&gt;<br />  &lt;appender-ref ref="error"/&gt;<br />&lt;/logger&gt;<br />&lt;root&gt;<br />&lt;level value="info"/&gt;<br />&lt;!-- 默认输出到log.log--&gt;<br />&lt;appender-ref ref="file"/&gt;<br />&lt;/root&gt;<br />&lt;/log4j:configuration&gt;</p>
		<p>***********  log4j 配置文件结束 ************</p>
		<p>**********  派生的TimeSizeRollingFileAppender类*****<br />package com.aspire;</p>
		<p>import org.apache.log4j.FileAppender;<br />import org.apache.log4j.spi.ErrorCode;<br />import java.io.File;<br />import java.io.IOException;</p>
		<p>public class TimeSizeRollingFileAppender<br />    extends FileAppender<br />    implements ErrorCode {</p>
		<p>  private final static String FS = System.getProperty("file.separator");<br />  public TimeSizeRollingFileAppender() {<br />  }<br />  public void setFile(String file) {<br />    String val = file.trim();<br />    File domain = new File(".");<br />    try {<br />      fileName = domain.getCanonicalPath() + FS + val;<br />    }<br />    catch (IOException ex) {<br />      ex.printStackTrace();<br />    }<br />  }<br />}</p>
		<p>********** TimeSizeRollingFileAppender 类结束 ******</p>
		<p>************ 调用示例 TestLog4j类 **************<br />package com.aspire;</p>
		<p>import org.apache.log4j.Logger;<br />import org.apache.log4j.LogManager;<br />import org.apache.commons.logging.LogFactory;<br />import org.apache.log4j.xml.DOMConfigurator;<br />import org.apache.commons.logging.Log;</p>
		<p>public class TestLog4j {<br />  private Logger logger = Logger.getLogger("biz.startup");<br />  private Log log = LogFactory.getLog(TestLog4j.class);</p>
		<p>  public static void config(){<br />    DOMConfigurator.configure("conf\\log4jConf.xml");<br />  }<br />  public void Test(){<br />    /**<br />     * error &gt; warn &gt; info &gt; debug<br />     */<br />    logger.error("*****error*****");<br />    logger.debug("****debug*****");<br />    logger.warn("*****warn******");<br />    logger.info("*****info******");<br />    log.error("中华之崛起!");<br />  }<br />  public static void main(String [] argv){<br />    TestLog4j t = new TestLog4j();<br />    TestLog4j.config();<br />    t.Test();<br />  }<br />}</p>
		<p>***************  TestLog4j end ***********</p>
<img src ="http://www.blogjava.net/minmoon/aggbug/43247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-04-26 12:59 <a href="http://www.blogjava.net/minmoon/archive/2006/04/26/43247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>23种经典的设计模式_Prototype模式(原形模式)</title><link>http://www.blogjava.net/minmoon/archive/2006/04/16/41331.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Sun, 16 Apr 2006 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/04/16/41331.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/41331.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/04/16/41331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/41331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/41331.html</trackback:ping><description><![CDATA[
		<p>
				<strong>很多时候，创建对象的时候，只是在某些属性值上有区别，而大部分都很相似，但是这样的对象的初始化相对来说比较复杂，而且<br />需要耗费较长的时间或资源，这种情况下，我们可以考虑使用Prototype模式。我觉得这种模式实用于这样的情况:如果该类的用户对于该<br />类的对象是怎么创建的，对类的内部结构这些都不关心的情况，并且该类的创建过程比较费时或资源时，可以考虑使用该模式。下面是该模式的<br />一个例子:<br /><br /><font color="#ff1493">Prototype 类</font><br /><br /><font color="#0000ff">package com.moonsoft;</font></strong>
		</p>
		<p>
				<strong>
						<font color="#0000ff">import java.lang.Cloneable;<br />public class Prototype implements Cloneable {<br /> <br /> public String myname;<br /> <br /> Prototype(){<br />  System.out.println("start:"+System.currentTimeMillis());<br />  for( int i=0; i&lt; 9999999; i++){   <br />  }<br />  System.out.println("end:"+System.currentTimeMillis());<br /> }<br /> <br /> public Object clone(){<br />  Object o = null;<br />  try{<br />   o = super.clone();   <br />  }<br />  catch(CloneNotSupportedException ex){<br />   ex.printStackTrace();<br />  }<br />  return o;<br /> }<br /> <br /> public void whoami(){<br />  System.out.println(myname);<br /> }<br />}<br /><br /><br /></font>
						<font color="#ff1493">测试类<br /><br /></font>
						<font color="#0000ff">package com.moonsoft;</font>
				</strong>
		</p>
		<p>
				<strong>
						<font color="#0000ff">public class Test {<br /> <br /> public static void main(String [] argv){<br />  Prototype  p = new Prototype();<br />  p.whoami();<br />  p.myname = "loucy";<br />  Prototype  p1 = (Prototype)p.clone();<br />  p1.whoami(); <br />  <br /> }<br />}<br /></font>
				</strong>
		</p>
<img src ="http://www.blogjava.net/minmoon/aggbug/41331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-04-16 15:21 <a href="http://www.blogjava.net/minmoon/archive/2006/04/16/41331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小技巧_jsp缓存问题的解决</title><link>http://www.blogjava.net/minmoon/archive/2006/04/04/39172.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Tue, 04 Apr 2006 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/04/04/39172.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/39172.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/04/04/39172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/39172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/39172.html</trackback:ping><description><![CDATA[如果一直为jsp的缓存问题困扰的话，可以试试在jsp中加入以下几句话:<br /><br />&lt;head&gt;<br />&lt;meta http-equiv="Cache-Control" content="max-age=0" forua="true" /&gt;<br />&lt;meta http-equiv="Cache-Control" content="no-cache" forua="true"/&gt;<br />&lt;meta http-equiv="Cache-Control" content="must-revalidate" forua="true" /&gt;<br />&lt;/head&gt;<br /><br />max-age=30 就表示缓存的最长存在时间是30s,no-cache表示无缓存，must-revalidate表示每次访问必须重新验证是否有更新！<img src ="http://www.blogjava.net/minmoon/aggbug/39172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-04-04 15:11 <a href="http://www.blogjava.net/minmoon/archive/2006/04/04/39172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java实现的Html web服务器</title><link>http://www.blogjava.net/minmoon/archive/2006/03/28/37787.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Tue, 28 Mar 2006 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/03/28/37787.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/37787.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/03/28/37787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/37787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/37787.html</trackback:ping><description><![CDATA[
		<p>  马上就要开始转到新的项目组，做一个全新的项目了，对于HTTP协议需要一定的了解，所以周末自己用Java写了一个简单的web服务器试试，只能实现简单的html文件浏览。<br /><br />主要包括三个类:WebServer(监听浏览器请求),SocketThread(处理浏览器请求的进程),StringUtil(实现一些公共的操作),下面是三个类的代码.<br /><br /><br /><strong>----WebServer----</strong><br /><font color="#0000ff">import java.io.IOException;<br />import java.net.ServerSocket;<br />import java.net.Socket;</font></p>
		<p>
				<font color="#0000ff">public class WebServer {<br /> <br /> public static void main(String[] argv) throws IOException {<br />  ServerSocket servSocket = new ServerSocket(StringUtil.LISTENING_PORT);<br />  try {<br />   while (true) {<br />    Socket socket = servSocket.accept();<br />    new SocketThread(socket).start();<br />   }<br />  } finally {<br />   servSocket.close();<br />  }<br /> }<br />}</font>
				<br />
				<strong>---SocketThread------</strong>
				<br />
				<font color="#0000ff">import java.io.BufferedReader;<br />import java.io.BufferedWriter;<br />import java.io.File;<br />import java.io.InputStreamReader;<br />import java.io.OutputStreamWriter;<br />import java.io.PrintStream;<br />import java.io.Writer;<br />import java.net.Socket;</font>
		</p>
		<p>
				<font color="#0000ff">public class SocketThread extends Thread {<br /> private Socket socket = null;</font>
		</p>
		<p>
				<font color="#0000ff"> public SocketThread(Socket s) {<br />  this.socket = s;<br /> }</font>
		</p>
		<p>
				<font color="#0000ff"> public void run() {<br />  try {<br />   if (socket == null) {<br />    throw new Exception("==&gt;SOCKET为空&lt;==");<br />   }<br />   BufferedReader reader = new BufferedReader(new InputStreamReader(<br />     socket.getInputStream()));<br />   String fileName = "";<br />   while (true) {<br />    String str = reader.readLine();<br />    if (str == null || str.length() &lt;= 0) {<br />     break;<br />    }<br />    //System.out.println("===&gt;"+str);<br />    if (StringUtil.isGetRequestInfo(str)) {<br />     fileName = StringUtil.getFileName(str);<br />     break;<br />    }<br />   }<br />   //System.out.println("===&gt;客户机IP==&gt;"+socket.getInetAddress().toString());<br />   //System.out.println("===&gt;客户机端口==&gt;"+socket.getPort());   <br />   /*<br />    BufferedWriter writer = new BufferedWriter(new <br />    OutputStreamWriter(socket.getOutputStream()));<br />    */<br />   PrintStream outputStream = new PrintStream(socket.getOutputStream());<br />   File file = new File(StringUtil.WEBPATH + fileName);<br />   if (file.exists()) { //如果文件存在<br />    StringUtil.sendHttpHead(outputStream, file);<br />    StringUtil.sendFile(outputStream, file);<br />    outputStream.flush();<br />   } else { //文件没找到，返回404页面 <br />    StringUtil.send404Page(outputStream);<br />    outputStream.flush();<br />   }<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  } finally {<br />   try {<br />    socket.close();<br />   } catch (Exception e) {<br />   }<br />  }<br /> }</font>
		</p>
		<p>
				<font color="#0000ff">}<br /><br /><br /><br /></font>
				<strong>---StringUtil-----</strong>
				<br />
				<font color="#0000ff">import java.io.DataInputStream;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.PrintStream;</font>
		</p>
		<p>
				<font color="#0000ff">/**<br /> * @author xiaoliang <br /> */<br />public class StringUtil {</font>
		</p>
		<p>
				<font color="#0000ff"> // 服务器监听的端口<br /> public static final int LISTENING_PORT = 8080;</font>
		</p>
		<p>
				<font color="#0000ff"> // 服务器文件的位置<br /> public static final String WEBPATH = "E:";</font>
		</p>
		<p>
				<font color="#0000ff"> /**<br />  * 判断该字符串是不是浏览器发送过来的请求头信息<br />  * @param str<br />  * @return<br />  */<br /> public static boolean isGetRequestInfo(String str) {<br />  if (str == null || str.length() &lt;= 0)<br />   return false;<br />  boolean isGetStr = true;<br />  if (str.indexOf("GET") != 0) {<br />   isGetStr = false;<br />  }<br />  if (str.indexOf("HTTP/") &lt;= 0) {<br />   isGetStr = false;<br />  }<br />  return isGetStr;<br /> }</font>
		</p>
		<p>
				<font color="#0000ff"> /**<br />  * 获得请求信息中的文件名,默认为index.html<br />  * <br />  * @param str<br />  * @return<br />  */<br /> public static String getFileName(String str) {<br />  String fileName = "index.html", s;<br />  int httpIndex = str.lastIndexOf("HTTP/");<br />  s = str.substring(3, httpIndex);<br />  s = s.trim();<br />  if (s != null &amp;&amp; s.length() &gt; 0 &amp;&amp; s.indexOf(".") &gt; 0) {<br />   fileName = s;<br />  }<br />  return fileName;<br /> }</font>
		</p>
		<p>
				<font color="#0000ff"> /**<br />  * 发送文件到客户端<br />  * <br />  * @param out<br />  * @param file<br />  */<br /> public static void sendFile(PrintStream out, File file) {<br />  try {<br />   DataInputStream in = new DataInputStream(new FileInputStream(file));<br />   int length = (int) file.length();<br />   byte[] buffer = new byte[length];<br />   in.readFully(buffer);<br />   out.write(buffer, 0, length);<br />   in.close();<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</font>
		</p>
		<p>
				<font color="#0000ff"> /**<br />  * 发送返回的头部信息<br />  * @param out<br />  */<br /> public static void sendHttpHead(PrintStream outputStream, File file) {<br />  try {<br />   outputStream.println("HTTP/1.0200OK");<br />   outputStream.println("Content_Type:text／htm1");<br />   outputStream.println("Content_Length:" + file.length());<br />   outputStream.println("Server:moon webserver 1.0");<br />   outputStream.println("");<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</font>
		</p>
		<p>
				<font color="#0000ff"> /**<br />  * 返回404页面<br />  * @param out<br />  */<br /> public static void send404Page(PrintStream out) {<br />  try {<br />   out.println("HTTP ／1.0 404 no found");<br />   out.println("Content_type:text/html");<br />   out.println("");<br />   out.println("Error404:file not found!");<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }<br /> <br /> public static void main(String[] argv) {<br />  String str = "GET /11.html HTTP/1.1";<br />  str = StringUtil.getFileName(str);<br />  System.out.println("==&gt;" + str + "&lt;==");<br />  File file = new File(StringUtil.WEBPATH + str);<br />  if (file.exists()) {<br />   System.out.println("exists");<br />  } else {<br />   System.out.println("not exists");<br />  }<br /> }</font>
		</p>
		<p>
				<font color="#0000ff">}<br /></font>
				<br />
		</p>
<img src ="http://www.blogjava.net/minmoon/aggbug/37787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-03-28 13:55 <a href="http://www.blogjava.net/minmoon/archive/2006/03/28/37787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache FileUpload 使用</title><link>http://www.blogjava.net/minmoon/archive/2006/03/06/33828.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Mon, 06 Mar 2006 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/03/06/33828.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/33828.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/03/06/33828.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/33828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/33828.html</trackback:ping><description><![CDATA[<P>FileUpload 组件使用注意:<BR><FONT color=#008000>1&gt;<BR>首先创建一个HTML页面。注意，凡是要上载文件的表单都必须设置enctype属性，且属性的值必须是multipart/form-data，同时请求方法必须是POST.<BR>&lt;form name="myform" action="fileuploaddemo.jsp"&nbsp; method="post" enctype="multipart/form-data"&gt;<BR></FONT>&nbsp; <BR><FONT color=#006400>2&gt;commons-fileupload-1.1.jar和commons-io-1.1.jar 两个包都要引入，<BR>因为在parseRequest(request)的类有关继承于DiskFileItem类。</FONT></P>
<P><FONT color=#008000>3&gt;示例</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#800080> //检查表单是否正确<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean isMultipart = FileUpload.isMultipartContent(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskFileItemFactory&nbsp; factory = new DiskFileItemFactory();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件最大，设为-1表示不受限制<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; upload.setSizeMax(4096);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //解析请求，把解析的结果放在一个List里面<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List items = upload.parseRequest(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //缓存大小，设为-1表示不受限制<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory.setSizeThreshold(4096);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置临时目录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory.setRepository(new File("D:\\temp"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator iter = items.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( iter.hasNext() ){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem item&nbsp; = (FileItem)iter.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查是一个普通的表单域还是File组件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !item.isFormField() ){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("FileName:==&gt;"+item.getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("FieldName:==&gt;"+item.getFieldName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Size:==&gt;"+item.getSize());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //item.getName 返回的是完整的文件名，如:E:\\xx\11.doc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //所以这里用一个fullFile来取文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile&nbsp; = new File(item.getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File uploadedFile = new File("D:\\ftp\\",fullFile.getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item.write(uploadedFile);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></P><img src ="http://www.blogjava.net/minmoon/aggbug/33828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-03-06 12:33 <a href="http://www.blogjava.net/minmoon/archive/2006/03/06/33828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB QL</title><link>http://www.blogjava.net/minmoon/archive/2006/02/27/32762.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Mon, 27 Feb 2006 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/02/27/32762.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/32762.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/02/27/32762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/32762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/32762.html</trackback:ping><description><![CDATA[从一个表users中查询记录，如果是写成<BR>select&nbsp; i from&nbsp; users as&nbsp; i&nbsp; where i.name=?1则编译EJB的时候会报错，但是如果把users 首字母大写就OK了。<BR>select&nbsp; i from&nbsp; Users as&nbsp; i&nbsp; where i.name=?1<img src ="http://www.blogjava.net/minmoon/aggbug/32762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-02-27 23:34 <a href="http://www.blogjava.net/minmoon/archive/2006/02/27/32762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> EJb 会话Bean</title><link>http://www.blogjava.net/minmoon/archive/2006/02/22/31980.html</link><dc:creator>月亮</dc:creator><author>月亮</author><pubDate>Wed, 22 Feb 2006 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/minmoon/archive/2006/02/22/31980.html</guid><wfw:comment>http://www.blogjava.net/minmoon/comments/31980.html</wfw:comment><comments>http://www.blogjava.net/minmoon/archive/2006/02/22/31980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/minmoon/comments/commentRss/31980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/minmoon/services/trackbacks/31980.html</trackback:ping><description><![CDATA[<P>在EJB容器中，SessionBean主要有两种：无状态（stateless）和有状态（stateful）。<BR>1、无状态EJB，类似Servlet，它只提供一个引用(Bean instance)，被所有客户端使用，不保留某个客户的单独信息。<BR>例如：在某无状态EJB中，有一个数据成员（变量） i_count （整型，用于访问计数，初始值为0，访问一次累加1），它是公共的。某客户端访问后，值累加为1。另一个客户端访问时是已经变化了的值为1。</P>
<P>2、有状态EJB，类似数据库的Connect链接，也类似线程守护，它提供引用池(Bean instance pool)，每个客户端会有单独的信息。<BR>例如：在某有状态EJB中，有一个数据成员（变量） i_count （整型，用于访问计数，初始值为0，访问一次累加1），它对每个客户端来说是隔离的。某客户端访问后，值累加为1。另一个客户端访问时还是原来的值为0。</P>
<P>这里提到的数据成员（变量） i_count ，在EJB规范中称作：conversational state 。对它的要求也很多的，例如类型为 Serializable objects。还有，还要在ejbActivate()，ejbPassivate()，ejbRemove()等生命周期约定的方法中处理。详见EJB规范吧。</P>
<P>我的感想：在看第一遍书时，还一点感觉都没有，根本就看不明白SessionBean中的session与Servlet容器中的session有什么区别。<BR>动手编程后，才感觉到EJB只是比Servlet更规范，更重量而已。真正的区别就是接口协议一个是基于HTTP，一个是基于RMI/IIOP。Servlet与无状态的SessionBean在Session上是一样的控制。Servlet中的Session对象与有状态的SessionBean是一样的控制。<BR>对于应用，例如有一个购物车，要记录正在采购的物品信息，没有EJB时，我们一般是存在Servlet容器中的session中。有了EJB，则可以存储在有状态的SessionBean中，并且该次有状态的sessionBean的instance还得保存在Servlet的session中。这样的好处是：至少可以减轻Servlet容器的负载。<BR><BR><BR><BR>转自:<BR><A href="http://zengabo.blogchina.com/blog/527365.html">http://zengabo.blogchina.com/blog/527365.html</A></P><img src ="http://www.blogjava.net/minmoon/aggbug/31980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/minmoon/" target="_blank">月亮</a> 2006-02-22 16:35 <a href="http://www.blogjava.net/minmoon/archive/2006/02/22/31980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>