Search results The results is only based on Apollo89.com
2 posts are related to 'Wicket'
  1. 2009/02/10 웹 프레임워크의 비교 : Wicket
  2. 2009/02/10 Wicket Features
웹 프레임워크의 비교 : Wicket posted on 2009/02/10 13:17, filed under Develop
원문 : http://javageek.org/2006/03/08/comparing_web_frameworks_wicket.html
         http://javageek.org/2006/03/14/migrating_wicket_example_to_wicket_1_2_beta_1.html

Wicket 이란 무엇인가? 아래는 Wicket 사이트에서 인용한 설명이다.
Wicket 은 단순함(Simplicity)과 계층화(Separation of Concerns)되어 있고 완전히 새로운 수준으로 개발을 용이하게 해주는 자바 웹 어플리케이션 프레임워크이다. Wicket 페이지는 일반적인 WYSIWYG HTML 툴을 사용하여 작성할 수 있다. 동적인 컨텐츠 처리와 폼 처리는 여러분이 좋아하는 기술을 사용하여 쉽게 영속화될 수 있는 POJO 데이터 빈에 의한 컴포넌트 모델을 사용하여 모두 자바 코드 내에서 이루어진다.
Wicket 은 컴포넌트(웹을 위한 Swing의 JComponent를 생각하라)를 사용하여 프론트엔드의 비쥬얼 디자인(HTML)을 백엔드 어플리케이션 로직(Java)으로부터 분리한다. 또 다른 MVC 프레임워크가 되는 대신에 Wicket은 전통적인 GUI와 같은 이벤트 기반의 프레임워크에 더 가깝다. 각 '컴포넌트'를 HTML 코드로 이루어진 'view' 파트를 갖고 있는 작은 MVC로 볼 수 있다. 잠시 후에 알게되겠지만, JSP처럼 페이지에 로직이 섞이는 것이 아니라 모든 어플리케이션 로직은 자바 클래스 안에 들어간다(진정한 연관의 분리). 자바코드는 대부분의 어떤 HTML 태그에도 사용될 수 있는 특별한 wicket:id 속성을 사용하여 HTML 페이지에 합쳐진다. wicket:id 는 Wicket 에게 그 태그에 컴포넌트를 렌더링할 것을 알려준다. Wicket은 컴포넌트에 id를 설정함으로써 웹페이지에 유니크하게 정의되는 Label, Link, List 등과 같은 컴포넌트와 모델에 의해 표현되는 컨텐츠를 가지고 있다.

자 이제 우리의 예제에 대해 얘기할 시간이다. 우리는 3페이지를 표시하는 어플리케이션을 만들려고 한다. 하나는 블로그 목록을 보여주는 Home Page, 또 하나는 각 블로그의 상세 내용을 보여주는 Blog Detail Page, 그리고 유저가 유효하지 않은 페이지(유효하지 않은 블로그 엔트리)에 접근하려고 할 때 보여질 특별한 Page Not Found 페이지이다.

Wicket 을 사용하기 위해서는 몇가지 요구사항이 있다. 주요한 요구사항의 한가지는 여러분의 웹 어플리케이션은 WebApplication 클 래스를 확장한 클래스를 가져야 한다는 것이다. 이것은 Wicket을 다른 프레임워크와 다르게 하는 시작점이다. 내가 본 대부분의 다른 웹 프레임워크는 "XML에 매여있다." 페이지와 상호작용을 정의하기 위해 여러분은 하나 또는 그 이상의 XML 파일을 작성해야한다. Struts에서 여러분은 최소한 struts-config.xml 파일을 작성해야 하고, 만약 Tiles를 사용한다면 또 다른 XML 설정 파일을 필요로 한다. JSF는 faces-config.xml을 작성해야 한다. XML을 사용하는 것이 잘못된 것은 아니지만, 이러한 접근방법은 여러분의 로직을 여러 곳으로 흐트러놓고, 이것은 작업을 하기에 좀 더 곤란하게 만든다. 여러분이 Wicket을 사용한다면 정말로 수정해야할 필요가 있는 XML 파일은 오직 web.xml  하나 밖에 없다. 그리고 이것은 Wicket만의 요구사항이 아니라 서블릿 스펙의 요구사항이다.

