フィルタ、基本サーブレット(メインサーブレットを介したすべてのリクエスト)、または「サーブレットマッピング」の3つの方法があります。
フィルター
この例は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セクションでは、ルートルールを指定できます
フィルタクラス
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-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>
- フィルタ-より柔軟で、作業コードを大幅に変更する必要はありません
- 基本サーブレット-柔軟で、コードを変更する必要があります
- サーブレットマッピング-単純に、柔軟性がない(特定のルートルールの場合)