让jetty启用支持jsp功能

1.  下载 Jetty 6 的压缩包
2.  将 Jetty 6 下的 jsp 2.1 目录下的文件复制到 Jetty 7 的 lib 目录
3.  运行 Java -jar start.jar --list-options 来检查是否支持 JSP
4.  编辑 jetty.ini 文件,在 OPTIONS 中增加 jsp一项,如下
OPTIONS=Server,jmx,resources,websocket,ext,jsp

5.  启动 Jetty 即可。

而在 Jetty 8 (最新版是M1) 默认是支持 JSP 的,不过访问JSP文件出现以下错误:

org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required

以上摘自开源中国上的,不过如果出现了这个错误,请看我对应的上一篇博客有详细解决方法。

如果以上解决不了支持JSP问题的话,如果你又是在elipse中集成的jetty,安装的是jetty插件的话,编译环境里的lib目录里直接包含了jsp2.1的二个包,把这二个包作为运行环境也就是从软件里去掉这二个包,让它调用jetty里自带的应该就没有问题了。

如果还是不行,试试lib下缺少jasper.jar 包。

如果还是不行的话,可以再参考下边的方法:

从Jetty-9.2开始,使用Apache Jasper作为默认JSP容器实现。在前面的版本中使用的是Glassfish Jasper,在后面的版本中也可以继续使用它。 Jetty发布默认激活jsp模块,默认,模块设置到Apache Jasper。为了改为使用Glassfish Jasper,编辑$JETTY_HOME/start.d/jsp.mod,改变下面的行:

 

#
# Jetty JSP Module
#
 
[depend]
servlet
jsp-impl/${jsp-impl}-jsp
 
[ini-template]
# JSP Configuration
 
# Select JSP implementation, choices are
#   glassfish : The reference implementation 
#               default in jetty <= 9.1
#   apache    : The apache version 
#               default jetty >= 9.2
jsp-impl=apache
 
# To use a non-jdk compiler for JSP compilation when using glassfish uncomment next line
# -Dorg.apache.jasper.compiler.disablejsr199=true

注意一些JSP的特征能否使用依赖于你选择的JSP容器实现。也注意你不能预编译一种容器的jsp,而部署另一个。

预编译

你能按照你选择的JSP容器(Glassfish或者Apache)提供的指导手册预编译jsp。或者如果你选择使用maven,你能用jetty-jspc-maven插件为你做。

如果你预编译你的jsp,并且自定义了输出包前缀(默认是org.apache.jsp),你应该配置你的webapp上下文告诉Jetty关于你的自定义报名。你能使用servlet上下文的初始化参数org.eclipse.jetty.servlet.jspPackagePrefix做这。

例如,假定你预编译你的jsp,使用自定义包前缀com.acme,那么你将在web.xml中增加:

 

<context-param>
  <param-name>org.eclipse.jetty.servlet.jspPackagePrefix</param-name>
  <param-value>com.acme</param-value>
</context-param>

注意:Jetty的maven插件jetty-jspc-maven-plugin和jetty-maven-plugin都只能用Apache Jasper

运行时编译JSP

根据你选择的不同的JSP容器,配置项和编译特性将是不同的。

Apache JSP容器

默认,Apache JSP容器将查找Eclipse Java Compiler(jdt)。jetty发布自带了一个在$JETTY_HOME/lib/apache-jsp。如果你希望用不同的编译器,你将需要配置compilerClassName初始参数在JspServlet,并带上类名。 下表是Apache JspServlet的参数介绍:

 

