我目前正在开发一个 Java EE 网络框架,我想知道如何路由我的 URL...我想要支持 HMVC 功能! URL 将遵循此规则:
/module_name/controller_name/action_name,其中:
模块名称:由斜杠分隔的路径...例如:模块“X”的子模块“Y”:/X/Y controller_name:没有特殊字符的 Controller 名称 action_name: 没有特殊字符的 Action 名称
我想将/module_name/controller_name/映射到特定的 servlet Controller ! Action 部分是该类的公共(public)方法! :)
我怎么能做到这一点?使用过滤器?如果可能的话,我想要一个例子!
最佳答案
我看到 3 种方法:过滤器、基本 servlet(所有请求都通过主 servlet)或“servlet-mapping”
过滤器
本例重写url
http://example.org/<int value>to
http://example.org/user?id=<int value>i.e
http://example.org/1234 -> http://example.org/user?id=1234
- determinate filter in web.xml
<filter> <filter-name>Router</filter-name> <filter-class>org.example.Router</filter-class> <init-param> <param-name>param1</param-name> <param-value>valueOfparam1</param-value> </init-param> </filter> <filter-mapping> <filter-name>Router</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
in init-param section you can specify route rules
filter class
public class Router implements javax.servlet.Filter { private static final Pattern REWRITE_PATTERN = Pattern.compile("(^[1-9]\\d*)$"); @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException { //this method calling before controller(servlet), every request HttpServletRequest request = (HttpServletRequest) req; String url = request.getRequestURL().toString(); String number = url.substring(url.lastIndexOf("/")).replace("/", ""); Matcher m = REWRITE_PATTERN.matcher(number); if(m.find()) { RequestDispatcher dispatcher = request.getRequestDispatcher("user?id=" + m.group(1)); dispatcher.forward(req, res); } else { fc.doFilter(req, res); } } @Override public void init(FilterConfig fc) throws ServletException { //here you may read params from web.xml }}
基本 sevlet
public class BasicServlet extends HttpServlet {
//route rules here, and rewrite
}
servlet 映射
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<uri-mapping>/user/*</uri-mapping>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PostServlet</servlet-name>
<uri-mapping>/post/*</uri-mapping>
</servlet-mapping>
- 过滤器 - 更灵活,不需要认真修改工作代码
- 基本 servlet - 灵活,需要更改代码
- servlet 映射 - 简单,不灵活(针对特定路由规则)
关于jsp - 如何制作 URL 过滤器以使用 Servlet 路由操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680192/