Deploying the application
在我們運行Controller之前,必須對其進行編譯。我們可以使用javac或者任何IDE去編譯Controller。接下來,我們要讓Tomcat知道我們的web應用程序。我們需要創建一個war包,然后部署到Tomcat中,這步只需要將war包拷貝到:/dev/Tomcat6/webapps目錄下。
我們的.war文件中的/WEB-INF文件夾包含以下文件:
web.xml
induction-demoapp.xml
以下.jar文件在WEB-INF/lib中:
acciente-induction-1.x.xb.jar
acciente-commons-1.x.xb.jar
最后,以下工具jar包也同樣在WEB-INF/lib中:
apache-bcel-5.2.jar
apache-commons-collections-3.2.1.jar
apache-commons-digester-1.8.jar
apache-commons-fileupload-1.2.1.jar
apache-commons-io-1.4.jar
apache-commons-logging-1.1.1.jar
apache-freemarker-2.3.12.jar
這些.jar文件分別來自于這些工程:Apache Commons庫和Apache BCEL庫來自Apache Software Foundation. Freemarker庫源自Visigoth Software Society.
我們主意到應用程序類的代碼(在這里,就是單個Controller類)沒有存儲在.war文件中,相反,我們會在應用程序的配置文件induction-demoapp.xml中指明編譯后.class文件的位置.不管我們什么時候重新編譯一個應用程序類,下一次訪問這個類的時候,Induction會檢測出class文件發生了變化,然后"熱部署"到JVM中.因此,當我們修改或者編譯應用程序類的時候,沒有必要去重新創建或者重新部署war包.
Induction同樣也支持將應用程序類放到.war的/WEB-INF/classes下,或者將.jar放到/WEB-INF/lib下,或者Tomcat可以找到的classpath下的其他任何位置.不過在開發中,我們推薦將應用程序類放在war包外面,這樣可以通過class的"熱重載"來提高生產率.如果有必要的話,應用程序類可以重新打包成.war文件用于傳遞.接下來,我們來看看war包里面的內容.
首先來看看web.xml.我們在web.xml中所需要做的就是定義Induction的dispatcher servlet去處理對應用程序的請求.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<description>DemoApp</description>
<servlet>
<servlet-name>demoapp</servlet-name>
<servlet-class>com.acciente.induction.dispatcher.HttpDispatcher</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demoapp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
我們再來看看induction-demoapp.xml的內容.假設我們編譯后的應用程序類是放在c:/project/demoapp/classes目錄下,induction-demoapp.xml的內容就是:
<!-- this file contains the configuration for the Induction dispatcher -->
<config>
<!-- The following section allows you to specify locations from which
Induction will automatically reload a class if the file has changed -->
<java-class-path>
<compiled-directory>
<directory>c:/project/demoapp/classes</directory>
</compiled-directory>
</java-class-path>
</config>
創建好上面所描述的war包后,部署到Tomcat中.現在,我們可以開始運行我們的應用程序了.
Running the application
假設Tomcat運行在localhost:8080,war包的名字是induction-demo.war,在瀏覽器中輸入以下URL:
http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/
你會在瀏覽器輸出界面看到字符串:
Hello World, using a simple println()
Controlling the URL resolution
現在我們來進一步的看下用來運行Controller的URL:http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/.第一部分http://localhost:8080/induction-demo通過Tomcat指向dispatcher servlet,也就是說這一部分是與Induction無關的.通過Induction處理的URL部分是/demoapp/helloworld1_app/HelloWorldController/.
Induction把URL分解成完整的Controller類和方法名.把URL轉換成Controller的類名和方法名,是通過Induction的ControllerResolver類口完成的.當開發者沒有指定一個定制的Controller resolver時,Induction會默認使用一個相當簡單的controller resolver.默認的controller resolver是這么工作的:分析路徑/demoapp/helloworld1_app/HelloWorldController/,把第一個'/'到最后一個'/'之間的內容作為完整的類名(/demoapp/helloworld1_app/HelloWorldController/就是對應到demoapp.helloworld1_app.HelloWorldController).最后一個'/'后所有的內容作為方法名.在我們的例子中,最后一個'/'后沒有任何字符串,因此默認的resolver會使用一個隱性的方法名(默認的resolver使用"handler"作為隱性的方法名,不過可以在Induction的配置文件中進行修改).
Dynamic reloading
我們來找點樂子,修改一下controller中打印的字符串的值,編譯后重新刷新你的瀏覽器,你會發現修改起了作用.不必再經過"創建war包->重新部署->等待"的過程了.
Conclusion
總結一下我們的指南.在指南中,我們討論了一些關鍵的思想,在接下來的view Tutorial中會介紹在Induction中如何使用views.Modles會在Modles Tutorial中進行介紹.