在我们运?/span>Controller之前Q必d其进行编译。我们可以?/span>javac或者Q?/span>IDEȝ?/span>Controller。接下来Q我们要?/span>Tomcat知道我们?/span>web应用E序。我们需要创Z?/span>war包,然后部v?/span>Tomcat中,q步只需要将war包拷贝到:/dev/Tomcat6/webapps目录下?/span>
我们?/span>.war文g中的/WEB-INF文g夹包含以下文?/span>:
web.xml
induction-demoapp.xml
以下.jar文g?/span>WEB-INF/lib?/span>:
acciente-induction-1.x.xb.jar
acciente-commons-1.x.xb.jar
最?/span>,以下工具jar包也同样?/span>WEB-INF/lib?/span>:
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
q些.jar文g分别来自于这些工E?/span>:Apache Commons库和Apache BCEL库来?/span>Apache Software Foundation. Freemarker库源?/span>Visigoth Software Society.
我们L到应用程序类的代?/span>(在这?/span>,是单个Controllerc?/span>)没有存储?/span>.war文g?/span>,相反,我们会在应用E序的配|文?/span>induction-demoapp.xml中指明编译后.class文g的位|?/span>.不管我们什么时候重新编译一个应用程序类,下一ơ访问这个类的时?/span>,Induction会检出class文g发生了变?/span>,然后"热部|?/span>"?/span>JVM?/span>.因此,当我们修Ҏ(gu)者编译应用程序类的时?/span>,没有必要去重新创建或者重新部|?/span>war?/span>.
Induction同样也支持将应用E序cL?/span>.war?/span>/WEB-INF/classes?/span>,或者将.jar攑ֈ/WEB-INF/lib?/span>,或?/span>Tomcat可以扑ֈ?/span>classpath下的其他M位置.不过在开发中,我们推荐应用程序类攑֜war包外?/span>,q样可以通过class?/span>"热重?/span>"来提高生产率.如果有必要的话,应用E序cd以重新打包成.war文g用于传?/span>.接下?/span>,我们来看?/span>war包里面的内容.
首先来看?/span>web.xml.我们?/span>web.xml中所需要做的就是定?/span>Induction?/span>dispatcher servletd理对应用E序的请?/span>.
<?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的内?/span>.假设我们~译后的应用E序cL攑֜c:/project/demoapp/classes目录?/span>,induction-demoapp.xml的内容就?/span>:
<!-- 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>
创徏好上面所描述?/span>war包后,部v?/span>Tomcat?/span>.现在,我们可以开始运行我们的应用E序?/span>.
Running the application
假设Tomcatq行?/span>localhost:8080,war包的名字?/span>induction-demo.war,在浏览器中输入以?/span>URL:
http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/
你会在浏览器输出界面看到字符?/span>:
Hello World, using a simple println()
Controlling the URL resolution
现在我们来进一步的看下用来q行Controller?/span>URL:http://localhost:8080/induction-demo/demoapp/helloworld1_app/HelloWorldController/.W一部分http://localhost:8080/induction-demo通过Tomcat指向dispatcher servlet,也就是说q一部分是与Induction无关?/span>.通过Induction处理?/span>URL部分?/span>/demoapp/helloworld1_app/HelloWorldController/.
Induction?/span>URL分解成完整的ControllercdҎ(gu)?/span>.?/span>URL转换?/span>Controller的类名和Ҏ(gu)?/span>,是通过Induction?/span>ControllerResolvercd完成?/span>.当开发者没有指定一个定制的Controller resolver?/span>,Induction会默认用一个相当简单的controller resolver.默认?/span>controller resolver是这么工作的:分析路径/demoapp/helloworld1_app/HelloWorldController/,把第一?/span>'/'到最后一?/span>'/'之间的内容作为完整的cd(/demoapp/helloworld1_app/HelloWorldController/是对应?/span>demoapp.helloworld1_app.HelloWorldController).最后一?/span>'/'后所有的内容作ؓҎ(gu)?/span>.在我们的例子?/span>,最后一?/span>'/'后没有Q何字W串,因此默认?/span>resolver会用一个隐性的Ҏ(gu)?/span>(默认?/span>resolver使用"handler"作ؓ隐性的Ҏ(gu)?/span>,不过可以?/span>Induction的配|文件中q行修改).
Dynamic reloading
我们来找点乐?/span>,修改一?/span>controller中打印的字符串的?/span>,~译后重新刷C的浏览器,你会发现修改起了作用.不必再经q?/span>"创徏war?/span>->重新部v->{待"的过E了.
Conclusion
ȝ一下我们的指南.在指南中,我们讨论了一些关键的思想,在接下来?/span>view Tutorial中会介绍?/span>Induction中如何?/span>views.Modles会在Modles Tutorial中进行介l?/span>.
Ƣ迎使用InductionQInduction是用java~程语言q行web应用开发的健壮高性能的框架。Induction属于Zh的web框架Q作Z个servlet部v在servlet容器中。Induction宣扬MVC的方法进行web应用开发。Induction的几个关键设计目标是Q? 原文地址Q?a >http://www.inductionframework.org/getting-started-tutorial.html 先翻译一部分放上来,后面的会快贴出?/p>
译的不通畅的地方,误谅~
1.当modlesQviews和controllers发生变化Ӟ消除对web应用E序必须重蝲的需求(我们怿一ơ简单的面hp够了Q?
2.modlesQviewsQcontrollers之间的绑定是声明式的Q这U方式可以在MIDE中都能被解析
3.使得数据跟踪在用L(fng)面模板中可用Q尤其是HTML模板Q?
4.文g上传处理应该单到很^凡的地步
5.在HTML表格中,数组QarraysQ和字典cdQdictionary types Q的使用应该可能简?
6.明智的用XMLQ在每个应用E序中,Induction只需要一个XML文gQ?
7.是一U能够适应多种pattern应用的可扩充的架?
8.高性能
9.从JDK1.4?.6都兼容(包括1.4?.6Q?
About this tutorial
q䆾指南的目的是让你更快的用Induction。Induction需要一个servlet容器。在q䆾指南中,我们使用Apache的TomcatQ不q你可以选择使用M服从标准的servlet容器?
Installing
我们假设你已l在c:/dev/Tomcat6安装了Tomcat6。Induction本n不需要Q何的安装步骤Q它的jar包可以很Ҏ(gu)地引入到你的web应用E序中?
Writing our first application - hello world
在这份指南中Q我们会写一个简单的"hello world"应用Q在q个应用里我们会列D出Induction的许多重要概c?
Writing a controller
首先我们写一个controller作ؓ我们指南的开始,因ؓcontrollers是web应用E序中一个典型的entry。好Q现在让我们开始写一个controllerQ让它在览器中打印一串字W?/p>
package demoapp.helloworld1_app;
import com.acciente.induction.controller.Controller;
import com.acciente.induction.controller.Response;
import java.io.IOException;
/**
* A very simple controller that does the customary "Hello World"
*/
public class HelloWorldController implements Controller
{
public void handler( Response oReponse ) throws IOException
{
oReponse.setContentType( "text/plain" );
oReponse.out().println( "Hello World, using a simple println()" );
}
}
在我们运行这个controller之前Q先仔细的看一下。首先我们注意到HelloWorldControllercdCInduction的ControllerQController接口只是一个简单的标记接口Q没有定义Q何方法给它的实现cR当Induction接收C个requesth后,ȀzM个Controller实现Q比如HelloWorldControllerc,Induction首先核实q个cL否是实现Controller接口。因此目前Controller接口的存在的唯一理由是安全(主要考虑到Controller接口的可配置性)。因为Controller只是一个标记性接口,所以handlerҎ(gu)q不是接口定义的?
接下来,我们可以看到handlerҎ(gu)有一个Response参数QResponsecLl承javax.servlet.http.HttpServletResponse接口Qƈ单的对servlet容器的response对象q行了封装。Induction通过注入的方式,参数ResponseglhandlerҎ(gu)。一些能够作为handler参数的|也是通过自动注入的方式,只要它们是遵循以下类型:
Type
Description
Request
facade to the servlet request, extends javax.servlet.http.HttpServletRequest
Response
facade to the servlet response, extends javax.servlet.http.HttpServletResponse
Form
provides access to the HTML form (if any) submitted with this request
ControllerResolver.Resolution
provides access to the controller resolution object (very useful for writing generic parameterized controllers)
model_class_name
instance of a user provided model class, the instance is managed to conform to a user specified lifecycle
上面的类名是不完整的QRequest, Response和Formcȝ更多信息Q在package com.acciente.induction.controller中查看?