理解Apache JspServlet参数
初始参数 描述 默认值 webdefault.xml
classpath 用于jsp编译的Classpath。只有在jetty中的org.apache.catalina.jsp_classpath上下文属性不被设置时才使用。 - -
classdebuginfo 在class文件中包括debugging信息。 TRUE -
checkInterval 后台重编译检查的间隔,单位秒。只有development=false才使用。 0 -
development development=true时,每个请求都做重编译检查。看modificationTestInterval TRUE -
displaySourceFragment 是否将源码片段包含在异常信息中 TRUE -
errorOnUseBeanInvalidClassAttribute 当在一个useBean行为中class属性的值不是一个有效的bean类时,是否产生一个error TRUE -
fork Ant应该fork它的JSP页的Java编译吗? TRUE FALSE
keepgenerated 你想保留生成的Java文件吗? TRUE -
trimSpaces 指令和行为间的空格应该被裁剪吗? FALSE -
enablePooling 确定标签处理器池是否被激活 TRUE -
engineOptionsClass 允许指定的Options类用于配置Jasper。否则,默认的EmbeddedServletOptions将被使用。 - -
mappedFile 支持mapped Files。产生一个servlet,有一个打印申明JSP文件的每一行 TRUE -
suppressSmap 为JSR45调试的SMAP信息的产生 FALSE -
dumpSmap 转储SMAP JSR45信息到一个文件 FALSE -
genStrAsCharArray 为产生Strings的选项 FALSE -
ieClassId 当使用<jsp:plugin>标签时,class-id值被送到Internet Explorer clsid:8AD9C840-044E-11D1-B3E9-00805F499D93 -
maxLoadedJsps 一个web应用能加载的JSP的最大值。如果超过了这个值,最近最少使用那个的JSP将被卸载。0或者负值表示没有限制。 -1 -
jspIdleTimeout 一个JSP被卸载前空闲的最大时间,单位秒。0或者负值表示永不卸载。 -1 -
scratchDir servlet被生成的文件夹 - -
compilerClassName 如果不设置,默认是Eclipse jdt编译器。 - -
compiler 如果Eclipse jdt编译器在classpath中不能找到时使用。它是Ant应该调用的编译器的类名。 - -
compilerTargetVM 编译器期望的目标vm。 1.7 -
compilerSourceVM 为jdt编译器设置源兼容性级别。 1.7 -
javaEncoding 编译使用编码方式。 UTF8
modificationTestInterval 如果development=true,重编译检查的间隔,通过一个请求触发。 4 -
xpoweredBy 产生一个X-Powered-By响应头 FALSE FALSE
recompileOnFail 如果一个JSP编译失败,modificationTestInterval应该被忽略并且触发下一个重编译尝试吗?只用在开发模式,默认被停止,因为编译可能代价较高导致过多的资源被用。 -

-

 

Glassfish JSP容器

为了编译.jsp文件进入Java classes,你需要一个Java编译器。如果你正在使用一个完整的JDK,你能从JVM得到Java编译器,否则,你可以从一个第三方Jar。

默认Glassfish JSP容器尝试用JDK的编译器。注意:当用JDK编译器时,系统不保存你的class文件到磁盘,除非你用saveBytecode初始化参数,将在下面描述。

如果你不有完整的JDK,你能配置Eclipse Java Compiler,在Jetty的$JETTY_HOME/lib/jsp/文件夹下。你需要定义一个系统属性,防止Glassfish JSP引擎默认使用JVM中的编译器。

当使用独立的标准版时,最好的方式是使用未注释的系统属性org.apache.jasper.compiler.disablejsr199,在jsp module中:

 

-Dorg.apache.jasper.compiler.disablejsr199=true

或者为了嵌入的使用,仅仅定义这作为一个通常的系统属性。

配置

JSP引擎有一些配置参数。一些参数仅影响预编译,而一些影响运行时预编译检查。在不同版本的JSP引擎间参数也有不同。下面列出了配置参数、他们的含义和他们的默认设置。所有参数都在webdefault.xml的org.apache.jasper.JspServlet实例中定义:

 