그래서, 우리의 예제 어플리케이션을 다룰 서블릿을 정의하기 위해 web.xml 에 다음을 추가한다.

    <servlet>
        <servlet-name>blog</servlet-name>
        <servlet-class>wicket.protocol.http.WicketServlet</servlet-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>org.javageek.wicket.BlogApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>blog</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>


보는 바와 같이 WicketServlet 서블릿을 정의하고, 초기화 파라미터는 WebApplication 을 확장하는 클래스의 완전한 classpath이다. 그것은 우리의 메인 어플리케이션 클래스인 BlogApplication 이다. 아래는 BlogApplication 클래스의 코드이다.

package org.javageek.wicket;

import wicket.Application;
import wicket.protocol.http.WebApplication;
import wicket.settings.IMarkupSettings;
import domain.Blog;
import domain.BlogService;


public class BlogApplication extends WebApplication {

    private BlogService blogService = new BlogService();

    public BlogApplication() {}
 

    public static final BlogApplication instance() {
        return (BlogApplication) Application.get();
    }


    public Blog getBlog() {
        return blogService.getBlog();
    }


    public Class getHomePage() {
        return Index.class;
    }


    protected void init() {
        IMarkupSettings markupSettings = getMarkupSettings();
        configure(DEVELOPMENT);
        markupSettings.setStripWicketTags(true);
        markupSettings.setDefaultMarkupEncoding("UTF-8");
        markupSettings.setStripXmlDeclarationFromOutput(false);


        mountBookmarkablePage("/index", Index.class);
        mountBookmarkablePage("/viewBlogEntry", ViewBlogEntry.class);
    }

}

코 드에서 보는 바와 같이 웹 어플리케이션 설정은 자바 코드의 init() 메소드 안에서 설정된다. 내가 사용한 이러한 설정의 대부분은 개발을 위한 것이어서 자세한 의미는 설명하지 않고 넘어가겠다. Wicket 의 Javadoc API를 참고하면 더 자세히 알 수 있다. 우리가 관심을 가져야할 주요한 코드는 굵은 글씨체로 나온 부분이다. 이것은 우리가 홈페이지(우리의 어플리케이션의 메인 페이지)로서 응답할 컴포넌트를 설정하는 부분이고, 우리의 홈페이지인 Index 클래스를 리턴하고 있다.

Wicket 페이지 컴포넌트는 WebPage 클래스를 확장해야한다. 따라서 우리의 모든 페이지는 WebPage 의 서브클래스가 될 것이다. 그러나, 모든 페이지가 일관되게 보이도록 하기 위해 WebPage 를 확장하는 추상 베이스 클래스를 정의하고 어플리케이션의 모든 페이지는 이 클래스를 확장하도록 할 것이다. BasePage 는 페이지에 공통된 컴포넌트들을 추가하는 매우 기본적인 클래스이다.

package org.javageek.wicket;

import domain.Blog;
import wicket.markup.html.WebPage;
import wicket.markup.html.basic.Label;


public abstract class BasePage extends WebPage {

    public BasePage() {
        Blog blog = getBlog();

        add(new Label("blogName", blog.getName()));
        add(new Label("blogDescription", blog.getDescription()));

    }

    public Blog getBlog() {
        return BlogApplication.instance().getBlog();
    }

}

