微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tomcat嵌入式和Webjars资源

如何解决Tomcat嵌入式和Webjars资源

我们最近将嵌入式Java Web服务器从Jetty迁移到了tomcat。我们现在有一个最终代码,可以像这样在Java中运行tomcat:

        final var tomcat = new Tomcat();

        tomcat.setPort( 8080 );
        var connector = new Connector( "HTTP/1.1" );
        connector.addUpgradeProtocol( new Http2Protocol() );
        tomcat.setConnector( connector );

        final var rootFolder = getRootFolder();
        System.out.println(rootFolder);
        var webContentFolder = new File( rootFolder,"webpage" );
        if( !webContentFolder.exists() ){ // Running from target/classes
            webContentFolder = new File( rootFolder );
        }
        var context = (StandardContext) tomcat.addWebapp( "",webContentFolder.getAbsolutePath() );
        context.setParentClassLoader( Main.class.getClassLoader() );

        var jarScanner = (StandardJarScanner) context.getJarScanner();
        jarScanner.setScanAllDirectories( false );
        jarScanner.setScanAllFiles( false );
        jarScanner.setScanBootstrapClasspath( false );
        jarScanner.setScanClasspath( false );
        jarScanner.setScanManifest( false );

        // basic http request
        Tomcat.addServlet( context,"embedded",new HttpServlet() {
            @Override
            protected void service(HttpServletRequest req,HttpServletResponse resp)
                    throws IOException {

                Writer w = resp.getWriter();
                w.write( "Embedded Tomcat servlet.\n" );
                w.flush();
                w.close();
            }
        } );
        context.addServletMappingDecoded( "/embedded","embedded" );

        // basic websocket
        context.addApplicationListener( WebSocketContextListener.class.getName() );

        tomcat.start();
        tomcat.getServer().await();

在码头,可以像这样添加资源处理程序

public class WebjarsResourceHandler extends ResourceHandler {

    private static final Pattern CURRENT_VERSION_PATH_MATCHER = Pattern.compile( "/webjars/[^/]*/current/.*" );
    private static final Pattern PATH_PATTERN = Pattern.compile( "/webjars/([^/]*)/([^/]*)/(.*)" );

    @Override
    public Resource getResource(String path) {
        if( !path.startsWith( "/webjars/" ) ){
            return null;
        }

        if( CURRENT_VERSION_PATH_MATCHER.matcher( path ).matches() ){
            var jarNameMatcher = PATH_PATTERN.matcher( path );
            if( jarNameMatcher.find() ){
                var jarName = jarNameMatcher.group( 1 );
                var currentVersion = new WebJarassetLocator().getWebJars().get( jarName );

                path = "/webjars/" + jarName + "/" + currentVersion + "/" + jarNameMatcher.group( 3 );
            }
        }

        return Resource.newClassPathResource( "/meta-inf/resources" + path );
    }
}

并将其添加到服务器配置中:

        final var handlers = new HandlerList(
                new WebjarsResourceHandler(),resourceHandler,servletContextHandler
        );
        server.setHandler( handlers );

例如,这允许我们使用路径/webjars/bootstrap/...引用html文件中的资源。在添加maven依赖项的情况下:

<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>bootstrap</artifactId>
</dependency>

如何使用嵌入式tomcat服务器重现此内容

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?