2012-07-27 80 views
1

我目前正在開發一個Java EE web框架,我想知道如何路由我的URL ...我想支持HMVC功能!網址將遵循這樣的規則:如何使用URL過濾器來將操作與Servlet路由?

/MODULE_NAME/CONTROLLER_NAME/ACTION_NAME,其中:

MODULE_NAME:路徑由模塊 「X」 的斜線...例:子模塊 「Y」 分隔:/ X/Y controller_name:沒有特殊字符的控制器的名稱 action_name:沒有特殊字符的動作名稱

我想map/module_name/controller_name /到特定的servlet控制器!動作部分是該類的公共方法! :)

我怎麼能做到這一點?使用過濾器?我想要一個例子,如果可能的話!

回答

12

我看到3種方式:濾波器,基本的servlet(經由主servlet的所有請求)或 「小服務程序映射」

濾波器

此示例重寫網址

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部分

你可以指定路由規則

  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映射 - 簡單地說,不靈活(針對具體的路線規則)
相關問題