여 기서부터 재미있는 부분이 시작된다. 보는 바와 같이, 난 단지 각각 id 스트링과 content를 가진 두개의 Label 컴포넌트를 추가했다. Wicket은 모든 컴포넌트에 대해 모델을 정의하지만 또한 Label을 위해 내가 사용한 것처럼 편리한 메소드를 제공한다. Wicket은 내가 파라미터로 보낸 스트링을 모델 객체로 감쌀 것이다. 따라서 난 Label과 같이 매우 간단한 정적인 컴포넌트의 경우에 대해 걱정할 필요가 없다. 페이지 클래스가 인스턴스화 된 후에 Label 컴포넌트는 내가 각각의 id를 어디에 사용하건 간에 렌더링하는 동안 HTML 내에서 사용가능하게 될 것이다.

BasePage HTML은 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.sourceforge.net/"
      xml:lang="utf-8"
      lang="utf-8">
  <wicket:head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title wicket:id="pageTitle">[Blog Entry Title]</title>
    <link rel="stylesheet" href="screen.css" type="text/css" />
  </wicket:head>

  <body>
    <div id="container">
      <h1><span wicket:id="blogName">[Blog Name]</span></h1>
      <h2><span wicket:id="blogDescription">[Blog Description]</span></h2>
      <wicket:child/>
    </div>
  </body>
</html>


난 BasePage 클래스를 추상 클래스로 만들었다. 따라서 여러분은 BasePage 를 실제 페이지로 사용할 수 없고 대신 서브클래스를 만들어서 사용해야 한다. body 부분을 좀 더 자세히 보면, <wicket:child/> 태그가 있는데 이것은 BasePage 서브클래스의 HTML 에 의해 대체될 것이다. 우리는 BasePage 를 서브클래스할 것이기 때문에, 이 HTML 은 페이지 템플릿으로서의 역할을 수행한다.

Wicket 은 HTML 을 파싱하고 wicket:id 속성을 가진 어떤 태그라도 컴포넌트의 id에 의거하여 컴포넌트의 모델 컨텐츠로 대체하는 작업을 한다.

우리의 메인 페이지 클래스는 IndexBasePage 를 서브클래스싱하고 3개의 가장 최근의 블로그 엔트리를 날짜의 역순으로 보여주는 로직을 처리한다. 각각의 블로그 엔트리에 대해 우리는 제목과 발췌("Read more" 링크와 함께) 또는 전체 본문 그리고 블로그가 게시된 날짜를 보여줄 필요가 있다.

Index 페이지 클래스의 코드는 :

package org.javageek.wicket;

import java.text.DateFormat;
import java.util.List;

import wicket.PageParameters;
import wicket.markup.html.basic.Label;
import wicket.markup.html.link.BookmarkablePageLink;
import wicket.markup.html.list.ListItem;
import wicket.markup.html.list.ListView;
import wicket.model.IModel;
import wicket.model.LoadableDetachableModel;
import wicket.util.string.Strings;
import domain.BlogEntry;


public class Index extends BasePage {

    public Index() {
        IModel entriesModel = new LoadableDetachableModel() {
            @Override
            protected Object load() {
                return getBlog().getBlogEntries();
            }

        };

        add(new ListView("blogEntries", entriesModel) {
            @Override
            protected IModel getListItemModel(IModel model, int index) {
                List entries = (List) model.getObject(this);
                BlogEntry current = (BlogEntry) entries.get(index);
                return new BlogEntryModel(current);
            }


            @Override
            protected void populateItem(ListItem item) {
                final BlogEntry entry = (BlogEntry) item.getModelObject();
                final String excerpt = entry.getExcerpt();
                final boolean hasExcerpt = !Strings.isEmpty(excerpt);

                item.add(new Label("entryTitle", entry.getTitle()));
                PageParameters params = new PageParameters();
                params.put("id", entry.getId());
                item.add(new BookmarkablePageLink("viewBlogEntry",
                        ViewBlogEntry.class, params) {
                    @Override
                    public boolean isVisible() {
                        return hasExcerpt;
                    }
                });

                if (hasExcerpt) {
                    item.add(new Label("entryBody", entry.getExcerpt())
                            .setEscapeModelStrings(false));
                } else {
                    item.add(new Label("entryBody", entry.getBody())
                            .setEscapeModelStrings(false));
                }

                DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,
                        DateFormat.LONG, getBlog().getLocale());
                item.add(new Label("entryDate", df.format(entry.getDate())));
            }
        });
        add(new Label("pageTitle", getBlog().getName()));
    }


}