理解Glassfish JSP参数
初始参数 描述 默认值 webdefault.xml
development development=true,重编译检查在每个请求时都执行。看modificationTestInterval。 TRUE -
fork Ant应该fork它的JSP页的Java编译? TRUE FALSE
keepgenerated 你想保留产生的Java文件? FALSE -
saveBytecode 如果class文件作为byte arrays被产生,他们在编译结束时应该被保存到磁盘吗? FALSE -
trimSpaces 在指令和行为之间的空白应该被裁剪吗? FALSE -
enablePooling 确定标签处理器池是否被激活。 TRUE -
mappedFile 支持mapped Files。产生一个servlet,有一个打印申明JSP文件的每一行 TRUE -
sendErrorToClient 如果false,栈轨迹,等,被送到标准错误代替客户端的浏览器。 FALSE -
classdebuginfo 在class文件中包括debugging信息。 TRUE -
checkInterval 后台重编译检查的间隔,单位秒。只有development=false才使用。 0 -
suppressSmap 为JSR45调试的SMAP信息的产生 FALSE -
dumpSmap 转储SMAP JSR45信息到一个文件 FALSE -
genStrAsCharArray 为产生Strings的选项 FALSE -
genStrAsByteArray 为产生Strings的选项 TRUE -
defaultBufferNone - FALSE -
errorOnUseBeanInvalidClassAttribute - FALSE -
scratchDir servlet被生成的文件夹。Jetty设置这个值根据为webapp设置的[/display/JETTY/Temporary+Directories work dir] - -
compiler 在运行时确定。对Jetty来说是Eclipse jdt compiler。 - -
compilerTargetVM 编译器期望的目标vm。 1.5 -
compilerSourceVM 为jdt编译器设置源兼容性级别。 1.5 -
javaEncoding 编译使用编码方式。 UTF8 -
modificationTestInterval 如果development=true,重编译检查的间隔,通过一个请求触发。 0 -
xpoweredBy 产生一个X-Powered-By响应头。 FALSE FALSE
usePrecompiled/use-precompiled - FALSE -
validating/enableTldValidation 是否根据模式(schema)验证标签文件。 FALSE -
reload-interval 如果reload-interval=0,则不做JSP的运行时检查,否则设置检查间隔,不管development=true还是development=false。 - -
initial-capacity/initialCapacity 映射JSP到class和JSP文件的哈希映射表的初始容量 - -

 

通常存在很多困惑在关于development、checkInterval和modificationTestInterval参数,和JSP运行时重编译。这里是分解出的各种选项:

1)对每个请求检查JSP文件重编译

 

<init-param>
        <param-name>development></param-name>
        <param-value>true></param-value>
</init-param>

2)大约每N秒检查一次,通过请求触发定时的计算。下面是每60秒检查:

 

<init-param>
  <param-name>development></param-name>
  <param-value>true></param-value>
</init-param>
<init-param>
  <param-name>modificationTestInterval></param-name>
  <param-value>60></param-value>
</init-param>

3)不做检查,但在第一次使用时编译JSP。(注意“reload-interval”参数相当于“development=false”和“checkInterval=0”组合的简写):

 

<init-param>
        <param-name>reload-interval></param-name>
        <param-value>-1></param-value>
</init-param>

4)不做任何请求时检查,但启动一个后台线程执行每N秒检查一次。下面的例子每60秒检查一次:

 

<init-param>
  <param-name>development></param-name>
  <param-value>false></param-value>
 </init-param>
 <init-param>
   <param-name>checkInterval></param-name>
   <param-value>60></param-value>
</init-param>

修改配置

不考虑你正在使用哪一个JSP容器,有几个选项用于修改JspServlet配置。

重载webdefault.xml

你能拷贝Jetty自带的$JETTY_HOME/etc/webdefault.xml,修改,然后用它代替自带的版本。下面展示如何使用Jetty Maven插件达到这个目地:

 

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <configuration>
    <webApp>
      <defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
    </webApp>
</plugin>

如果你正在使用Jetty发行版,你想改变JSP设置为一个或者多个你的webapp,拷贝$JETTY_HOME/etc/webdefault.xml文件到某个地方,修改,然后用context xml文件设置这个文件为你的webapp的defaultsDescriptor。下面是一个例子:

 

<Configure class=>"org.eclipse.jetty.webapp.WebAppContext">
 
  <Set name=>"contextPath">/foo</Set>
  <Set name=>"war"><SystemProperty name=>"jetty.home" >default=>"."/>/webapps/foobar.war</Set>
  <Set name=>"defaultsDescriptor">/home/smith/dev/webdefault.xml</Set>
  
