欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Wicket用户手册一:Hello World wicketServletWebHTML浏览器 

程序员文章站 2022-07-15 15:28:17
...

第一个程序

接下来要做的程序就是那个人人耳熟能祥的"Hello World"(译注 :姜还是老的辣,原来外国人也好这一口 )。这个程序将给客户端输出一个简单的页面,页面上只显示"Hello,World"这个字符串。第二个程序中,允许用户在浏览器端进行输入,然后根据输入再在页面上给出相应的输出信息,不过那是后话。

这个程序将在浏览器输出以下HTML:

 <html>   <body>       Hello, world!   </body> </html>  

模板HTML

麻雀虽小,五脏俱全,程序尽管简单,但一样不少。在这个程序中,我们使用Wicket提供的一个叫做"Label"的控件来输出"Hello,World"这个字符串。这个程序包括两方面内容:

  1. HTML页面模板 
  2. Label控件
  3. 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程序了。如果有问题,可以在文章下面提出问题,我会尽量回答。