그리고 Index 페이지를 위한 전체 HTML 은 다음과 같다.

<wicket:extend>
    <div class="blogEntry" wicket:id="blogEntries">
    <h3 wicket:id="entryTitle">[Blog Entry Title]</h3>
    <div wicket:id="entryBody">[Blog Entry Body]</div>
    <p><a href="#" wicket:id="viewBlogEntry">Read more</a></p>
    <p>Posted on <span wicket:id="entryDate">[Blog Entry Date]</span></p>
    </div>
</wicket:extend>


보 는 바와 같이, 나는 주로 자바 코드를 이용하고 Wicket 에게 컴포넌트를 어디서 어떻게 렌더링하는지 말하는 매우 적은 양의 HTML 코드만으로 웹페이지를 생성했다. 또한 wicket:id 속성은 거의 대부분의 어떤 HTML 태그에도 적용될 수 있다. 이제 나는 Wicket 의 모델이 어떻게 작용하는지에 대해 더 이상 자세히 다루지는 않을 것이다. 그러나 Wicket 은 IModel 과 같은 몇 가지 인터페이스를 이용해서 도메인 객체로부터 Wicket 모델 객체로 모델의 분리를 제공한다고 말할 수 있다.

한 가지 지적하고 싶은 흥미로운 부분은 BookmarkablePageLink(볼드체로 나온 부분)의 isVisible 메소드를 오버라이딩함으로써 "Read more" 링크가 조건적으로 표시된다는 것이다. 그리고 이것이 사람들이 보통 다른 프레임워크에서 익숙한 것 처럼 HTML(또는 jsp) 안에서가 아니라 자바 코드에서 처리된다는 것이다. 지금까지 우리의 메인 페이지를 다루었고, 이제 다른 페이지가 어떻게 이루어지는지 살펴보자.

Blog detail Page

이 페이지는 한가지만 제외하면 실제로 매우 간단하다. 아래에 코드가 있다.

package org.javageek.wicket;

import java.text.DateFormat;
import wicket.PageParameters;
import wicket.RestartResponseException;
import wicket.markup.html.basic.Label;
import domain.Blog;
import domain.BlogEntry;


public class ViewBlogEntry extends BasePage {

    public ViewBlogEntry(PageParameters parameters) throws Exception {
        super();

        Blog blog = getBlog();
        BlogEntry entry = blog.getBlogEntry(parameters.getLong("id"));
        if (null == entry) {
            throw new RestartResponseException(PageNotFound.class);
        } else {
            add(new Label("entryTitle", entry.getTitle()));
            add(new Label("entryBody", entry.getBody())
                    .setEscapeModelStrings(false));

            add(new Label("pageTitle", entry.getTitle() + " : "
                    + blog.getName()));

            DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,
                    DateFormat.LONG, getBlog().getLocale());
            add(new Label("entryDate", df.format(entry.getDate())));

        }
    }


}

그리고 아래는 HTML 코드이다.

<wicket:extend>
    <div class="blogEntry">
    <h3 wicket:id="entryTitle">[Blog Entry Title]</h3>
    <div wicket:id="entryBody">[Blog Entry Body]</div>
    <p>Posted on <span wicket:id="entryDate">[Blog Entry Date]</span></p>
    </div>
</wicket:extend>


