Wicket用户手册一:Hello World wicketServletWebHTML浏览器
第一个程序
接下来要做的程序就是那个人人耳熟能祥的"Hello World"(译注 :姜还是老的辣,原来外国人也好这一口 )。这个程序将给客户端输出一个简单的页面,页面上只显示"Hello,World"这个字符串。第二个程序中,允许用户在浏览器端进行输入,然后根据输入再在页面上给出相应的输出信息,不过那是后话。
这个程序将在浏览器输出以下HTML:
<html> <body> Hello, world! </body> </html>
模板HTML
麻雀虽小,五脏俱全,程序尽管简单,但一样不少。在这个程序中,我们使用Wicket提供的一个叫做"Label"的控件来输出"Hello,World"这个字符串。这个程序包括两方面内容:
- HTML页面模板
- Label控件
- Wicket程序的开发步骤
考虑到简化程序的开发,易于理解,所以在这个例子中没有使用样式表或其它HTML元素,开发人员可以根据自己的需要加入CSS样式表,也可以使用JavaScript。但对于我们的第一个Wicket程序,我们尽量的省略掉这些元素。
模板中有部分内容只是用来给设计人员看的(译注:因为设计人员一般都使用可视化设计工具,如果都为空,或者使用标签,设计人员就无法查看直接效果,这也是Wicket的一个优点),以便理解模板文件( 译注:如Message goes here,设计人员或者开发人员也可以在这个地方加上注释,便于理解),因为这些内容在最终输出到浏览器时会自动省略到这些内容,所以不会影响最终客户的浏览内容。为了让Wicket框架能正确的输出内容,你必须告诉Wicket框架,哪些控件是需要动态输出信息。接下来会告诉如何使用Label控件,以及在Wicket中如何定义这样一个控件。
<html> <body> <span wicket:id="message">Message goes here</span> </body></html>
我们使用HTML中的span元素,并加入wicket:id属性将自己标记为一个需要Wicket处理的控件(译注:其实也可以使用 其它方式来指定一个Wicket控件,如id="wicket-message"等,以后会有相关的文档专门讨论这个问题)。
仅有这样一个HTML模板还不足以输出我们的"Hello,World",我们仍然需要有一个Java对象来告诉Wicket如何输出这些信息,以及所要输出的信息。接下来我们将要编写这段Java代码。
Java代码
开发一个Wicket程序,需要完成两个任务,编写一个模板文件,另外再写一个Java类负责控件的输出。在这个例子中,我们只需要负责控制一个Label控件来输出"Hello,World"。
首先我们要写一个继承WebPage的类,以便负责控件的输出。在Wicket中,所有的的Web页面都继承WebPage这个类,Wicke使用规则匹配方式在模板文件和类自动进行,比如说对于com.wicket.demo.hello.IndexPage这个类,Wicket会自动在com.wicket.demo.hello这个包下面查找IndexPage.html这个HTML文件自动进行匹配。(译注:用户可以定制这个规则,我会在以后的文章里进行描述),这样做对于初学者而言可能有点奇怪。不过基于规则的东西,其实要比使用XML文件更容易理解,也容易维护(译注:象我现在对这种规则习惯了,在大街上看到美女,就习惯性的在她身边找她男朋友,如果没有,咱就给她配置一个)。这样实现了HTML和Java的分离,对于这样一个基于控件开发的框架而言,这样可以实现更好的控件的复用(也有利于设计人员和开发人员的分工)。
import wicket.markup.html.WebPage;import wicket.markup.html.basic.Label;public class HelloWorld extends WebPage{ public HelloWorld() { add(new Label("message", "Hello World!")); }}
当你添加一个控件时候,与普通的桌面程序有一点不同,那就是你需要以字符串的方式来指定一个ID号,用作唯一标识,Wicket就根据这个ID号将模板文件中的控件与Java文件中的控件进行匹配。因为要和HTML模板文件中的wicket:id对应,所以不能重复。
当Wicket处理页面,进行输出的时候,就会根据这个ID号在类查找相应的控件,并将输出的内容来替换模板中相同ID号指定控件的输出内容。就象上面指定了一个ID号为"message"的Label控件,并将Label控件输出的内容(即"Hello,World")替换原有的内容(即"Message goes here")。
<span wicket:id="message">Message goes here</span>
除了一个标识身份的ID号以外,控件还必须有一个Model,至于使用什么样的Model,就由控件自己(也可以由程序员)决定。在上面例子中,Model的内容(即字符串"Hello World")用来替换span标签中的值。如果要定制自己的Model,就必须实现wicket.model.IModel接口。大部分的控件都中提供了使用Model参数的构造函数。至于Label控件,则提供了使用字符串的构造函数,其实在构造函数内部,Label仍然将字符串转换成了一个简单的Model.
通常Model用来为控件提供灵活性,也就是说控件只处理显示内容,而Model就可以通过各种方式来提供所要显示的内容,这样减少了控件的变化,从而有利于控件的开发,维护 和使用 。
如果要运行这个程序,我们仍然还需要完成一个Application对象,这个Application对象在系统中主要管理配置,这个类的代码将如下所示:
package mypackage;import wicket.protocol.http.WebApplication;public class HelloWorldApplication extends WebApplication{ public HelloWorldApplication() { getPages().setHomePage(HelloWorld.class); }}
使用web.xml配置Web程序
为了能够让Java服务器能够运行你的程序,你需要通过Web.xml文件配置系统。配置的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><servlet> <servlet-name>HelloWorldApplication</servlet-name> <servlet-class>wicket.protocol.http.WicketServlet</servlet-class> <init-param> <param-name>applicationClassName</param-name> <param-value>mypackage.HelloWorldApplication</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>HelloWorldApplication</servlet-name> <url-pattern>/helloworld/*</url-pattern></servlet-mapping></web-app>
现在你就可以尝试运行你的第一个Wicket程序了。如果有问题,可以在文章下面提出问题,我会尽量回答。
上一篇: 使用FlexPaper加载swf出现无法加载的问题
下一篇: java 重定向和转发的区别