</Configure>

如果你想改变JSP设置为所有webapp,直接编辑$JETTY_HOME/etc/webdefaults.xml即可。

在web.xml中配置JSP Servlet

另一个选择是在你的webapp的WEB-INF/web.xml中为JSPServlet增加一个条目,改变或者增加初始化参数。你也可以增加(但不移除)servlet-mappings。你能用在$JETTY_HOME/etc/webdefault.xml中的条目作为一个起始点。

 

<servlet id=>"jsp">
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  <init-param>
    <param-name>logVerbosityLevel</param-name>
    <param-value>DEBUG</param-value>
  </init-param>
  <init-param>
    <param-name>fork</param-name>
    <param-value>>false</param-value>
  </init-param>
  <init-param>
    <param-name>keepgenerated</param-name>
    <param-value>>true</param-value>
  </init-param>
  ...
   
  <load-on-startup>0</load-on-startup>
  </servlet>
 
  <servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>*.jsp</url-pattern>
  <url-pattern>*.jspf</url-pattern>
  <url-pattern>*.jspx</url-pattern>
  <url-pattern>*.xsp</url-pattern>
  <url-pattern>*.JSP</url-pattern>
  <url-pattern>*.JSPF</url-pattern>
  <url-pattern>*.JSPX</url-pattern>
  <url-pattern>*.XSP</url-pattern>
  </servlet-mapping>
   
  <servlet id=>"my-servlet">
  <servlet-name>myServlet</servlet-name>
  <servlet-class>com.acme.servlet.MyServlet</servlet-class>
   ...

用JSTL标签库

JavaServer Pages Standlard Tag Library(JSTL)是Jetty发布版本的一部分(在$JETTY_HOME/lib/jsp)中。

用JSF标签库

下面提供关于使用JSF标签库的信息。

在Jetty发布中使用JSF标签库

如果你想在你的webapp中使用JSF,你需要拷贝JSF实现Jar(你选择的JSF实现中包含META-INF/*.tld文件的jar)进入Jetty的共享容器库文件夹。你能放他们到lib文件夹匹配你选择的JSP容器(或者Glassfish JSP的$JETTY_HOME/lib/jsp,或者Apache JSP的$JETTY_HOME/lib/apache-jsp),或者放它们进入$JETTY_HOME/lib/ext。

用Jetty Maven插件使用JSF标签库

你应该使你的JSF Jar依赖插件,而不是webapp自身。例如:

 

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <configuration>
     <webApp>
       <contextPath>/${artifactId}</contextPath>
     </webApp>
     <scanIntervalSeconds>5</scanIntervalSeconds>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.0.8</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.0.8</version>
   </dependency>
  </dependencies>
</plugin>
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我理解您的问题是如何在JDK17中内嵌Jetty11并配置JSP界面。首先,需要在项目中添加Jetty11的依赖,例如Maven项目可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-webapp</artifactId> <version>11.0.6</version> </dependency> ``` 然后,在代码中启动Jetty11并配置JSP界面,可以参考以下示例代码: ```java import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class EmbeddedJetty { public static void main(String[] args) throws Exception { Server server = new Server(8080); WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); webapp.setResourceBase("src/main/webapp"); webapp.setClassLoader(Thread.currentThread().getContextClassLoader()); webapp.setConfigurationClasses(new String[]{"org.eclipse.jetty.webapp.WebInfConfiguration", "org.eclipse.jetty.webapp.WebXmlConfiguration"}); webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/[^/]*jstl.*\\.jar$"); webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/[^/]*taglibs.*\\.jar$"); webapp.setDescriptor("src/main/webapp/WEB-INF/web.xml"); webapp.setParentLoaderPriority(true); server.setHandler(webapp); server.start(); server.join(); } } ``` 此代码将在8080端口启动Jetty11并将Web应用程序部署在src/main/webapp目录下。在此目录下,您可以创建一个JSP文件并通过http://localhost:8080/访问它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值