이 페이지에서 한 가지 알아두어야 할 점은 GET 또는 POST 요청을 편리하게 Map 객체로 감싼 페이지 파라미터를 인자로 제공하는 WebPage 의 생성자를 오버라이딩 하고 있다는 것이다. 또한 이러한 파라미터들 중 어떠한 것(우리의 경우에는 유효하지 않은 엔트리 id)이라도 null 엔트리를 생성한다면, PageNotFound 페이지 클래스로 리다이렉트 시킨다.

아래는 PageNotFound 페이지 클래스를 위한 코드이고, 기본적으로 이 페이지는 응답 상태 코드를 404로 설정한다.

package org.javageek.wicket;

import wicket.markup.html.basic.Label;
import wicket.protocol.http.WebResponse;


public class PageNotFound extends BasePage {

    public PageNotFound() {
        add(new Label("pageTitle", BlogApplication.instance().getBlog()
                .getName()));
    }


    @Override
    protected void configureResponse() {
        WebResponse wr = getWebRequestCycle().getWebResponse();
        wr.getHttpServletResponse().setStatus(404);
    }


}

이것으로 완성이다. 우리는 방금 Wicket 을 사용하여 웹 어플리케이션을 만들었다.

요약

Wicket 은 나의 견해로는 개발의 노력을 자바 코드안에서 이루어지게 함으로써 올바른 곳으로 집중시킨다. 그리고 디자인 부분은 그것이 있어야하는 HTML 로 남겨둔다. 너무나 많은 개발자들이 다른 프레임워크를 이용하여 JSTL 과 jsp 의 스크립틀릿에 의존하여 페이지의 로직을 프로그래밍하도록 '강제되어' 왔기 때문에 처음에 여러분은 이러한 패러다임의 변화에 적응하기가 조금 어려울 수도 있다. 하지만 여러분이 일단 이것에 익숙해지면, Wicket 은 정말로 신속한 개발을 제공해줄 것이라고 확신한다.




크리에이티브 커먼즈 라이센스
Creative Commons License
2009/02/10 13:17 2009/02/10 13:17


Wicket Features posted on 2009/02/10 13:16, filed under Develop
Wicket Features

Features

Swing-like OO Component Model
Pages and Components in Wicket are real Java objects that support encapsulation, inheritance and events.
Ease of Development

Because Wicket is Java and HTML, you can leverage what you know about Java or your favorite HTML editor to write Wicket applications.

Separation of Concerns

Wicket does not mix markup with Java code and adds no special syntax to your markup files. The worlds of HTML and Java are parallel and associated only by Wicket ids, which are attributes in HTML and Component properties in Java. Since Wicket HTML is just HTML and Wicket Java is just Java, coders and designers can work independently to a large degree and without relying on any special tools.

Secure

Wicket is secure by default. URLs do not expose sensitive information and all component paths are session-relative. Explicit steps must be taken to share information between sessions. There are plans for the next version of Wicket to add URL encryption to support highly secure web sites.

Transparent, Scalable Clustering Support

All Wicket applications will work on a cluster automatically and without additional work. Once bottlenecks are understood, Wicket enables tuning of page state replication. The next version of Wicket will support client-side models for zero-state scalability.

Transparent Back Button Support

Wicket supports configurable page version management. When users submit a form or follow a link from a page they accessed with the back button in their browser, Wicket is able to revert the page object to the state it was in when the page was originally rendered. This means you can write web applications that support the back button with very little work.

Reusable Components

Reusable components in Wicket are particularly easy to create. Not only can you extend existing components with the Java extends keyword, but you can also create Panel components which associate a group of components as a reusable unit.

Simple, Flexible, Localizable Form Validation

It is trivial to write and use validators in Wicket. It is also quite easy to customize and localize the display and content of validation error messages.

Typesafe Sessions

Wicket eliminates the need to manage HttpSession attributes by hand. Page and component objects are transparently stored in the session and your application can create a custom session subclass with typesafe properties as well. All objects stored in the session can automatically participate in clustering replication.

Factory Customizable

Wicket is very extensible. Most operations are customizable through factories or factory methods.

