德国开元华人社区 开元周游

标题: 一个简单的wicket例子 [打印本页]

作者: 有容乃大    时间: 9.4.2011 19:59
标题: 一个简单的wicket例子
本帖最后由 有容乃大 于 9.4.2011 21:13 编辑

Wicket应用至少需要一个Wicket Application


package com.mycompany;

import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;

public class SampleApplication extends WebApplication {

        @Override
        public Class<? extends Page> getHomePage() {
                return Index.class;
        }

}SampleApplication .java
Wicket的WebApplication比Java EE定义的Web应用的粒度更小,一个War包中可以对应多个Wicket的WebApplication(与传说中的CAR包有几分相似)。getHomePage方法指定了首页,一个类对应一个页面,所以Index.class就能表示一个页面资源。根据下面index页面的实现代码,就更能体会这一个类是如何对应到一个页面的。
package com.mycompany;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.link.Link;

public class Index extends WebPage {
        public Index(){
                add(new Link<String>("lnk1"){
                        @Override
                        public void onClick() {
                                 setResponsePage(FormSample.class);
                        }
                        
                });
        }
}


Index.java
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Wicket Sample</title>
</head>
<body>
    <a wicket:id="lnk1">Go to Form Sample</a>
</body>
</html>

Index.html
这两个文件就是作为首页需要的全部内容,默认配置下,这两个文件需要在同一个package内。html内的wicket:id="lnk1与java代码内的new Link<String>("lnk1")相对应,所有带wicket:id属性的标签,全部会被服务器端组件生成的内容替换。这里我们看到,java端有个onClick方法,这表示我们的link支持服务器端事件,点击后服务器端会执行onClick方法内的内容,重定向到FormSample页面。
接下来,我们再来看一下FormSample这页面,这个页面实现最简单的表单提交功能,在一个文件框内输入文字后提交,服务器端会把刚才输入的文字在一个span内打出来。
package com.mycompany;

import org.apache.wicket.IClusterable;

public class FormInputModel implements IClusterable {
        private static final long serialVersionUID = 5201088805280471789L;
        private String inputString;

        private String info;

        public String getInputString() {
                return inputString;
        }

        public void setInputString(String inputString) {
                this.inputString = inputString;
        }

        public void setInfo(String info) {
                this.info = info;
        }

        public String getInfo() {
                return info;
        }

}
FormInputModel.java

package com.mycompany;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;

public class FormSample extends WebPage {

        public FormSample() {
                add(new InputForm("form1"));
        }

        public static class InputForm extends Form<FormInputModel> {

                public InputForm(String id) {
                        super(id, new CompoundPropertyModel<FormInputModel>(new FormInputModel()));
                        add(new TextField<String>("inputString").setRequired(true).setLabel(new Model<String>()));
                        add(new Label("info"));
                        add(new Button("saveButton"));
                }

                @Override
                public void onSubmit() {
                        FormInputModel model = (FormInputModel) getDefaultModelObject();
                        model.setInfo(model.getInputString());
                }

        }
}


FormSample.java
<html xmlns="http://www.w3.org/1999/xhtml" ><head>    <title>Wicket Examples - helloworld</title>    <link rel="stylesheet" type="text/css" href="style.css"/></head><body>    <form wicket:id="form1">            <input wicket:id="inputString" type="text" />            <br />            <span wicket:id="info"></span>            <br />            <input wicket:id="saveButton" type="submit" value="submit" />    </form></body></html>
FormSample.html
这里的Form需要一个Model,具体与Form里的字段对应,在这个Form里面,有inputString,info共两个字段,所以我们的model也是这么简单的一个Bean。Form提交的时候,同样也是服务器端事件:由onSubmit这个方法来处理。处理也很简单,只需要修改一个Model的值。
最近,怎么把这些代码组成一个Wicket应用呢?看一下web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"        version="2.4">        <display-name>Wicket Examples</display-name>        <filter>                <filter-name>WicketExampleApplication</filter-name>                <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>                <init-param>                        <param-name>applicationClassName</param-name>                        <param-value>com.mycompany.SampleApplication</param-value>                </init-param>        </filter>        <filter-mapping>                <filter-name>WicketExampleApplication</filter-name>                <url-pattern>/examples/*</url-pattern>                <dispatcher>REQUEST</dispatcher>                <dispatcher>INCLUDE</dispatcher>        </filter-mapping>        <session-config>                <session-timeout>5</session-timeout>        </session-config>        <welcome-file-list>                <welcome-file>index.html</welcome-file>        </welcome-file-list></web-app>一个Wicket的WebApplication有一个Filter来处理,如果有多个就可以配置多个。这里其实也可以有用Servlet,用Filter可以实现更强大的功能
最后,整个project是如下的一个目录结构:
myproject
│  pom.xml

├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─mycompany
│  │  │              FormInputModel.java
│  │  │              FormSample.html
│  │  │              FormSample.java
│  │  │              Index.html
│  │  │              Index.java
│  │  │              SampleApplication.java
│  │  │
│  │  ├─resources
│  │  └─webapp
│  │      └─WEB-INF
│  │              web.xml
│  │
│  └─test
│      ├─java
│      └─resources
└─target






欢迎光临 德国开元华人社区 开元周游 (https://forum.kaiyuan.de/) Powered by Discuz! X3.2