【问题标题】:How to make a URL filter to route actions with Servlets?如何制作 URL 过滤器以使用 Servlet 路由操作?
【发布时间】:2012-07-25 16:23:07
【问题描述】:

我目前正在开发一个 Java EE Web 框架,我想知道如何路由我的 URL……我想要支持 HMVC 功能! URL 将遵循此规则:

/module_name/controller_name/action_name,其中:

module_name:由斜杠分隔的路径... 例如:模块“X”的子模块“Y”:/X/Y controller_name:没有特殊字符的控制器名称 action_name:没有特殊字符的动作名称

我想将 /module_name/controller_name/ 映射到特定的 servlet 控制器!动作部分是该类的公共方法! :)

我怎么能做到这一点?使用过滤器?如果可能的话,我想要一个例子!

【问题讨论】:

    标签: jsp url servlets routes


    【解决方案1】:

    我看到了 3 种方式:过滤器、基本 servlet(所有请求都通过主 servlet)或“servlet-mapping”

    过滤器

    本例重写url

    http://example.org/
    http://example.org/user?id=
    IE
    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 部分你可以指定路由规则

    1. 过滤器类

      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 映射 - 简单,不灵活(针对特定路由规则)

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多