﻿<?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-littleQ-随笔分类-induction</title><link>http://www.blogjava.net/littleq/category/33435.html</link><description>&lt;span style="color:blue"&gt;学习永无止境&lt;/span&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 31 Jul 2008 14:42:05 GMT</lastBuildDate><pubDate>Thu, 31 Jul 2008 14:42:05 GMT</pubDate><ttl>60</ttl><item><title>Getting Started with Induction-翻译(2) </title><link>http://www.blogjava.net/littleq/archive/2008/07/31/219172.html</link><dc:creator>littleQ</dc:creator><author>littleQ</author><pubDate>Thu, 31 Jul 2008 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/littleq/archive/2008/07/31/219172.html</guid><wfw:comment>http://www.blogjava.net/littleq/comments/219172.html</wfw:comment><comments>http://www.blogjava.net/littleq/archive/2008/07/31/219172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/littleq/comments/commentRss/219172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/littleq/services/trackbacks/219172.html</trackback:ping><description><![CDATA[<span style="font-family: 微软雅黑"><span style="font-family: 微软雅黑"><span style="font-size: 10pt; font-family: Arial">&nbsp;<span style="font-size: 10pt; color: red; font-family: 'Courier New'">Deploying the application</span>
<p><span style="font-size: 10pt; font-family: 宋体">在我们运行</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller</span><span style="font-size: 10pt; font-family: 宋体">之前，必须对其进行编译。我们可以使用</span><span style="font-size: 10pt; font-family: 'Courier New'">javac</span><span style="font-size: 10pt; font-family: 宋体">或者任何</span><span style="font-size: 10pt; font-family: 'Courier New'">IDE</span><span style="font-size: 10pt; font-family: 宋体">去编译</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller</span><span style="font-size: 10pt; font-family: 宋体">。接下来，我们要让</span><span style="font-size: 10pt; font-family: 'Courier New'">Tomcat</span><span style="font-size: 10pt; font-family: 宋体">知道我们的</span><span style="font-size: 10pt; font-family: 'Courier New'">web</span><span style="font-size: 10pt; font-family: 宋体">应用程序。我们需要创建一个</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包，然后部署到</span><span style="font-size: 10pt; font-family: 'Courier New'">Tomcat</span><span style="font-size: 10pt; font-family: 宋体">中，这步只需要将</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包拷贝到</span><span style="font-size: 10pt; font-family: 'Courier New'">:/dev/Tomcat6/webapps</span><span style="font-size: 10pt; font-family: 宋体">目录下。</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">我们的</span><span style="font-size: 10pt; font-family: 'Courier New'">.war</span><span style="font-size: 10pt; font-family: 宋体">文件中的</span><span style="font-size: 10pt; font-family: 'Courier New'">/WEB-INF</span><span style="font-size: 10pt; font-family: 宋体">文件夹包含以下文件</span><span style="font-size: 10pt; font-family: 'Courier New'">:</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">web.xml<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'">induction-demoapp.xml</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">以下</span><span style="font-size: 10pt; font-family: 'Courier New'">.jar</span><span style="font-size: 10pt; font-family: 宋体">文件在</span><span style="font-size: 10pt; font-family: 'Courier New'">WEB-INF/lib</span><span style="font-size: 10pt; font-family: 宋体">中</span><span style="font-size: 10pt; font-family: 'Courier New'">:</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">acciente-induction-1.x.xb.jar<br />
acciente-commons-1.x.xb.jar</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">最后</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">以下工具</span><span style="font-size: 10pt; font-family: 'Courier New'">jar</span><span style="font-size: 10pt; font-family: 宋体">包也同样在</span><span style="font-size: 10pt; font-family: 'Courier New'">WEB-INF/lib</span><span style="font-size: 10pt; font-family: 宋体">中</span><span style="font-size: 10pt; font-family: 'Courier New'">:</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">apache-bcel-5.2.jar<br />
apache-commons-collections-3.2.1.jar<br />
apache-commons-digester-1.8.jar<br />
apache-commons-fileupload-1.2.1.jar<br />
apache-commons-io-1.4.jar<br />
apache-commons-logging-1.1.1.jar<br />
apache-freemarker-2.3.12.jar</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">这些</span><span style="font-size: 10pt; font-family: 'Courier New'">.jar</span><span style="font-size: 10pt; font-family: 宋体">文件分别来自于这些工程</span><span style="font-size: 10pt; font-family: 'Courier New'">:<a href="http://commons.apache.org/"><span style="color: blue">Apache Commons</span></a></span><span style="font-size: 10pt; font-family: 宋体">库和</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://jakarta.apache.org/bcel/"><span style="color: blue">Apache BCEL</span></a></span><span style="font-size: 10pt; font-family: 宋体">库来自</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://www.apache.org/"><span style="color: blue">Apache Software Foundation</span></a>. <a href="http://freemarker.sourceforge.net/"><span style="color: blue">Freemarker</span></a></span><span style="font-size: 10pt; font-family: 宋体">库源自</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://www.visigoths.org/"><span style="color: blue">Visigoth Software Society</span></a>.</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">我们主意到应用程序类的代码</span><span style="font-size: 10pt; font-family: 'Courier New'">(</span><span style="font-size: 10pt; font-family: 宋体">在这里</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">就是单个</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller</span><span style="font-size: 10pt; font-family: 宋体">类</span><span style="font-size: 10pt; font-family: 'Courier New'">)</span><span style="font-size: 10pt; font-family: 宋体">没有存储在</span><span style="font-size: 10pt; font-family: 'Courier New'">.war</span><span style="font-size: 10pt; font-family: 宋体">文件中</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">相反</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">我们会在应用程序的配置文件</span><span style="font-size: 10pt; font-family: 'Courier New'">induction-demoapp.xml</span><span style="font-size: 10pt; font-family: 宋体">中指明编译后</span><span style="font-size: 10pt; font-family: 'Courier New'">.class</span><span style="font-size: 10pt; font-family: 宋体">文件的位置</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">不管我们什么时候重新编译一个应用程序类</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">下一次访问这个类的时候</span><span style="font-size: 10pt; font-family: 'Courier New'">,Induction</span><span style="font-size: 10pt; font-family: 宋体">会检测出</span><span style="font-size: 10pt; font-family: 'Courier New'">class</span><span style="font-size: 10pt; font-family: 宋体">文件发生了变化</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">然后</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span><span style="font-size: 10pt; font-family: 宋体">热部署</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span><span style="font-size: 10pt; font-family: 宋体">到</span><span style="font-size: 10pt; font-family: 'Courier New'">JVM</span><span style="font-size: 10pt; font-family: 宋体">中</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">因此</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">当我们修改或者编译应用程序类的时候</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">没有必要去重新创建或者重新部署</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">同样也支持将应用程序类放到</span><span style="font-size: 10pt; font-family: 'Courier New'">.war</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">/WEB-INF/classes</span><span style="font-size: 10pt; font-family: 宋体">下</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">或者将</span><span style="font-size: 10pt; font-family: 'Courier New'">.jar</span><span style="font-size: 10pt; font-family: 宋体">放到</span><span style="font-size: 10pt; font-family: 'Courier New'">/WEB-INF/lib</span><span style="font-size: 10pt; font-family: 宋体">下</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">或者</span><span style="font-size: 10pt; font-family: 'Courier New'">Tomcat</span><span style="font-size: 10pt; font-family: 宋体">可以找到的</span><span style="font-size: 10pt; font-family: 'Courier New'">classpath</span><span style="font-size: 10pt; font-family: 宋体">下的其他任何位置</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">不过在开发中</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">我们推荐将应用程序类放在</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包外面</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">这样可以通过</span><span style="font-size: 10pt; font-family: 'Courier New'">class</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span><span style="font-size: 10pt; font-family: 宋体">热重载</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span><span style="font-size: 10pt; font-family: 宋体">来提高生产率</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">如果有必要的话，应用程序类可以重新打包成</span><span style="font-size: 10pt; font-family: 'Courier New'">.war</span><span style="font-size: 10pt; font-family: 宋体">文件用于传递</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">接下来</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">我们来看看</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包里面的内容</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">首先来看看</span><span style="font-size: 10pt; font-family: 'Courier New'">web.xml.</span><span style="font-size: 10pt; font-family: 宋体">我们在</span><span style="font-size: 10pt; font-family: 'Courier New'">web.xml</span><span style="font-size: 10pt; font-family: 宋体">中所需要做的就是定义</span><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">dispatcher servlet</span><span style="font-size: 10pt; font-family: 宋体">去处理对应用程序的请求</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://java.sun.com/xml/ns/javaee<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version="2.5"&gt;<br />
&nbsp;&nbsp; &lt;description&gt;DemoApp&lt;/description&gt;<br />
<br />
&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;demoapp&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.acciente.induction.dispatcher.HttpDispatcher&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;demoapp&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&lt;/web-app&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">我们再来看看</span><span style="font-size: 10pt; font-family: 'Courier New'">induction-demoapp.xml</span><span style="font-size: 10pt; font-family: 宋体">的内容</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">假设我们编译后的应用程序类是放在</span><span style="font-size: 10pt; font-family: 'Courier New'">c:/project/demoapp/classes</span><span style="font-size: 10pt; font-family: 宋体">目录下</span><span style="font-size: 10pt; font-family: 'Courier New'">,induction-demoapp.xml</span><span style="font-size: 10pt; font-family: 宋体">的内容就是</span><span style="font-size: 10pt; font-family: 'Courier New'">:</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&lt;!-- this file contains the configuration for the Induction dispatcher --&gt;<br />
&lt;config&gt;<br />
&lt;!-- The following section allows you to specify locations from which<br />
Induction will automatically reload a class if the file has changed --&gt;<br />
&lt;java-class-path&gt;<br />
&lt;compiled-directory&gt;<br />
&lt;directory&gt;c:/project/demoapp/classes&lt;/directory&gt;<br />
&lt;/compiled-directory&gt;<br />
&lt;/java-class-path&gt;<br />
&lt;/config&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">创建好上面所描述的</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包后</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">部署到</span><span style="font-size: 10pt; font-family: 'Courier New'">Tomcat</span><span style="font-size: 10pt; font-family: 宋体">中</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">现在</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">我们可以开始运行我们的应用程序了</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p><span style="font-size: 10pt; color: red; font-family: 'Courier New'">Running the application</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 宋体">假设</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Tomcat</span><span style="font-size: 10pt; color: black; font-family: 宋体">运行在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">localhost:8080,war</span><span style="font-size: 10pt; color: black; font-family: 宋体">包的名字是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">induction-demo.war,</span><span style="font-size: 10pt; color: black; font-family: 宋体">在浏览器中输入以下</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">URL:</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/"><span style="color: blue">http:</span></a><a href="http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/"><span style="color: blue">//localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/</span></a></span></p>
<p><span style="font-size: 10pt; font-family: 宋体">你会在浏览器输出界面看到字符串</span><span style="font-size: 10pt; font-family: 'Courier New'">:<br />
</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'"><tt>Hello World, using a simple println()</tt><br />
<br />
<span style="color: red">Controlling the URL resolution</span></span></p>
<p><span style="font-size: 10pt; font-family: 宋体">现在我们来进一步的看下用来运行</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/"><span style="color: blue">URL:http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/</span></a>.</span><span style="font-size: 10pt; font-family: 宋体">第一部分</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://localhost:8080/induction-demo"><span style="color: blue">http://localhost:8080/induction-demo</span></a></span><span style="font-size: 10pt; font-family: 宋体">通过</span><span style="font-size: 10pt; font-family: 'Courier New'">Tomcat</span><span style="font-size: 10pt; font-family: 宋体">指向</span><span style="font-size: 10pt; font-family: 'Courier New'">dispatcher servlet,</span><span style="font-size: 10pt; font-family: 宋体">也就是说这一部分是与</span><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">无关的</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">通过</span><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">处理的</span><span style="font-size: 10pt; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; font-family: 宋体">部分是</span><span style="font-size: 10pt; font-family: 'Courier New'">/demoapp/helloworld1_app/HelloWorldController/.</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">把</span><span style="font-size: 10pt; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; font-family: 宋体">分解成完整的</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller</span><span style="font-size: 10pt; font-family: 宋体">类和方法名</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">把</span><span style="font-size: 10pt; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; font-family: 宋体">转换成</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller</span><span style="font-size: 10pt; font-family: 宋体">的类名和方法名</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">是通过</span><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">ControllerResolver</span><span style="font-size: 10pt; font-family: 宋体">类口完成的</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">当开发者没有指定一个定制的</span><span style="font-size: 10pt; font-family: 'Courier New'">Controller resolver</span><span style="font-size: 10pt; font-family: 宋体">时</span><span style="font-size: 10pt; font-family: 'Courier New'">,Induction</span><span style="font-size: 10pt; font-family: 宋体">会默认使用一个相当简单的</span><span style="font-size: 10pt; font-family: 'Courier New'">controller resolver.</span><span style="font-size: 10pt; font-family: 宋体">默认的</span><span style="font-size: 10pt; font-family: 'Courier New'">controller resolver</span><span style="font-size: 10pt; font-family: 宋体">是这么工作的</span><span style="font-size: 10pt; font-family: 'Courier New'">:</span><span style="font-size: 10pt; font-family: 宋体">分析路径</span><span style="font-size: 10pt; font-family: 'Courier New'">/demoapp/helloworld1_app/HelloWorldController/,</span><span style="font-size: 10pt; font-family: 宋体">把第一个</span><span style="font-size: 10pt; font-family: 'Courier New'">'/'</span><span style="font-size: 10pt; font-family: 宋体">到最后一个</span><span style="font-size: 10pt; font-family: 'Courier New'">'/'</span><span style="font-size: 10pt; font-family: 宋体">之间的内容作为完整的类名</span><span style="font-size: 10pt; font-family: 'Courier New'">(/demoapp/helloworld1_app/HelloWorldController/</span><span style="font-size: 10pt; font-family: 宋体">就是对应到</span><span style="font-size: 10pt; font-family: 'Courier New'">demoapp.helloworld1_app.HelloWorldController).</span><span style="font-size: 10pt; font-family: 宋体">最后一个</span><span style="font-size: 10pt; font-family: 'Courier New'">'/'</span><span style="font-size: 10pt; font-family: 宋体">后所有的内容作为方法名</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">在我们的例子中</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">最后一个</span><span style="font-size: 10pt; font-family: 'Courier New'">'/'</span><span style="font-size: 10pt; font-family: 宋体">后没有任何字符串</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">因此默认的</span><span style="font-size: 10pt; font-family: 'Courier New'">resolver</span><span style="font-size: 10pt; font-family: 宋体">会使用一个隐性的方法名</span><span style="font-size: 10pt; font-family: 'Courier New'">(</span><span style="font-size: 10pt; font-family: 宋体">默认的</span><span style="font-size: 10pt; font-family: 'Courier New'">resolver</span><span style="font-size: 10pt; font-family: 宋体">使用</span><span style="font-size: 10pt; font-family: 'Courier New'">"handler"</span><span style="font-size: 10pt; font-family: 宋体">作为隐性的方法名</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">不过可以在</span><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">的配置文件中进行修改</span><span style="font-size: 10pt; font-family: 'Courier New'">).</span></p>
<p><span style="font-size: 10pt; color: red; font-family: 'Courier New'">Dynamic reloading</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">我们来找点乐子</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">修改一下</span><span style="font-size: 10pt; font-family: 'Courier New'">controller</span><span style="font-size: 10pt; font-family: 宋体">中打印的字符串的值</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">编译后重新刷新你的浏览器</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">你会发现修改起了作用</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">不必再经过</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span><span style="font-size: 10pt; font-family: 宋体">创建</span><span style="font-size: 10pt; font-family: 'Courier New'">war</span><span style="font-size: 10pt; font-family: 宋体">包</span><span style="font-size: 10pt; font-family: 'Courier New'">-&gt;</span><span style="font-size: 10pt; font-family: 宋体">重新部署</span><span style="font-size: 10pt; font-family: 'Courier New'">-&gt;</span><span style="font-size: 10pt; font-family: 宋体">等待</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span><span style="font-size: 10pt; font-family: 宋体">的过程了</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p><span style="font-size: 10pt; color: red; font-family: 'Courier New'">Conclusion</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">总结一下我们的指南</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span><span style="font-size: 10pt; font-family: 宋体">在指南中</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">我们讨论了一些关键的思想</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">在接下来的</span><span style="font-size: 10pt; font-family: 'Courier New'">view Tutorial</span><span style="font-size: 10pt; font-family: 宋体">中会介绍在</span><span style="font-size: 10pt; font-family: 'Courier New'">Induction</span><span style="font-size: 10pt; font-family: 宋体">中如何使用</span><span style="font-size: 10pt; font-family: 'Courier New'">views.Modles</span><span style="font-size: 10pt; font-family: 宋体">会在</span><span style="font-size: 10pt; font-family: 'Courier New'">Modles Tutorial</span><span style="font-size: 10pt; font-family: 宋体">中进行介绍</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
</span></span></span>
<img src ="http://www.blogjava.net/littleq/aggbug/219172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/littleq/" target="_blank">littleQ</a> 2008-07-31 22:17 <a href="http://www.blogjava.net/littleq/archive/2008/07/31/219172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Getting Started with Induction-翻译(1)</title><link>http://www.blogjava.net/littleq/archive/2008/07/30/218846.html</link><dc:creator>littleQ</dc:creator><author>littleQ</author><pubDate>Wed, 30 Jul 2008 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/littleq/archive/2008/07/30/218846.html</guid><wfw:comment>http://www.blogjava.net/littleq/comments/218846.html</wfw:comment><comments>http://www.blogjava.net/littleq/archive/2008/07/30/218846.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/littleq/comments/commentRss/218846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/littleq/services/trackbacks/218846.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p style="font-size: 10pt">欢迎使用Induction！Induction是使用java编程语言进行web应用开发的健壮高性能的框架。Induction属于基于请求的web框架，作为一个servlet部署在servlet容器中。Induction宣扬MVC的方法进行web应用开发。Induction的几个关键设计目标是： <br />
1.当modles，views和controllers发生变化时，消除对web应用程序必须重载的需求（我们相信一次简单的页面刷新就足够了） <br />
2.modles，views，controllers之间的绑定是声明式的，这种方式可以在任何IDE中都能被解析 <br />
3.使得数据跟踪在用户界面模板中可用（尤其是HTML模板） <br />
4.文件上传处理应该简单到很平凡的地步 <br />
5.在HTML表格中，数组（arrays）和字典类型（dictionary types ）的使用应该尽可能简单 <br />
6.明智的使用XML（在每个应用程序中，Induction只需要一个XML文件） <br />
7.是一种能够适应多种pattern应用的可扩充的架构 <br />
8.高性能 <br />
9.从JDK1.4到1.6都兼容（包括1.4和1.6） <br />
<br />
<span style="color: #8b0000">About this tutorial</span> <br />
这份指南的目的是让你更快的使用Induction。Induction需要一个servlet容器。在这份指南中，我们使用Apache的Tomcat，不过你可以选择使用任何服从标准的servlet容器。 <br />
<br />
<span style="color: #8b0000">Installing</span> <br />
我们假设你已经在c:/dev/Tomcat6安装了Tomcat6。Induction本身不需要任何的安装步骤，它的jar包可以很容易地引入到你的web应用程序中。 <br />
<br />
<span style="color: #8b0000">Writing our first application - hello world<br />
</span>在这份指南中，我们会写一个简单的"hello world"应用，在这个应用里我们会列举出Induction的许多重要概念。 <br />
<br />
<span style="color: #8b0000">Writing a controller</span> <br />
首先我们写一个controller作为我们指南的开始，因为controllers是web应用程序中一个典型的entry。好，现在让我们开始写一个controller，让它在浏览器中打印一串字符。</p>
<code>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;demoapp.helloworld1_app;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.acciente.induction.controller.Controller;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.acciente.induction.controller.Response;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_168_241_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_241_Open_Text.style.display='none'; Codehighlighter1_168_241_Closed_Image.style.display='inline'; Codehighlighter1_168_241_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_168_241_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_168_241_Closed_Text.style.display='none'; Codehighlighter1_168_241_Open_Image.style.display='inline'; Codehighlighter1_168_241_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_168_241_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_168_241_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;A&nbsp;very&nbsp;simple&nbsp;controller&nbsp;that&nbsp;does&nbsp;the&nbsp;customary&nbsp;"Hello&nbsp;World"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloWorldController&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Controller<br />
<img id="Codehighlighter1_299_494_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_494_Open_Text.style.display='none'; Codehighlighter1_299_494_Closed_Image.style.display='inline'; Codehighlighter1_299_494_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_299_494_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_299_494_Closed_Text.style.display='none'; Codehighlighter1_299_494_Open_Image.style.display='inline'; Codehighlighter1_299_494_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_299_494_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_299_494_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;handler(&nbsp;Response&nbsp;oReponse&nbsp;)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException<br />
<img id="Codehighlighter1_367_492_Open_Image" onclick="this.style.display='none'; Codehighlighter1_367_492_Open_Text.style.display='none'; Codehighlighter1_367_492_Closed_Image.style.display='inline'; Codehighlighter1_367_492_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_367_492_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_367_492_Closed_Text.style.display='none'; Codehighlighter1_367_492_Open_Image.style.display='inline'; Codehighlighter1_367_492_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_367_492_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_367_492_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oReponse.setContentType(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">text/plain</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oReponse.out().println(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World,&nbsp;using&nbsp;a&nbsp;simple&nbsp;println()</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
在我们运行这个controller之前，先仔细的看一下。首先我们注意到HelloWorldController类实现了Induction的Controller，Controller接口只是一个简单的标记接口，没有定义任何方法给它的实现类。当Induction接收到一个request请求后，激活一个Controller实现，比如HelloWorldController类，Induction首先核实这个类是否是实现Controller接口。因此目前Controller接口的存在的唯一理由是安全（主要考虑到Controller接口的可配置性）。因为Controller只是一个标记性接口，所以handler方法并不是接口定义的。 <br />
<br />
接下来，我们可以看到handler方法有一个Response参数，Response类是继承javax.servlet.http.HttpServletResponse接口，并简单的对servlet容器的response对象进行了封装。Induction通过注入的方式，将参数Response值传给handler方法。一些能够作为handler参数的值，也是通过自动注入的方式，只要它们是遵循以下类型： <br />
<table border="0">
    <tbody>
        <tr>
            <td><strong>Type</strong> </td>
            <td><strong>Description</strong> </td>
        </tr>
        <tr>
            <td><tt>Request</tt> </td>
            <td>facade to the servlet request, extends javax.servlet.http.HttpServletRequest </td>
        </tr>
        <tr>
            <td><tt>Response</tt> </td>
            <td>facade to the servlet response, extends javax.servlet.http.HttpServletResponse </td>
        </tr>
        <tr>
            <td><tt>Form</tt> </td>
            <td>provides access to the HTML form (if any) submitted with this request </td>
        </tr>
        <tr>
            <td><tt>ControllerResolver.Resolution</tt> </td>
            <td>provides access to the controller resolution object (very useful for writing generic parameterized controllers) </td>
        </tr>
        <tr>
            <td><tt>model_class_name</tt> </td>
            <td>instance of a user provided model class, the instance is managed to conform to a user specified lifecycle </td>
        </tr>
    </tbody>
</table>
<br />
上面的类名是不完整的，Request, Response和Form类的更多信息，在package com.acciente.induction.controller中查看。
<p>&nbsp;</p>
<p>原文地址：<a href="http://www.inductionframework.org/getting-started-tutorial.html">http://www.inductionframework.org/getting-started-tutorial.html</a></p>
<p>先翻译一部分放上来，后面的会尽快贴出。</p>
<p>翻译的不通畅的地方，请见谅~</p>
</code></div>
 <img src ="http://www.blogjava.net/littleq/aggbug/218846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/littleq/" target="_blank">littleQ</a> 2008-07-30 22:16 <a href="http://www.blogjava.net/littleq/archive/2008/07/30/218846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>