代码改变世界

Wicket框架基础(一)

2009-04-22 09:32  乱世文章  阅读(1306)  评论(0编辑  收藏  举报

Wicket框架基础(一)

pizza Application Sample


Wicket是什么

Wicket是一个崭新的web框架,完全不同于strutsjsftapestry。目前它已经成为apache最有潜力的一个项目。

Wicket相关的IDE

Wicket有简单、学习曲线低、零配置等优点。我们完全可以不使用IDE来搭建一个wicket工程,但仍然推荐大家使用IDE+wicket插件来开发以提高生产率。

为什么选择NetBeans6.5

Wicket目前支持的IDE插件有:

目前Wicket Bench Eclipse中仍然存在一些问题。IntelliJ IdeA据说相当不错,但我没用过。所以只好选择NetBeans及其迄今为止最稳定的版本6.5

本文档需要的环境

  • NetBeans IDE 6.5
  • Java Standard Development Kit (JDK™) 5.0 版或 6.0
  • NetBeans IDE Wicket Support 插件

 

一、netbeans6.5中建立wickt应用程序

IDE的作用是提供友好界面以及减少工作量。在netbeans6.5中建立wickt项目的步骤如下:

1、      建立一个“web应用程序”。在选择服务器(如tomcat6.0)和javaEE版本(如5.0规范)之后,选择框架“wicket1.4

 

其中wicket1.4配置中各项配置的含义等同于web.xml中的filterfilter-mapping中的相应配置。以上图为例:

Wicket URL Pattern指明了当我们访问web应用的/wicket/*上下文时将由Wicket Servlet Name这个filter来处理请求。这个filterwicket框架中的一个重要的类WicketFilter。这个类主要作用是初始化context上下文(这个工作是自动的,程序员不需要管),加载init-param参数Wicket Application Class(即applicationClassName)指明的类(如Application,这个类名你可以任意改), 并调用该类的getHomePage方法。该方法仅仅是返回一个class对象,该class对象的类名由Wicket Home page参数指定(如:HomePage,如你想修改这个名字,需要修改这个方法)。

不用改变wicket1.4配置,点击“完成”。

2、      展开项目窗格中“源包”,可以看到生成了如下文件:

 

所有文件都位于一个com.myapp.wicket包下(包名可以在上图Main Package中设置)。其中Application.javagetHomePage()方法是应用的主入口(类似于应用程序中的Main函数),它其中只有一句:

 return HomePage.class

也就是HomePage.java这个源文件。

这里只有一个空的构造函数,这样的话页面上只会显示静态的HomePage.html文件中定义的内容:
  <link wicket:id='stylesheet'/>
  </head>
  <body>
    <span wicket:id='mainNavigation'/>
  </body>

光这样看,显然这个页面没有什么实际的内容去输出。然而需要注意这几个红色的地方,wicket:id这样的属性和标准的id属性相比,显然有些特殊的地方。实际上这只是两个占位符,当wicket项目重新生成后,wicket会用真正的有实际意义的html代码去根据一定规则填充它:

wicket中,每个页面会包含一个静态的html和一个同名的java文件,如HomePage.htmlHomePage.javaHeadPanel.htmlHeadPanel.java

在静态的html中,除了一些静态的html标签外,实际上还会有一些动态的内容。这些动态的内容表面上看是一些传统的html标签,如上面HomePage.html中的<link>标签<span>标签,这些标签的共同特征是:都有一个wicket:id属性。这些动态的内容在wicket程序中并不会形成真正的输出,而仅仅是一种占位符,而占位符的行为和输出,统统由跟html文件同名的java文件来控制。比如,HomePage.html中的动态内容(占位符)是由HomePage.java中的java代码控制的。如果我们要改变这些占位符的输出和行为,只能通过修改HomePage.java中的java代码来改变。

这种机制带来的好处是:在web应用开发过程中,工作一般会由美工人员和jsp程序员分担,美工负责静态内容,jsp程序员负责动态内容;把html代码和java代码分开后,二者的分工更明晰。美工负责修改html文件,而java程序员只需要负责java文件就好。

以上面的HomePage.html为例,有两个动态的内容(或占位符):

1)占位符stylesheet

2)占位符mainNavigation

然而在HomePage.java中,并没有任何代码控制这两个占位符(实际上除了一个空的构造函数外,HomePage.java中没有其他的代码)

但是,当我们运行这个程序(直接点工具栏上的运行按钮或按下F6键),发现实际上页面上是有输出内容的:

 

其实,这部分内容的输出虽然在HomePage.java中没有任何代码在输出,但别忘了,HomePage这个类继承自BasePage类,还可以在BasePage.java中进行输出:

add(new HeaderPanel("mainNavigation", Strings.afterLast(packageName, '.')));

add(new StyleSheetReference("stylesheet", BasePage.class, "style.css"));

这里,BasePage的构造函数中new了两个东西:一个HeaderPanel,一个StyleSheetReference

前者是一个自定义的复用组件(可以打开HeaderPanel.javaHeaderPanel.html查看这个组件的输出内容),后者则为BasePage的子类添加了一个外部样式表引用。这样作为继承自BasePageHomePage.java,虽然没有定义任何动态输出的内容,但仍然能够显示出一个HeaderPanel组件在页面上(因为extends BasePage)。而BasePage由于只有java文件没有html文件,所以只是用于继承而不能用于呈现。

3、      尽管到此为止,我们没有写任何一个代码就完成了一个能运行的wicket应用,然而我们仍然可以通过前面的的介绍的原理,很容易地进行自己的定制。比如,我们想让页面上的“Wicket Example”改变为:Hello World,而把”Start of wicket”中的”wicket”改成“我的第一个Wicket程序

首先,Wicket Example这段文字定义在HeaderPanel.html中,并且它是静态的内容(因为它没有Wicket:id属性):

<h1>Wicket Example</h1>

对于静态的内容,直接修改html文件就可以了。即把上面的html标签修改为:

<h1>Hello World</h1>

其次,”Start of wicket”中的”wicket”HeaderPanel.html中定义为动态内容(因为它使用了Wicket:id属性):

<span wicket:id="exampleTitle">Example Title Goes Here</span>

对于动态的内容,应该修改java文件,即修改HeaderPanel.java中的构造函数:

add(new Label("exampleTitle", exampleTitle));

改为

add(new Label("exampleTitle", “我的第一个Wicket程序”));

 

二、开发wicket重用组件

Wicket最大的好处之一就是支持“可重用组件”,而且wicket重用组建的开发可以说是相当的简单(跟Tapestry相比),几乎跟写一个普通的wicket页面没有什么区别。它也由一个 Java 端与一个 HTML 端构成。

在项目的“源包/com.myapp.wicket”上右击(注意,一定要在“源包”上右击,否则会出现“无启用的文件系统”错误),选择“新建àWicket Panel”,弹出如下窗口:

 

 

在文件名中填入组件名称:FooterPanel,则下面会提示wicket插件将以该名字自动生成如下两个文件:
FooterPanel.java

FooterPanel.html

 

点击“完成”。

首先我们来修改FooterPanel组件的html文件(当然我们也可以让专门的网页设计人员来做,这样组件的样式会更加美观),打开FooterPanel.html,把注释“<!-- TODO -->”部分修改为:

<span wicket:id="message">显示内容</span>

 

然后,打开FooterPanel.java,在构造函数最后面加上内容:

add(new Label("message", "可重用组件")); 

这样,我们就在页面idmessage的地方插入一个label(当然,如果你愿意也可以插入一个image或者其他的什么 )。

 

这样,我们的第一个简单的可重用wicket组件就完成了,接下来要在页面上来使用它。

 

打开HomePage.html,在body中添加一个占位符,idFooterPanel

 

同时,需要修改HomePage.java,在代码中为占位符FooterPanel真正的插入一个FooterPanel可重用组件:

 

F6,运行主项目,可以看到页面上呈现了我们的可重用组件:

 

如果想改变组件的样式,可修改组件的html文件:

<span>两端添加<h2>。重新部署,刷新页面,修改后的效果就可以看到。

 

 

<>

 

 

 

*参考文档《Wicket Web 框架简介》