1

我需要一种不使用 web.xml 来配置 Wicket 的方法。

我已经尝试了几篇博客文章,但仍然遇到问题。

例如:

https://cwiki.apache.org/confluence/display/WICKET/Wicket+without+web.xml+%28embedded+Jetty%29

http://dev-loki.blogspot.de/2008/05/embedded-jetty-wicketfilter-webxml.html

找不到有效的解决方案。

我创建了一个只有一个主页的简单项目,按照上面提到的链接中的步骤操作,但没有成功。

我尝试了 jetty 并收到 HTTP ERROR 404。我可以向您展示应该像 web.xml 一样运行的代码。这是一个基于弹簧的解决方案。

public class WicketApplicationInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringConfig.class);

    servletContext.addListener(new ContextLoaderListener(ctx));

    WicketFilter filter = new WicketFilter(new WicketApplication());
    filter.setFilterPath("");

    servletContext.addFilter("wicketFilter", filter).addMappingForUrlPatterns(null, false, "/*");

    servletContext.addServlet("/*", DefaultServlet.class);

}

}

这应该可以解决问题,但没有被服务器识别。它看起来很简单,就像普通 web.xml 中的步骤一样,但不起作用。

主页只有一个挂载:

mountPage("/testing", HomePage.class);

尝试访问:

https://localhost:8443/testing

结果是:

HTTP ERROR 404 Problem accessing /testing. Reason:  Not Found

任何人都可以帮忙吗?

也许有人有一个没有丑陋 web.xml 的简约工作项目?或者只是一些建议。

4

2 回答 2

1

以下代码在没有 web.xml 的情况下启动了一个支持 wicket 的码头。

import org.apache.wicket.protocol.http.WicketFilter;
import org.apache.wicket.protocol.http.WicketServlet;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;


public class Main {
    public static void main(String[] args) {
        // Object that holds, and configures the WicketServlet.
        ServletHolder servletHolder =
                new ServletHolder(new WicketServlet());
        servletHolder.setInitParameter(
                "applicationClassName",
                "com.javaeenotes.ExampleWicketApplication");
        servletHolder.setInitParameter(
                WicketFilter.FILTER_MAPPING_PARAM, "/*");
        servletHolder.setInitOrder(1);

        // Web context configuration.
        WebAppContext context = new WebAppContext();
        context.addServlet(servletHolder, "/*");
        context.setResourceBase("."); // Web root directory.

        // The HTTP-server on port 8080.
        Server server = new Server();
        SocketConnector connector = new SocketConnector();
        connector.setPort(8080);
        server.setConnectors(new Connector[]{connector});
        server.setHandler(context);

        try {
            // Start HTTP-server.
            server.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是 http://javaeenotes.blogspot.de/2011/12/running-wicket-on-jetty.html的解决方案

正如我之前所说,这现在不适合我,但适合主题:它是一个可以启动 wicket 应用程序并且不需要 web.xml 配置的码头。

所以,我将此答案标记为已接受,并且可能会针对检票口处理的 Spring 方式开始另一个问题......无论如何,谢谢

于 2013-07-26T15:04:54.207 回答
0

我已经看到一些代码以这种方式在没有 web.xml 的情况下启动码头:

    import org.mortbay.jetty.Connector;
    import org.mortbay.jetty.Server;
    import org.mortbay.jetty.nio.SelectChannelConnector;
    import org.mortbay.jetty.webapp.WebAppContext;

    Server server = new Server();
    SelectChannelConnector connector = new SelectChannelConnector();
    connector.setPort(8000); //or any other port you need
    server.setConnectors(new Connector[]
    { connector });

    WebAppContext web = new WebAppContext();
    web.setContextPath("/"); //assuming you want / as a context like your sample
    web.setWar("src/webapp"); //check that it matches your webapp directory.
    server.addHandler(web);
    server.start();
    server.join();

这样,假设您使用 Jetty,您可以根据需要向上下文添加任意数量的战争。您可以向 WebAppContext 对象 (web) 添加更多内容,以控制您的过滤器和其他映射。

于 2013-07-26T09:35:51.720 回答