Detachable Models

Model objects in Wicket can be very lightweight in terms of memory and network use in a cluster. When a model is used, it can "attach", populating itself with information from persistent storage. When the model is no longer in use, transient information can be reset, reducing the size of the object.

Border Components

Wicket Border components enable the decoration of pages in a reusable fashion. This is especially useful for inheritance of common navigational structures or layout.

Support for All Basic HTML Features

Wicket supports image tags, links, forms and everything else that you're used to using in your web application development.

Programmatic Manipulation of Attributes

Wicket Components can programmatically change any HTML tag attribute.

Automatic Conversions

Once a Form validates, the model can be updated using Wicket converters. Most ordinary conversions are built-in and it is easy to write new converters.

Dynamic Images

Wicket makes image use, sharing and generation very easy. Dynamic images can be created by simply implementing a paint method.

Pageable ListView

ListViews in Wicket are extremely powerful. You can nest any kind of component in a ListView row, even other ListViews. PageableListView supports navigation links for large lists.

Tree Component

Out of the box tree component for navigating and selecting nodes.

Localization

HTML pages, images and resource strings can all be localized.

Examples

Wicket has numerous examples showcasing all of the above features.


번역 : http://tmheo.egloos.com/680493


Features

자바 Swing과 같은 객체지향형 컴포넌트 모델(Swing-like OO Component Model)

Wicket의 페이지와 컴포넌트는 캡슐화와 상속, 이벤트를 기능을 지원하는 Real 자바 객체이다.

개발의 용이함(Ease of Development)

Wicket은 자바와 HTML로 되어 있기 때문에 Wicket 어플리케이션을 작성하기 위해 여러분이 알고 있는 자바와 여러분이 좋아하는 HTML 에디터를 그대로 사용할 수 있다.

연관의 분리(Separation of Concerns)

Wicket 은 마크업 파일과 자바 코드를 뒤섞지 않고, 마크업 파일에 특별한 문법을 추가하지 않는다. HTMl과 자바 코드는 평행하며 오직 Wicket id만에 의해서만 연관되어 진다. Wicket id는 HTML에서 Attribute로 표현되고 자바 코드에서 컴포넌트 프로퍼티를 말한다. Wicket HTML은 순수한 HTML이고 Wicket 자바 코드는 순수한 자바 코드이기 때문에 프로그래머와 디자이너는 특별한 툴에 의존하지 않고 독립적으로 작업할 수 있다.

보안(Secure)

Wicket 은 디폴트로 보안 기능이 지원된다. URL은 중요한 정보를 노출하지 않고 컴포넌트 경로는 세션에 상대적이다. 세션간에 정보를 공유하기 위해서는 명시적인 단계를 필요로 한다. Wicket의 다음 버전에서는 더욱 높은 수준의 보안을 지원하는 웹 사이트를 위해 URL 암호화 기능을 추가할 것이다.

투명하고, 확장성있는 클러스터링 지원(Transparent, Scalable Clustering Support)

모 든 Wicket 어플리케이션은 추가적인 작업없이 자동적으로 클러스터링에서 작동할 수 있다. 일단 병목구간이 파악되면 Wicket은 페이지 상태 복제를 튜닝하는 것이 가능하다. Wicket의 다음 버전에서는 zero-state 확장성을 위해 클라이언트쪽 모델을 지원할 것이다.

투명한 뒤로 가기 버튼의 지원(Transparent Back Button Support)

Wicket 은 페이지의 설정가능한 버젼 관리를 지원한다. 사용자가 폼을 전송하거나 브라우저의 뒤로 가기 버튼으로 사용자가 접근된 페이지에서 링크를 클릭할 때, Wicket은 페이지 객체를 원래 페이지가 렌더링됐을 때의 상태로 되돌리는 것이 가능하다. 이것은 여러분이 매우 적은 노력으로 뒤로 가기 버튼을 지원하는 웹어플리케이션을 작성할 수 있다는 것을 의미한다.

