我正在运行Apache Tomcat V7.0.26。
在/ test下有一个JAX-RS servlet,它调用jsps,在tourn中应该由Tomcat servlet引擎处理。
如,
/test
应由jersey处理,但/test/result.jsp
应由JSP引擎处理。
我不希望用户看到不同的网址,因此,我在内部将jsp网址重写为/ jsp。
Config就是这样:
UrlRewriteFilter(在urlrewrite.xml
中):
<rule>
<from>^/([^j][^s][^p].*\.jsp)</from>
<to>/jsp/$1</to>
</rule>
web.xml
:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<!-- set the amount of seconds the conf file will be checked for reload
can be a valid integer (0 denotes check every time,
empty/not set denotes no reload check) -->
<init-param>
<param-name>confReloadCheckInterval</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
对/xyz.jsp
的来电被重定向到/jsp/xyz.jsp
。致/test/xyz.jsp
的电话会导致404 - Servlet Test is not available
。我认为过滤器优先于servlet,不是吗?
我知道相关问题Servlet vs Filter,但他们没有说明优先顺序。
BTW:PrettyFaces似乎与UrlRewriteFilter类似,但我还没有尝试过。我(目前)更喜欢UrlRewriteFilter。
编辑:问题How to mix server-side Jax-rs call with native files without prefix?询问我的问题背后的问题。
答案 0 :(得分:1)
实际上,你可以很容易地使它工作,你不需要任何网址重写。只需将您的jsp放入test / dir,将Jersey注册为servlet过滤器而不是servlet(即将所有出现的 servlet 替换为web.xml中的过滤器)并添加com.sun.jersey.config.feature.FilterForwardOn404 init param设置为true。生成的web.xml应如下所示:
<filter>
<filter-name>Test</filter-name>
<filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>test</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Test</filter-name>
<url-pattern>/test/*</url-pattern>
</filter-mapping>
答案 1 :(得分:0)
似乎这样的设置不起作用。将所有休息服务放在/rest
以及/jsp
下的所有jsps处理都可以。