Servlets Servlet和路径参数,如/xyz/{value}/test,如何在web.xml中映射?

Servlets Servlet和路径参数,如/xyz/{value}/test,如何在web.xml中映射?,servlets,get,web.xml,path-parameter,Servlets,Get,Web.xml,Path Parameter,servlet是否支持如下URL: /xyz/{value}/test 其中值可以由文本或数字替换 如何在web.xml中映射它?Servlet API不支持在映射中间使用URL模式通配符*。它只允许在映射的末尾(如so/前缀/*)或映射的开头(如so*后缀)使用通配符* 使用标准允许的URL模式语法,您最好将其映射到/xyz/*,并使用提取路径信息 因此,给定一个/xyz/*,下面是一个基本的启动示例,说明如何提取路径信息、空检查和数组索引越界检查: String pathInfo = re

servlet是否支持如下URL:

/xyz/{value}/test
其中值可以由文本或数字替换


如何在web.xml中映射它?

Servlet API不支持在映射中间使用URL模式通配符
*
。它只允许在映射的末尾(如so
/前缀/*
)或映射的开头(如so
*后缀)使用通配符
*

使用标准允许的URL模式语法,您最好将其映射到
/xyz/*
,并使用提取路径信息

因此,给定一个
/xyz/*
,下面是一个基本的启动示例,说明如何提取路径信息、空检查和数组索引越界检查:

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

如果您希望使用ApacheHttpd的
mod_rewrite
实现更细粒度的控制,那么您可以查看或。

Servlet API不支持在映射中间使用URL模式通配符
*
。它只允许在映射的末尾(如so
/前缀/*
)或映射的开头(如so
*后缀)使用通配符
*

使用标准允许的URL模式语法,您最好将其映射到
/xyz/*
,并使用提取路径信息

因此,给定一个
/xyz/*
,下面是一个基本的启动示例,说明如何提取路径信息、空检查和数组索引越界检查:

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

如果您希望使用ApacheHttpd的
mod_rewrite
实现更细粒度的控制,那么您可以查看或。

它确实支持映射该url;但没有提供任何验证

在web xml中,您可以这样做

/xyz/*
但这并不能保证后面的
测试存在,并且它是最后一项。如果你在寻找更复杂的东西,你应该试试URLEwriteFilter


它确实支持映射该url;但没有提供任何验证

在web xml中,您可以这样做

/xyz/*
但这并不能保证后面的
测试存在,并且它是最后一项。如果你在寻找更复杂的东西,你应该试试URLEwriteFilter


如上所述,基本servlet不支持您在问题中指定的模式。SpringMVC确实支持模式。是指向中相关部分的链接。

如上所述,基本servlet不支持您在问题中指定的模式。SpringMVC确实支持模式。是指向中相关部分的链接。

您不应该在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
    }

}

您不应该在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
    }

}

正如其他人所指出的,servlet规范不允许这样的模式;但是,如果这适合您的用例,您可能会考虑允许这样的模式。

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

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

}
或:


(与:)

正如其他人所指出的,servlet规范不允许这种模式;但是,如果这适合您的用例,您可能会考虑允许这样的模式。

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

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

}
或:


(相关:)

没有一个Servlet不支持这样的模式,其他人提到的可能方法也是在
xyz
之后使用
/*
,但这不会检查
{value}
/test
。您最好选择Spring或JAX-RS。但是,如果您计划坚持使用Servlet,则可以使用更好的编写方式:


@WebServlet(urlPatterns={/xyz/*“})
没有一个Servlet不支持这样的模式,其他人提到的可能方法也是在
xyz
之后使用
/*
,但这不会检查
{value}
/test
。您最好选择Spring或JAX-RS。但是,如果您计划坚持使用Servlet,则可以使用更好的编写方式:


@WebServlet(urlPatterns={”/xyz/*“})

与:(可能重复)相关。与:(可能重复)相关。这真的是提取不是GET参数的url参数的方法吗?这看起来很臃肿,很难维护,容易被错误和错误抵消。@Herbert:只需在Servlet API上使用一个支持路径参数的框架,如JAX-RS或MVC。另一个选项是getRequestURI(),在我的例子中getPathInfo()是空的。@Leventuver:在过滤器中它将是空的,或者当请求中的某个地方使用了一个实现糟糕的请求包装器时,或者由于servletcontainer中的一个bug。我修改了一个扩展GenericFilterBean的类。使用ServletRequest作为输入。这真的是提取不是GET参数的url参数的方法吗?这看起来很臃肿,很难维护,容易被错误和错误抵消。@Herbert:只需在Servlet API上使用一个支持路径参数的框架,如JAX-RS或MVC。另一个选项是getRequestURI(),在我的例子中getPathInfo()是空的。@Leventuver:在过滤器中它将是空的,或者当请求中的某个地方使用了一个实现糟糕的请求包装器时,或者由于servletcontainer中的一个bug。我修改了一个扩展GenericFilterBean的类。使用ServletRequest作为输入。