如何制作URL过滤器以使用Servlet路由动作? [英] How to make a URL filter to route actions with Servlets?

查看:85
本文介绍了如何制作URL过滤器以使用Servlet路由动作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开发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

  1. 确定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

  1. 过滤器类

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