2012-12-17 1 views
2

Речь идет о примере HelloWorld по следующей ссылке:Как построить два Wicket приложения

http://wicket.apache.org/learn/examples/helloworld.html 

HelloWorld работает отлично, и я могу вызвать приложение с URL: http://localhost:8080/helloworld/. теперь я хотел бы расширить пример для второго приложения hellowolrd2 sothat, когда я звоню http://localhost:8080/helloworld2/ с браузером, вторая страница helloworld2 приходит (похожа на helloworld). Предположим, у меня есть файлы HelloWorld2.java и HelloWorld2.html. Что я должен изменить в файле web.xml?

ответ

3

Вам ничего не нужно изменять в web.xml. Только соответствующая настройка определяется есть <filter-mapping> элемент

<filter-mapping> 
    <filter-name>HelloWorldApplication</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

, который отображает все запросы (/*), сделанные в приложении (контекст его корня) к калитке фильтра (думать об этом как сервлет), который будет обрабатывать все запросы Wicket и направляют их к соответствующему методу (конструктор компонента, метод обработчика событий и т. д.).

В примере, вы видите HelloWorld страницу при запросе http://localhost:8080/helloworld/ потому что HelloWorld является домашняя страница определяется в WebApplication. helloworld является корневым контекстом для веба-приложения, так Калитка автоматически переходит на страницу, определенной в WebApplication#getHomePage():

@Override 
public Class getHomePage() { 
    return HelloWorld.class; 
} 

Обратите внимание, что helloworld здесь является корневым контекстом приложения. Поэтому, если вы не хотите определять какую-либо логику в getHomePage(), чтобы вернуть класс или другой в зависимости от некоторых критериев (на самом деле не думайте, что это то, что вам нужно), он эффективно будет обслуживать HelloWorld.

Теперь, обращаясь на ваш вопрос, с калиткой вы можете монтировать (bookmarkable) страницы в URL, используя WebApplication#mountPage():

public class HelloWorldApplication extends WebApplication { 
    @Override 
    protected void init() { 
     mountPage("/helloworld", HelloWorld.class); 
     mountPage("/helloworld2", HelloWorld2.class); 
    } 

    @Override 
    public Class getHomePage() { 
     return HelloWorld.class; 
    } 
} 

Это сделало бы http://localhost:8080/helloworld/ служить HelloWorld класс, являющийся домашней страницей. Но также будет служить для запроса http://localhost:8080/helloworld/helloworld. Запрос http://localhost:8080/helloworld/helloworld2 будет эффективно служить HelloWorld2.

Или, если вы действительно хотели http://localhost:8080/helloworld2/ служить HelloWorld2, вы должны развернуть другой веб-приложение, конечно же со своим собственным web.xml и контекстно-корень helloworld2.

+0

это отлично работает, когда я устанавливаю mountPage() в метод init(). Я не знаю, почему это не работает, если moutPage() в конструкторе. Спасибо за помощь –

+0

Да, действительно, 'mountPage' должен быть на' init() ', а не на конструкторе. Я изменил ответ. В качестве примечания к ответу, посмотрите эту запись [Wicket in Action на странице установки] (http://wicketinaction.com/2011/07/wicket-1-5-mounting-pages/), вы можете найти ее полезной , –

1

У вас нет двух приложений, на самом деле у вас есть две страницы. Первый (HelloWorld) была намечена, чтобы ответить как домашняя страница, она была определена в HelloWorldApplication:

@Override 
public Class getHomePage() { 
    return HelloWorld.class; 
} 

Если вы хотите локальный: 8080/HelloWorld2/просто создать отображение в методе Init() в HelloWorldApplication

@Override 
public void init() { 
super.init(); 
this.mountPage("/helloworld2", Helloworld2.class); 
} 
+0

Возможно, стоит упомянуть, что на самом деле 'http: // localhost: 8080/helloworld/helloworld2' будет обслуживать эту страницу, а не' http: // localhost: 8080/helloworld2'. –

+0

@ XaviLópez Если приложение не установлено в корневой контекст. (Это несколько путано обсуждать это концептуально, не устраняя неоднозначность имени приложения, а также имена страниц/где они установлены, одним из которых может быть «индекс» для приложения.) – millimoose