如何制作URL过滤器以使用Servlet路由动作? [英] How to make a URL filter to route actions with Servlets?
问题描述
我目前正在开发Java EE Web框架,我想知道如何路由我的URL.我想支持HMVC功能! URL将遵循以下规则:
I'm currently developing a Java EE web framework and I would want to know how I could route my URL's... I want support HMVC feature! URL's will follow this rule:
/module_name/controller_name/action_name,其中:
/module_name/controller_name/action_name, where:
module_name:路径之间用斜杠分隔...例如:模块"X"的子模块"Y":/X/Y controller_name:控制器名称,无特殊字符 action_name:不带特殊字符的动作名称
module_name: path separated by slashes... Ex.: Submodule "Y" of Module "X": /X/Y controller_name: name of controller with no special chars action_name: name of action with no special chars
我想将/module_name/controller_name/映射到特定的servlet控制器!动作部分是该类的公共方法! :)
I would like map /module_name/controller_name/ to a specific servlet controller! Action part is a public method on that class! :)
我该怎么做?使用过滤器?如果可能的话,我想举个例子!
How I could do this? Using filters? I want an example, if possible!
推荐答案
我看到3种方式:过滤器,基本servlet(所有通过主servlet的请求)或"servlet映射"
i see 3 ways: filter, basic servlet(all requests via main servlet) or "servlet-mapping"
过滤器
此示例将url
http://example.org/<int value>
重写为
http://example.org/user?id=<int value>
即
http://example.org/1234 -> http://example.org/user?id=1234
- 确定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>
在init-param部分中,您可以指定路由规则
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映射-简单,不灵活(对于特定的路由规则)
这篇关于如何制作URL过滤器以使用Servlet路由动作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!