재사용가능한 컴포넌트(Reusable Components)

Wicket에서 재사용가능한 컴포넌트는 매우 만들기 쉽다. 여러분은 기존 컴포넌트를 확장할 수 있을뿐 아니라, 또한 재사용가능한 단위로서 컴포넌트의 그룹을 연관시키는 Panel 컴포넌트를 만들 수 있다.

단순하고 유연하며 지역화된 폼 검증(Simple, Flexible, Localizable Form Validation)

Wicket에서 폼 validator 클래스를 작성하고 사용하는 것은 간단하다. 또한 검증 에러 메세지의 출력과 내용을 커스터마이징하는 것도 매우 쉽다.

Typesafe Sessions

Wicket 은 HttpSession을 직접 관리할 필요성을 없앴다. 페이지와 컴포넌트 객체는 세션을 투명하게 저장하고 또한 여러분의 어플리케이션은 타입세이프한 프로퍼티로 만들어진 커스텀 세션 서브 클래스를 만들 수 있다. 세션에 저장된 모든 객체는 자동적으로 클러스터링 복제에 참여한다.

Factory Customizable

Wicket은 매우 확장성이 높다. 대부분의 기능들은 Factory 클래스나 Factory 메소드로 커스터마이징 가능하다.

분리가능한 모델(Detachable Models)

Wicket 의 모델 객체는 메모리 사용과 클러스터 상에서 네트워크 자원 사용에 있어서 매우 가볍다(lightweight). 모델이 사용될 때 DB에서 정보를 읽어와서 메모리에 로딩(attach)되고, 모델이 더 이상 사용되지 않을 때 객체의 크기를 줄일수 있도록 임시적인 정보는 리셋될 수 있다.

Border Components

Wicket Border 컴포넌트는 페이지 꾸미는 것을 재사용 가능하게 해준다. 이것은 공통적인 구조나 레이아웃을 상속할 때 특히 유용하다.

모든 기본 HTML 기능의 지원(Support for All Basic HTML Features)

Wicket은 이미지 태크, 링크, 폼과 여러분이 웹어플리케이션 개발을 위해 지금까지 사용한 다른 모든것들을 지원한다.

HTML 특성의 프로그래밍적인 조작(Programmatic Manipulation of Attributes)

Wicket 컴포넌트는 Java 코드내에서 어떤 HTML 태크 attribute라도 변경할 수 있다.

Automatic Conversions

폼이 검증되면, 모델 객체는 Wicket의 컨버터를 이용하여 업데이트될 수 있다. 대부분의 일반적인 컨버젼은 내장되어 있고 새로운 커스텀 컨버터를 작성하는 것도 쉽게 할 수 있다.

동적 이미지(Dynamic Images)

Wicket은 이미지의 사용, 공유, 생성을 매우 쉽게 해준다. 간단하게 paint 메소드만 구현함으로써 동적인 이미지를 생성할 수 있다.

페이징 기능이 가능한 ListView(Pageable ListView)

Wicket 의 ListView는 매우 강력하다. 여러분은 ListView의 행에 어떤 종류의 컴포넌트(심지어 또 다른 ListView도 사용가능하다.)라도 사용할 수 있다. PageableListView는 대량의 List를 위한 페이징 네비게이션 링크를 지원한다.

Tree Component

노드들을 이동하고 선택할 수 있는 트리 컴포넌트의 지원

지역화(Localization)

HTML 페이지, 이미지 그리고 리소스 문자열은 모두 지역화될 수 있다.

예제들

Wicket은 위에서 언급한 기능을 보여주는 수많은 예제를 가지고 있다.


크리에이티브 커먼즈 라이센스
Creative Commons License
2009/02/10 13:16 2009/02/10 13:16


Total: 213296 (Today: 87, Yesterday: 81)

RSS
읽고 있는 책