文档章节

让嵌入式Jetty9.4.3支持jsp

kakai
 kakai
发布于 2017/03/27 22:14
字数 383
阅读 1.2K
收藏 5

首先给出一个简单的内嵌Jetty程序

package mp.http.server;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

/**
 *
 * @author zkpursuit
 */
public class HttpServer {

    public static void main(String[] args) throws Exception {
        WebAppContext webapp_context = new WebAppContext();
        webapp_context.setDescriptor("./src/webapp/WEB-INF/web.xml");
        webapp_context.setResourceBase("./src/webapp");
        webapp_context.setContextPath("/");
        webapp_context.setParentLoaderPriority(true);
        webapp_context.setClassLoader(Thread.currentThread().getContextClassLoader());
        Server server = new Server(8080);
        server.setStopAtShutdown(true);
        server.setHandler(webapp_context);
        server.start();
        server.join();
    }

}

 

WebAppContext的基类是ServletContextHandler,所以它天生支持Servlet,可是JSP呢?JSP最终会编译成Servlet运行的,网上一查,最新版的Jetty默认支持jsp,可是我测试的时候直接报错

org.apache.jasper.JasperException: Unable to compile class for JSP

 

应该是我理解有误,默认支持jsp的应该是Jetty自带的那个默认Web/Servlet容器吧,我也没测试,无法下结论。

下面继续讨论怎么让上面的代码运行支持jsp。

从上面的错误可以看出是jsp文件未被编译,而把jsp编译为Servlet需要额外的库,从下载的jetty的lib文件夹中,包含apache-jsp文件夹,把其中所有jar包导入,并加入

webapp_context.addServlet(JettyJspServlet.class, "*.jsp");

再次运行,还是报那个不能编译的错误,这下就郁闷了,接着查资料,终于找到下面的方法了

public static class JspStarter extends AbstractLifeCycle implements ServletContextHandler.ServletContainerInitializerCaller {

        JettyJasperInitializer sci;
        ServletContextHandler context;

        public JspStarter(ServletContextHandler context) {
            this.sci = new JettyJasperInitializer();
            this.context = context;
            this.context.setAttribute("org.apache.tomcat.JarScanner", new StandardJarScanner());
        }

        @Override
        protected void doStart() throws Exception {
            ClassLoader old = Thread.currentThread().getContextClassLoader();
            Thread.currentThread().setContextClassLoader(context.getClassLoader());
            try {
                sci.onStartup(null, context.getServletContext());
                super.doStart();
            } finally {
                Thread.currentThread().setContextClassLoader(old);
            }
        }
    }

 

接着使用这个类,在最上面的main方法中加入

webapp_context.addBean(new JspStarter(webapp_context));
webapp_context.addServlet(JettyJspServlet.class, "*.jsp");

再次运行,我能呵呵了,终于能运行jsp了,大功告成

© 著作权归作者所有

kakai

kakai

粉丝 97
博文 13
码字总数 12842
作品 1
长沙
后端工程师
私信 提问
加载中

评论(0)

Spring boot配置Servlet容器

配置Servlet容器 Spring boot默认使用Tomcat,作为Servlet容器 也支持Jetty、Undertow作为Servlet容器 Jetty 适合开发长连接应用 长连接,表示一直进行点对点连接 比如,Web聊天应用 聊天时,...

量变决定质变
2018/09/16
0
0
spring整合jms系列之----点对点(一)

JMS作为一个支持点对点(PTP)和订阅式(pub/sub)式的消息中间件,为很多项目开发者所使用。Spring对JMS提供了很好的支持,可以通过JmsTemplate来方便地实现消息服务,由于JMS对Spring的支持...

码上中国博客
2015/11/12
537
0
【Spring Boot】9.嵌入式servlet容器.

简介 我们已经知道,使用SpringBoot启动web应用并不需要配置tomcat,就可以直接使用,其实是springboot使用的是tomcat作为嵌入式的servlet容器导致的,这称作嵌入式的servlet容器,这是怎么一...

落花时节又逢卿
2018/12/27
161
0
Spring boot嵌入式Servlet容器定制器

修改Servlet配置 可以通过配置文件修改 也可以编写一个嵌入式Servlet容器定制器 EmbeddedServletContainerCustomizer 在自定义配置中,添加组件 EmbeddedServletContainerCustomizer 是一个接...

量变决定质变
2018/09/11
0
0
Apache 社区发布 OpenEJB 3.1

OpenEJB是一个嵌入式,轻量级EJB3.0实现。既可以作为单独服务器使用,也可以嵌入到Tomcat、JUnit、Eclipse、 Intellij、Maven、Ant和其它任何IDE与应用程序中。OpenEJB 被用于Apple的WebObje...

红薯
2008/11/01
1.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 如何以 Web 应用的方式启动

在 Spring Boot 启动的时候,在进程完成后会自动退出。 如何让 Spring Boot 以 Web 方式启动,并且进程不退出呢? 需要确定下 Web 的这个依赖是否在你的依赖中。 <dependency> ...

honeymoose
14分钟前
28
0
leetcode892(三维形体的表面积)--C语言实现

求: 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 示例 1: 输入:[[2]] 输出:...

拓拔北海
19分钟前
42
0
使用* args和** kwargs [重复] - Use of *args and **kwargs [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : What does ** (double star/asterisk) and * (star/asterisk) do for parameters? **(双星号/星号)和*(......

技术盛宴
25分钟前
34
0
spring-boot之@ConfigurationProperties的使用

@ConfigurationProperties是什么? Using the @Value("${property}") annotation to inject configuration properties can sometimes be cumbersome, especially if you are working with mu......

书中迷梦
26分钟前
57
0
让你快速掌握_正则表达式_的技巧(二)

经过上篇的快速入门了正则表达式,今天就带你快速掌握正则表达式的技巧, 话不多说,直接上干货! 正则表达式-附录【重点】 一. 规则 规则:. 含义:代表的是某一位,可以是任何字符 例如:匹配规...

煌sir
28分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部