是否可以在运行时添加 servlet 映射?通过ContextListenerServlet 的方法还是在 Servlet 的方法中init()?
在我使用的应用程序中,所有请求都通过单个 Servlet 处理,并且它们的映射在web.xml文件中定义。映射的数量正在增加,添加新的映射需要新的版本。
将 servlet 映射到/*将不起作用,因为分派到JSP 的请求和静态内容也会路由到此 Servlet。
尽管如此,使用过滤器可能是一种选择,它会增加过滤器的要求,以了解 RequestDispatcher 的前缀路径。
例如:
调度程序 Servlet 映射
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
路由过滤器定义
<filter>
<filter-name>RoutingFilter</filter-name>
<filter-class>com.ssv.web.filter.RoutingFilter</filter-class>
<init-param>
<param-name>exclude</param-name>
<param-value>/static/**:/action/**:/**/*.jsp</param-value>
</init-param>
<init-param>
<param-name>dispatcher-prefix</param-name>
<param-value>/action/**</param-value>
</init-param>
</filter>
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我想跳过创建过滤器、过滤器映射和 servlet 映射,而是在ContextListener.
我正在使用汤姆猫。
我想在遇到404时进行搜索.例如,用户想查看有意大利菜的餐馆,他们会去www.mywebsite.com/italian,所以我想添加一个过滤器,首先检查404是否已经过抛出,如果是这样,尝试搜索搜索项列表,如果存在匹配,则向该页面转发请求而不是抛出404错误.
例:
www.mywebsite.com/italian --> www.mywebsite.com/search.do?cuisine=italian
www.mywebsite.com/london --> www.mywebsite.com/search.do?city=london
www.mywebsite.com/rest --> www.mywebsite.com/show.do?rest_id=XXX
Run Code Online (Sandbox Code Playgroud)
我想这个问题是我会怎样确定是否存在不存在与servlet url-mapping "/italian"或"/italian/*"我的服务器配置中的?
使用(在Filter.doFilter中)request.getRequestDispatcher(request.getRequestURI())始终返回一个非空值,我无法用它来确定请求是否有效.我可以使用404错误语句,但结果的响应状态为404而不是200.