web-dev-qa-db-ja.com

/ xyz / {value} / testのようなサーブレットとパスのパラメーター、web.xmlでマップする方法

サーブレットは次のようにURLをサポートしていますか?

/xyz/{value}/test

値はテキストまたは数字に置き換えることができます。

Web.xmlでそれをマップする方法?

31
BlackEagle

マッピングの途中でURLパターンワイルドカード_*_を使用することは、サーブレットAPIでサポートされていません。 so _*_のようなマッピングの終わり、またはso _/prefix/*_のようなマッピングの始まりでのみワイルドカード_*.suffix_を許可します。

標準的なURLパターン構文では、_/xyz/*_にマップし、 HttpServletRequest#getPathInfo() を使用してパス情報を抽出するのが最善の策です。

したがって、_<url-pattern>/xyz/*</url-pattern>_を指定すると、パス情報、nullチェック、および配列インデックスの範囲外チェックを抽出する基本的なキックオフの例が省略されます。

_String pathInfo = request.getPathInfo(); // /{value}/test
String[] pathParts = pathInfo.split("/");
String part1 = pathParts[1]; // {value}
String part2 = pathParts[2]; // test
// ...
_

Apache HTTPDの_mod_rewrite_で可能な限り詳細な制御が必要な場合は、Tuckeyの RL書き換えフィルター を参照してください。

47
BalusC

他の人が示したように、サーブレット仕様ではそのようなパターンは許可されていません。ただし、ユースケースに適している場合は、このようなパターンを許可する JAX-RS を検討できます。

@Path("/xyz/{value}/test")
public class User { 

    public String doSomething(@PathParam("value") final String value) { ... }

}

または:

@Path("/xyz/{value}")
public class User { 

    @Path("test")
    public String doTest(@PathParam("value") final String value) { ... }

}

(関連: https://stackoverflow.com/a/8303767/84309 。)

7
shelley

そのURLのマッピングはサポートされています。しかし、検証は提供していません。

Web xmlでは、これを行うことができます。

/xyz/*

しかし、それは末尾のtestが存在し、それが最後のアイテムであることを保証しません。もっと洗練されたものを探しているなら、urlrewritefilterを試してみるべきです。

http://code.google.com/p/urlrewritefilter/

3
Dave

Web.xmlでこれを行うべきではなく、すべてのリクエストをフィルター(Patternfilter)に向けてURLを確認できます。

package com.inventwheel.filter;

import Java.io.IOException;
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class PatternFilter
 */
@WebFilter("/*")
public class PatternFilter implements Filter {

    /**
     * Default constructor. 
     */
    public PatternFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            String servletPath = ((HttpServletRequest)request).getServletPath();
            String requestURI = ((HttpServletRequest)request).getRequestURI();
            Pattern pattern = Pattern.compile(".*"+servletPath+"/(.*)");
            Matcher matcher = pattern.matcher(requestURI);
            if (matcher.matches())
            {
            String param = matcher.group(1);
            // do stuff with param here..
            }

        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}
0
Sanjay Kumar

上記のように、ベースサーブレットは、質問で指定したようなパターンをサポートしていません。 Spring MVCはパターンをサポートします。 ここSpring Reference Document の関連セクションへのリンクです。

0
DwB