<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>Sophie+Software=Wonderful</title>
  <link>http://sophieplussoftware.blogbus.com</link>
  <description><![CDATA[]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Thu, 01 Jan 1970 07:00:00 +0700</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/profile/0/7/8/4206870/avatar_4206870_96.jpg</url>
									<title>Sophie+Software=Wonderful</title>
									<link>http://sophieplussoftware.blogbus.com</link>
								</image>  <item>
   <title>测试不会的地方</title>
   <description><![CDATA[白盒测试里基本路径测试不太会，PDL语言也没听说过<br /><br /><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F39569087.html&title=%E6%B5%8B%E8%AF%95%E4%B8%8D%E4%BC%9A%E7%9A%84%E5%9C%B0%E6%96%B9">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/39569087.html</link>
   <author>anxinwang</author>
   <pubDate>Mon, 18 May 2009 10:59:01 +0800</pubDate>
  </item>
  <item>
   <title>静态测试</title>
   <description><![CDATA[静态测试<br /><br />
<br /><br />
为什么要进行静态分析呢？一个软件产品可能实现了所要求的功能，但如果它的内部结构组织的很复杂，很混乱，代码的编写也没有规范的话，这时软件中往往会隐藏一些不易被察觉的错误，这是其一。其次，即使这个软件基本满足了用户目前的要求，但到了日后对该产品进行维护升级工作的时候，会发现维护工作相当困难。所以，如果能对软件进行科学、细致的静态分析，使系统的设计符合模块化、结构化、面向对象的要求，使开发人员编写的代码符合规定的编码规范，就能够避免软件中大部...<!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F39388789.html&title=%E9%9D%99%E6%80%81%E6%B5%8B%E8%AF%95">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/39388789.html</link>
   <author>anxinwang</author>
   <pubDate>Thu, 14 May 2009 17:31:18 +0800</pubDate>
  </item>
  <item>
   <title>[转帖] 让开发自动化: 用 Eclipse 插件提高代码质量</title>
   <description><![CDATA[http://www.javaeye.com/topic/140298<br /><br /><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F39384313.html&title=%5B%E8%BD%AC%E5%B8%96%5D+%E8%AE%A9%E5%BC%80%E5%8F%91%E8%87%AA%E5%8A%A8%E5%8C%96%3A+%E7%94%A8+Eclipse+%E6%8F%92%E4%BB%B6%E6%8F%90%E9%AB%98%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/39384313.html</link>
   <author>anxinwang</author>
   <pubDate>Thu, 14 May 2009 14:45:50 +0800</pubDate>
  </item>
  <item>
   <title>测试总览</title>
   <description><![CDATA[<p>测试分为静态测试和动态测试。</p>
<p>静态测试是指：<span style="font-size: 16px;"><span style="font-family: '宋体', sans-serif;"><span style="font-size: 14px;"><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">不用执行程序的测试。静态测试主要采取方案</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN;" lang="EN-US">review</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">、代码走查、同行评审、</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN;" lang="EN-US">check list</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">检查单</span></span></span></span><span style="font-size: 32pt; font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: 16px;"><span style="font-family: '宋体', sans-serif;"><span style="font-size: 14px;">的方法对软件产品进行测试。</span></span></span></span></p>
<p><span style="font-size: 32pt; font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: 16px;"><span style="font-family: '宋体', sans-serif;"><span style="font-size: 14px;">动态测试是指：<span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">通过执行程序，找出产品问题的测</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">试过程。黑盒</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">测试和白盒测试都是动态测试</span><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 'Times New Roman';">。</span></span></span></span></span><span style="font-size: 14px;">&nbsp; </span></p>
<p><span style="font-size: 14px;"><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman';"><span style="font-family: '宋体', sans-serif;">白盒测试和黑盒测试：</span></span><span style="font-size: 14px;"><span style="font-family: '宋体', sans-serif;"><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-color-index: 6;"><span style="color: #000000;">白盒测试也称结构测试或逻辑驱动测试。</span></span></span></span><span style="font-size: 14px;"><span style="font-family: '宋体', sans-serif;"><span style="color: #000000;"><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-color-index: 6;">是对内部处理逻辑的测试。一般由开发人员完成。白盒测试工具：JUnit这类的</span></span></span></span></span></p>
<p><span style="font-size: 14px;"><span style="font-size: 14px;"><span style="font-family: '宋体', sans-serif;"><span style="color: #000000;"><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-color-index: 6;">黑盒测试也称功能测试或数据驱动测试。</span></span></span></span><span style="font-size: 14px;"><span style="font-family: '宋体', sans-serif;"><span style="color: #000000;"><span style="mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-color-index: 6;">是对外部功能表现的测试。一般由非开发人员完成。 </span></span></span></span></span></p><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F39346215.html&title=%E6%B5%8B%E8%AF%95%E6%80%BB%E8%A7%88">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/39346215.html</link>
   <author>anxinwang</author>
   <pubDate>Wed, 13 May 2009 17:08:26 +0800</pubDate>
  </item>
  <item>
   <title>测试工具selenium</title>
   <description><![CDATA[http://www.javaeye.com/topic/24425?page=1<br /><br />
http://www.javaeye.com/topic/107276<br /><br />
http://www.javaeye.com/topic/160592<br /><br />
http://seleniumhq.org/download/<br /><br /><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F39258714.html&title=%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7selenium">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/39258714.html</link>
   <author>anxinwang</author>
   <pubDate>Mon, 11 May 2009 22:16:34 +0800</pubDate>
  </item>
  <item>
   <title>几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比</title>
   <description><![CDATA[&nbsp;<br /><br />AJAX是web20的基石，现在网上流行几种开源的AJAX框架，比如：jQuery,Mootools,Dojo,Ext JS等等，那么我们到底在什么情况下该使用那个框架？以下是一组摘抄的数据：<br /><br />Ajaxian在2007年底对Ajax工具进行了调查，部分调查结果见下表（其中数字为调查者使用该工具的百分比，详细的请参见网页）：http://ajaxian.com/archives/2007-ajax-tools-usage-survey-resu...<!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F30326776.html&title=%E5%87%A0%E7%A7%8D%E6%B5%81%E8%A1%8C%E7%9A%84AJAX%E6%A1%86%E6%9E%B6jQuery%2CMootools%2CDojo%2CExt+JS%E7%9A%84%E5%AF%B9%E6%AF%94">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/30326776.html</link>
   <author>anxinwang</author>
   <pubDate>Fri, 17 Oct 2008 10:54:13 +0800</pubDate>
  </item>
  <item>
   <title>JSP的内置对象---pageContext</title>
   <description><![CDATA[pageContext对象提供了对JSP页面内所有的对象及名字空间的访问，也就是说它可以访问到本页所在的Session，<br />也可以取本页面所在的application的某一属性值，它的本类的名字也叫pageContext。<br /><br />pageContext对象的方法：<br /><br />(1)forward（String relativeUrlPath）-----把页面重定向到另外一个页面或者Servlet组件上。<br /><br />语法如下：<a name="entrymore" title="entrymore"></a><br /><br /><div class="code">pageContext.forward(String relativeUrlPath)</div><br /><br />(2)getAttribute(STring name[,int scope])-----scope参数可选，此方法可以检测一个特定的已经命名的对象的范围，还可以通过<br />调用getAttributeNamesInScope()方法，检索对某个特定范围的每个属性String字符串名称的枚举。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getAttribute(STring name[,int scope])</div><br /><br />(3)getException()-----返回当前的exception对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getException()</div><br /><br />(4)getRequest()-----返回当前的request对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getRequest()</div><br /><br />可以如下使用：<br /><br /><div class="code">ServletRequest req;<br />req = pageContext.getRequest();<br />String name = req.getParameter(&quot;name&quot;);</div><br /><br />(5)getResponse()-----返回当前的response对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getResponse()</div><br /><br />(6)getServletConfig()-----返回当前页面的ServletConfig对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getServletConfig()</div><br /><br />(7)getServletContext()-----返回Servlet Context对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getServletContext()</div><br /><br />(8)getSession()-----返回当前页面的session对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.getSession()</div><br /><br />(9)findAttribute()-----按照页面、请求、会话以及应用程序范围的顺序实现对象某个已命名属性的搜索。<br /><br />语法如下：<br /><br /><div class="code">pageContext.findAttribute()</div><br /><br />(10)setAttribute()-----设置默认页面范围内或者特定对象范围之中的已经命名的对象。<br /><br />语法如下：<br /><br /><div class="code">pageContext.setAttribute()</div><br /><br /><span style="color: #0000ff">注意</span>：（1）在页面上下文设置属性，默认情况下这个属性只有在当前范围内是有效的。<br />&nbsp; &nbsp; &nbsp;（2）想要在Servlet Context中设置属性，用pageContext.getServletContext().setAttribute()。<br />&nbsp; &nbsp; &nbsp;（3）想要在Session中设置属性，用pageContext.getSession().setAttribute()。<br /><br /><br />例子如下：<br /><br />1、通过getAttributeNamesInScope来取得scope范围内的属性。<br /><br /><div class="code">pageContext.jsp<br /><br />&lt;%@ page import=&quot;java.util.Enumeration&quot; contentType=&quot;text/html;charset=GB2312&quot; %&gt;<br />&lt;html&gt;<br />&lt;head&gt;&lt;title&gt;PageContext.jsp&lt;/title&gt;&lt;/head&gt;<br />&lt;body&gt;<br />&lt;h2&gt;javax.servlet.jsp.PageContext - pageContext &lt;/h2&gt;<br /><br />&lt;%<br />&nbsp;&nbsp;Enumeration enum = pageContext.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;while(enum.hasMoreElements()){<br />&nbsp;&nbsp;&nbsp;&nbsp;out.println(&quot;application attributeG +++ &quot;+enum.nextElement()+&quot;&lt;br&gt;&quot;);<br />&nbsp;&nbsp;}<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div><br /><br />2、访问session和Servlet Context对象<br /><br /><div class="code">ValueInput.jsp<br /><br />&lt;html&gt;<br />&lt;body&gt;<br />&lt;form method=&quot;post&quot; action=&quot;pagecontext1.jsp&quot;&gt;<br />&lt;table&gt;<br />&lt;tr&gt;<br />&nbsp;&nbsp;&lt;td&gt;UserName: &lt;/td&gt;<br />&nbsp;&nbsp;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;&lt;/td&gt;&nbsp;&nbsp;<br />&lt;/tr&gt;<br />&lt;tr colspan=&quot;2&quot;&gt;<br />&nbsp;&nbsp;&lt;td&gt;&lt;input type=&quot;submit&quot; value=&quot;Submit&quot;&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div><br /><br /><br /><div class="code">pagecontext1.jsp<br /><br />&lt;%@ page import=&quot;javax.servlet.http.*,javax.servlet.*&quot; %&gt;<br />&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html;charset=GB2312&quot; %&gt; <br />pageContext 的测试页面 - 在 pageontext 中设置一些属性： &lt;br&gt;<br />&lt;%<br />&nbsp;&nbsp;ServletRequest req = pageContext.getRequest();<br />&nbsp;&nbsp;String name = req.getParameter(&quot;name&quot;);<br />&nbsp;&nbsp;out.println(&quot;name=&quot;+name);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;pageContext.setAttribute(&quot;userName&quot;,name);<br />&nbsp;&nbsp;pageContext.getServletContext().setAttribute(&quot;shareValue&quot;,name);<br />&nbsp;&nbsp;pageContext.getSession().setAttribute(&quot;sessionValue&quot;,name);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;out.println(&quot;&lt;br&gt;pageContext.getAttribute('userName') : \n&quot;+pageContext.getAttribute(&quot;userName&quot;));<br />%&gt;<br />&lt;a href=&quot;pageContext2.jsp&quot;&gt;next----&gt;&lt;/a&gt;</div><br /><br /><div class="code">pagecontext2.jsp<br /><br />&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html;charset=GB2312&quot; %&gt;<br />pageContext 的测试页面 - 获得前一个页面设置的值： &lt;br&gt;<br />&lt;%<br />&nbsp;&nbsp;out.println(&quot;&lt;br&gt;pageContext.getAttribute('userName') = &quot;);<br />&nbsp;&nbsp;out.println(pageContext.getAttribute(&quot;userName&quot;));<br />&nbsp;&nbsp;out.println(&quot;&lt;br&gt;pageContext.getServletContext().getAttribute('shareValue')&quot;);<br />&nbsp;&nbsp;out.println(pageContext.getServletContext().getAttribute(&quot;shareValue&quot;));<br />&nbsp;&nbsp;out.println(&quot;&lt;br&gt;pageContext.getSession().getAttribute('sessionValue')&quot;);<br />&nbsp;&nbsp;out.println(pageContext.getSession().getAttribute(&quot;sessionValue&quot;));<br />%&gt;</div><br /><br />关于例子2的说明，第一次你先从ValueInput.jsp进入，然后通过pagecontext1.jsp---&gt;pagecontext2.jsp，看一下没页的结果；然后<br />关闭浏览器，重新打开直接输入pagecontext2.jsp的地址，看看页面中的结果有何不同。<!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F26950998.html&title=JSP%E7%9A%84%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1---pageContext">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/26950998.html</link>
   <author>anxinwang</author>
   <pubDate>Mon, 04 Aug 2008 14:19:09 +0800</pubDate>
  </item>
  <item>
   <title>如何打JAR包</title>
   <description><![CDATA[<p>jar文件听说过吗，没有？或者陌生！好，没关系，这就是我们的第一站：打包发布。</p><p>为什么会有这个玩意呢，首先，这是jar的全称：JavaTM Archive (JAR) file，是的，就是java存档文件。这有点类似zip文件，想一想它是干什么的用的呢，压缩！？没错就是要压缩，将我们原先零散的东西放到一下，重新组织，所有这些目的只有一个：方便！好了，不用管他是怎么压缩的，我们的重点是哪些是我们要压缩的(输入)，还有压缩成了什么(输出)，进而将它发布(部署)。　　<br />　　 </p><p>　 那我们的输入(要压缩的东西)主要是class文件，还有辅助的资源(这其中可能有图片，jsp文件，html文件等等)。Jar技术在jdk1.1版本中就已存在，在1.2中又有了增强。接下来说说jar的好处吧，这是官方的描述：安全，快速下载，压缩，猎取包，版本化包，可携。 　 </p><p>　　说了这么多，我们现在开始实施。 　　 </p><p>　　先打开命令提示符(win2000或在运行框里执行cmd命令，win98为DOS提示符)，输入jar Chelp,然后回车(如果你盘上已经有了jdk1.1或以上版本)，看到什么： 　　 </p><p>　　用法：jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... 　　 </p><p>　　选项： 　　 </p><p>　　-c 创建新的存档 </p><p>　　-t 列出存档内容的列表 </p><p>　　-x 展开存档中的命名的（或所有的〕文件 </p><p>　　-u 更新已存在的存档 </p><p>　　-v 生成详细输出到标准输出上 </p><p>　　-f 指定存档文件名 </p><p>　　-m 包含来自标明文件的标明信息 </p><p>　　-0 只存储方式；未用zip压缩格式 </p><p>　　-M 不产生所有项的清单（manifest〕文件 </p><p>　　-i 为指定的jar文件产生索引信息 </p><p>　　-C 改变到指定的目录，并且包含下列文件：　　 </p><p>　　如果一个文件名是一个目录，它将被递归处理。 　　 </p><p>　　清单（manifest〕文件名和存档文件名都需要被指定，按'm' 和 'f'标志指定的相同顺序。 　　 </p><p>　　示例1：将两个class文件存档到一个名为 'classes.jar' 的存档文件中：<br />　</p><p><br />　　jar cvf classes.jar Foo.class Bar.class 　　 </p><p>　　示例2：用一个存在的清单（manifest）文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 'classes.jar' 的存档文件中： </p><p><br />　　jar cvfm classes.jar mymanifest -C foo/ . 　　 </p><p>　　来个小例子试试看： </p><p>　　我们只有一个HelloWorld，如下： 　　 </p><p><br />　　public class HelloWorld{ <br />　　public static void main(String[ ] args){ <br />　　System.out.println(&quot;Hi, Hello World!&quot;); <br />　　} <br />　　}　　 <br />　　将这个java文件存到C盘跟目录下，ok，接下来， 　　 </p><p>　　在先前打开的命令提示符下(跳转到C盘提示符下)，我们输入javac HelloWorld.java，然后继续输入：jar cvf hello.jar HelloWorld.class，回车后去你的C盘看看，多了什么，没错 hello.jar 。 </p><p>　　基本的步骤我们现在都知道了，你可以自己去尝试一下随着jar后面的参数的不同，结果有什么变化。 　　 <br />　　紧接着我们看看如何运行我们的jar包。 　　 </p><p>　　在进入正题之前，你要先打开我们刚刚做好的jar包看看，多了什么呢，META-INF目录？再看看里面是什么，还有一个MANIFEST.MF文件是不是？用文本编辑器(我这里是UltraEdit)打开它看看： </p><p><br />　　Manifest-Version: 1.0 <br />　　Created-By: 1.4.2 (Sun Microsystems Inc.) 　　 </p><p>　　就是这样。这里我们对它进行修改，加一句：Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类，也就是我们的入口类。也即， </p><p><br />　　Manifest-Version: 1.0 <br />　　Created-By: 1.4.2 (Sun Microsystems Inc.) <br />　　Main-Class: HelloWorld 　 </p><p>　　接下来，我们在命令提示符里执行： </p><p><br />　　jar umf MANIFEST.MF app.jar 　(应该是hello.jar吧)　</p><p>　　这样我们使用了我们自己的MANIFEST.MF文件对原来默认的进行了更新。你不妨可以再进去看看是不是添上了Main-Class: HelloWorld这一句。 　　 (是吗，我怎么没试出来，提示java.io.FileNotFoundException:MANIFEST.MF（系统找不到指定的文件）怎么回事？<br />)</p><p><br />Ok，这个最后的一步了，来验证我们做的一切，在命令提示符中输入： </p><p><br />　　java -jar hello.jar(执行) 　　 </p><p>　　出现了什么， Hi, Hello World! 　 </p><p>　　我们再来看看jar文件在tomcat中发布，注意：在tomcat中我们就不能再用jar这种格式，而改war格式，它是专门用于web应用的，其实整个过程下来基本上和jar是类似的：　 </p><p>　　先准备我们要打包的资源。 　　 </p><p>　　找到存放tomcat的webapps目录，进到其中，新建一个文件夹，这里命名为hello，再进去新建WEB-INF文件夹，再进去新建 classes文件夹，此时我们也将我们唯一的servlet，HelloWorld.java放到这里，在与classes目录同级下建立一文件 web.xml。Ok，目前我们初步建立了一个简单的web应用。　　 </p><p>　　这是HelloWorld.java： 　　 </p><p><br />　　import java.io.*; <br />　　import javax.servlet.*; <br />　　import javax.servlet.http.*; <br />　　public class HelloWorld extends HttpServlet { <br />　　public void doGet(HttpServletRequest req, HttpServletResponse res) <br />　　throws ServletException, IOException { <br />　　res.setContentType(&quot;text/html&quot;); <br />　　PrintWriter out = res.getWriter(); <br />　　out.println(&quot;&quot;); <br />　　out.println(&quot;&quot;); <br />　　out.println(&quot;&quot;); <br />　　out.println(&quot;Hello, World!&quot;); <br />　　out.println(&quot;&quot;); <br />　　} <br />　　}//end here!　　 </p><p>　　对它编译。下面是web.xml：<br />　　&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />　　&lt;!DOCTYPE web-app PUBLIC &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot; &quot;<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>&quot;&gt;<br />　　&lt;web-app&gt;<br />　　&lt;servlet&gt;<br />　　&lt;servlet-name&gt;hello&lt;/servlet-name&gt;<br />　　&lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<br />　　&lt;/servlet&gt;<br />　　&lt;servlet-mapping&gt;<br />　　&lt;servlet-name&gt;hello&lt;/servlet-name&gt;<br />　　&lt;url-pattern&gt;/HelloWorld&lt;/url-pattern&gt;<br />　　&lt;/servlet-mapping&gt;<br />　　&lt;/web-app&gt;</p><p><br />在命令提示符下进到先前创制的hello目录下，执行 jar cvf hello.war * ，我们便得到hello.war。将它拷贝至webapps目录下，ok，来看最后一步，打开tomcat的目录conf中的server.xml，加入：</p><p>&nbsp;</p><p>　　&lt;Context path=&quot;/hello&quot; docBase=&quot;hello.war&quot; debug=&quot;0&quot; reloadable=&quot;true&quot;/&gt;<br />　　大功告成！运行它，启动tomcat，后在浏览器中输入<a href="http://localhost:8080/hello/HelloWorld">http://localhost:8080/hello/HelloWorld</a>，有了吗？　 </p><p>　　最后，如果你想用ant来完成以上的打包活动，下面就告诉你：<br />　　对于jar来说。在build.xml中， </p><p>　　&lt;target name=&quot;jar&quot;&gt;<br />　　&lt;jar destfile=&quot;${app_home}/hello.jar&quot;&gt;<br />　　&lt;fileset dir=&quot;${dest}&quot; includes=&quot;**&quot;/&gt;<br />　　&lt;!--fileset dir=&quot;${dest}&quot; includes=&quot;**/action.properties&quot;/--&gt;<br />　　&lt;/jar&gt;<br />　　&lt;/target&gt;　　<br />　　对于war， 　　</p><p><br />　　&lt;war warfile=&quot;hello.war&quot; webxml=&quot;./WEB-INF/web.xml&quot;&gt;<br />　　&lt;fileset dir=&quot;html&quot;/&gt;<br />　　&lt;lib dir=&quot;lib/&quot;&gt;<br />　　&lt;exclude name=&quot;oracle*.jar&quot;/&gt;<br />　　&lt;/lib&gt;<br />　　&lt;classes dir=&quot;build/servlets&quot;&gt;<br />　　&lt;include name=&quot;**/*.class&quot;/&gt;<br />　　&lt;/classes&gt;<br />　　&lt;/war&gt;　　<br />　　好了，就这么多，希望对你有点帮助。：） </p><p>　　补充：　 </p><p>　　jar基本操作： 　　 </p><p>　　1. 创建jar文件 　 <br />　　jar cf jar-file input-file(s) <br />　　c---want to Create a JAR file. <br />　　f---want the output to go to a file rather than to stdout. <br />　　eg: 1)jar cf myjar.jar query_maintain_insert.htm <br />　　2)jar cvf myjar.jar query_maintain_insert.htm <br />　　v---Produces verbose(详细的) output. </p><p><br />　　3)jar cvf myjar.jar query_maintain_insert.htm mydirectory <br />　　4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory <br />　　0---don't want the JAR file to be compressed. <br />　　5)jar cmf MANIFEST.MF myjar.jar yahh.txt <br />　　m---Used to include manifest information from an existing manifest file. <br />　　6)jar cMf MANIFEST.MF myjar.jar yahh.txt <br />　　M---the default manifest file should not be produced. <br />　　7)jar cvf myjar.jar * <br />　　*---create all contents in current directory.　　 </p><p>　　2. 察看jar文件 　　 <br />　　jar tf jar-file <br />　　t---want to view the Table of contents of the JAR file. <br />　　eg: 1)jar vft yahh.jar <br />　　v---Produces verbose(详细的) output. 　</p><p>　　3. 提取jar文件 　 <br />　　jar xf jar-file [archived-file(s)] <br />　　x---want to extract files from the JAR archive. <br />　　eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt) </p><p>　　2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt) 　 </p><p>　　3)jar xf yahh.jar(提取该jar包中的所有文件或目录) 　</p><p>　　4. 修改Manifest文件 　 <br />　　jar cmf manifest-addition jar-file input-file(s) <br />　　m---Used to include manifest information from an existing manifest file. 　</p><p>　　5. 更新jar文件 　 <br />　　jar uf jar-file input-file(s) <br />　　u---want to update an existing JAR file.<br />&nbsp;---------------------------------------------------------------------------------------------<br />把java独立应用程序分成两种：1）没有用到Package的普通程序；2）有Package的，一般有多个.class文件才用的。<br />1）比如你写的java文件的目录是：D:\JAVA\test.java；那么你运行完会在同一目录下生成一个test.class文件</p><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F26594574.html&title=%E5%A6%82%E4%BD%95%E6%89%93JAR%E5%8C%85">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/26594574.html</link>
   <author>anxinwang</author>
   <pubDate>Fri, 01 Aug 2008 14:08:31 +0800</pubDate>
  </item>
  <item>
   <title>用jar命令将java class文件打包以及编写方便执行jar文件的批处理文件</title>
   <description><![CDATA[<div class="blog_content"><p>1.jar文件打包<br />假设需要打包的文件如下：<br />classes\com\albertsong\MyApp.class<br />classes\com\albertsong\Aaaa.class<br />classes\com\albertsong\util\Bbbb.class<br />(其中MyApp包含main函数）<br />建一个mymanifest.mf 文件，内容如下：<br />Main-Class: com.albertsong.MyApp<br /><br /><br />建一个myjar.bat文件，内容如下：<br />set JAVA_HOME=C:\jsdk1.5.0_09<br />set PATH=%JAVA_HOME%\bin<br />set CLASSPATH=%JAVA_HOME%\lib\tools.jar;<br />jar cvfm MyApp.jar mymanifest.mf&nbsp; -C classes .<br /><br />这两个文件都放到和classes同一个目录，即目录结构象下面一样<br />MyApp\classes\com\albertsong\MyApp.class<br />MyApp\classes\com\albertsong\Aaaa.class<br />MyApp\classes\com\albertsong\util\Bbbb.class<br />MyApp\mymanifest.mf <br />MyApp\myjar.bat<br />然后点myjar.bat这个文件执行就可以了：）<br /><br />2.执行jar文件<br />建一个目录MyApp/release。<br />将生成的MyApp.jar复制到这个目录。<br />在这个目录里新建一个批处理文件run.bat，内容如下：<br />set JAVA_HOME=C:\jsdk1.5.0_09<br />set PATH=%JAVA_HOME%\bin<br />set CLASSPATH=%JAVA_HOME%\lib\tools.jar;<br />javaw -jar MyApp.jar<br /><br />3.其它<br />&nbsp;&nbsp; 1）jar cvfm MyApp.jar mymanifest.mf&nbsp; -C classes .<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这行命令，最后的<span style="color: #ff0000">.</span> <span style="color: #ff00ff">一定不能掉</span> ，jar命令给出的帮助的例子是<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jar cvfm classes.jar mymanifest -C foo/ .<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是在windows下应该改成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jar cvfm classes.jar mymanifest -C foo<span style="color: #ff0000">\</span> .<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者<br />&nbsp;&nbsp;&nbsp;&nbsp; jar cvfm classes.jar mymanifest -C foo .<br />&nbsp;&nbsp; 2）如果应用程序比较大，可能会用到其它的库，这时可以在release目录下建一个lib<br />&nbsp;&nbsp;&nbsp;&nbsp; 然后在run.bat的CLASSPATH中添加用到的库。<br />&nbsp;&nbsp; set CLASSPATH=%JAVA_HOME%\lib\tools.jar;lib\ccc.jar;lib\ddd.jar;<br />&nbsp;&nbsp;&nbsp; 3)如果要指定java程序使用的内存，这样<br />&nbsp;&nbsp;&nbsp; javaw -ms100m -mx256m -jar MyApp.jar <br />&nbsp;&nbsp;&nbsp; 上面指定了使用最小100M最大256M内存。<br />&nbsp;&nbsp;&nbsp; 4）如果main函数要带参数<br />&nbsp;&nbsp;&nbsp; javaw -ms100m -mx256m -jar MyApp.jar&nbsp; arg1 arg2<br />&nbsp;&nbsp;&nbsp; 5)如果不能在控制台看到有关信息，可以用java来执行jar包<br />&nbsp;&nbsp;&nbsp; &nbsp; java -ms100m -mx256m -jar MyApp.jar&nbsp; arg1 arg2<br />&nbsp;&nbsp;&nbsp;&nbsp; javaw在后台执行。<br />&nbsp;&nbsp;&nbsp; 6)如果bat文件一闪而过，看不到输出，可以在文件最后一行加上pause，最好的是通过cmd.exe来运行run.bat。<br /><br />后记：<br />&nbsp;&nbsp;&nbsp; 老早以前写过一个，后来丢失了，今天因为忘了点号和反斜杠的问题，又浪费不少时间。</p></div><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F26593491.html&title=%E7%94%A8jar%E5%91%BD%E4%BB%A4%E5%B0%86java+class%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%E4%BB%A5%E5%8F%8A%E7%BC%96%E5%86%99%E6%96%B9%E4%BE%BF%E6%89%A7%E8%A1%8Cjar%E6%96%87%E4%BB%B6%E7%9A%84%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/26593491.html</link>
   <author>anxinwang</author>
   <pubDate>Fri, 01 Aug 2008 13:57:54 +0800</pubDate>
  </item>
  <item>
   <title>如何打JAR包</title>
   <description><![CDATA[<p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">1</span><span style="color: black; font-family: 宋体">、首先必须保证能够执行</span><span style="color: black; font-family: Verdana">Jar</span><span style="color: black; font-family: 宋体">命令，一般安装完</span><span style="color: black; font-family: Verdana">jdk</span><span style="color: black; font-family: 宋体">之后，该命令在</span><span style="color: black; font-family: Verdana">Java\jdk1.5.0_01\bin</span><span style="color: black; font-family: 宋体">下，将这个路径设置到系统环境变量</span><span style="color: black; font-family: Verdana">path</span><span style="color: black; font-family: 宋体">当中。（可以通过配置我的电脑属性中的环境变量来设置，也可以进入控制台用</span><span style="color: black; font-family: Verdana">set path=%path%;newpath</span><span style="color: black; font-family: 宋体">来设置）。</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">2</span><span style="color: black; font-family: 宋体">、一般如果希望打包之后双击执行还要配置好</span><span style="color: black; font-family: Verdana">classpath</span><span style="color: black; font-family: 宋体">，将</span><span style="color: black; font-family: Verdana">.</span><span style="color: black; font-family: 宋体">（注意是一个点）和</span><span style="color: black; font-family: Verdana">Java\jre1.5.0_01\lib</span><span style="color: black; font-family: 宋体">。</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">3</span><span style="color: black; font-family: 宋体">、还必须制作好一个清单文件，里面标明主类（也就是</span><span style="color: black; font-family: Verdana">main</span><span style="color: black; font-family: 宋体">函数所在类），该文件是文本文件，名字随便，比如叫</span><span style="color: black; font-family: Verdana">list.txt</span><span style="color: black; font-family: 宋体">；内容如下：</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">Main-Class: xxxx</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: 宋体">注意几点：</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">1</span><span style="color: black; font-family: 宋体">）</span><span style="color: black; font-family: Verdana">Main-Class</span><span style="color: black; font-family: 宋体">有大小写区别；</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">2</span><span style="color: black; font-family: 宋体">）之后是一个冒号，后面是一个空格，一定注意，多了少了都不对；</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">3</span><span style="color: black; font-family: 宋体">）之后是类的名字，没有</span><span style="color: black; font-family: Verdana">.class</span><span style="color: black; font-family: 宋体">扩展名；</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">4</span><span style="color: black; font-family: 宋体">）如果是</span><span style="color: black; font-family: Verdana">package</span><span style="color: black; font-family: 宋体">的话，需要指明路径：</span><span style="color: black; font-family: Verdana">xxx.xxx.xxx</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">5</span><span style="color: black; font-family: 宋体">）之后是回车换行，而且之后只能是一个空行，什么都不要有。呵呵</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">4</span><span style="color: black; font-family: 宋体">、一切准备就绪了，我们开始打包，执行命令：</span></p><p style="background: white; margin: 12pt 0cm 6pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: Verdana">jar cvfm test.jar list.txt *.class</span></p><p style="background: white; margin: 12pt 0cm 0pt; word-break: break-all; text-indent: 24pt; line-height: 16.5pt; text-align: left" class="MsoNormal" align="left"><span style="color: black; font-family: 宋体">好了，如果顺利已经生成了</span><span style="color: black; font-family: Verdana">test.jar</span><span style="color: black; font-family: 宋体">包了，双击可以执行了。</span></p><!--sp--><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fsophieplussoftware.blogbus.com%2Flogs%2F26593098.html&title=%E5%A6%82%E4%BD%95%E6%89%93JAR%E5%8C%85">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://sophieplussoftware.blogbus.com/logs/26593098.html</link>
   <author>anxinwang</author>
   <pubDate>Fri, 01 Aug 2008 13:51:21 +0800</pubDate>
  </item>
 </channel>
</rss>

