我的servlet按slug显示产品详细信息
@WebServlet("/*") public class ProductDetails extends HttpServlet {
例如:mywebsite.com/product-name但是他们不能加载css,js和img文件,因为它检测到一个slug的pathinfo。如何排除它们而不加载到servlet中?
ezykj2lf1#
不幸的是,servlet规范没有为url模式Map定义排除规则。此外,匹配路径优先于匹配后缀(参见Servlet4规范,第12.1和12.2段)。这个servlet上的Map将匹配应用程序上下文路径中的任何内容,包括静态资源。你能做什么:您可以分割逻辑来处理该servlet中的静态资源。我不赞成这样做,它可能会使代码复杂化并损害关注点的分离。如果你的静态资源在一个特定的目录中,没有slug会匹配它(例如,所有js,css,html,图片文件在 assets/ ),您可以有另一个servlet来服务这个目录下的静态内容(例如。 @WebServlet("/assets/*") ). 匹配请求的最长路径Map优先。您仍然需要编写将文件发送回客户端的代码;这段代码相当简单,您有机会自定义静态文件的头(例如缓存),而且,与以前的解决方案相比,处理静态文件的代码位于它自己的servlet中,因此可以很好地分离关注点。如果您不想为自己提供静态文件而烦恼(我不会责怪您),您可以将逻辑从servlet移动到另一个类。然后引入一个servlet过滤器,它将首先检查请求是否是静态资源的get,如果是,则只调用 filterChain.doFilter(request,response) 并让应用服务器处理静态文件。如果没有,它将调用您的逻辑并发送servlet本应发送的响应。最后,如果您通过 @WebServlet("/") (不是 "/*" ). 它将接收其他servlet不接收的任何请求。应用服务器应该为静态内容安装一个servlet,该servlet将为应用程序中的任何现有css、js等文件提供服务。其他任何内容最终都会出现在默认的servlet中。如果您能找到一种将静态内容与动态内容分开的方法,例如 assets/ ,虚拟路径下的所有动态内容 content/ 将servlet的Map更改为 /content/* 就这样吧。
assets/
@WebServlet("/assets/*")
filterChain.doFilter(request,response)
@WebServlet("/")
"/*"
content/
/content/*
1条答案
按热度按时间ezykj2lf1#
不幸的是,servlet规范没有为url模式Map定义排除规则。此外,匹配路径优先于匹配后缀(参见Servlet4规范,第12.1和12.2段)。这个servlet上的Map将匹配应用程序上下文路径中的任何内容,包括静态资源。
你能做什么:
您可以分割逻辑来处理该servlet中的静态资源。我不赞成这样做,它可能会使代码复杂化并损害关注点的分离。
如果你的静态资源在一个特定的目录中,没有slug会匹配它(例如,所有js,css,html,图片文件在
assets/
),您可以有另一个servlet来服务这个目录下的静态内容(例如。@WebServlet("/assets/*")
). 匹配请求的最长路径Map优先。您仍然需要编写将文件发送回客户端的代码;这段代码相当简单,您有机会自定义静态文件的头(例如缓存),而且,与以前的解决方案相比,处理静态文件的代码位于它自己的servlet中,因此可以很好地分离关注点。如果您不想为自己提供静态文件而烦恼(我不会责怪您),您可以将逻辑从servlet移动到另一个类。然后引入一个servlet过滤器,它将首先检查请求是否是静态资源的get,如果是,则只调用
filterChain.doFilter(request,response)
并让应用服务器处理静态文件。如果没有,它将调用您的逻辑并发送servlet本应发送的响应。最后,如果您通过
@WebServlet("/")
(不是"/*"
). 它将接收其他servlet不接收的任何请求。应用服务器应该为静态内容安装一个servlet,该servlet将为应用程序中的任何现有css、js等文件提供服务。其他任何内容最终都会出现在默认的servlet中。如果您能找到一种将静态内容与动态内容分开的方法,例如
assets/
,虚拟路径下的所有动态内容content/
将servlet的Map更改为/content/*
就这样吧。