2012-01-03 37 views

Trả lời

39

Nó không được API Servlet hỗ trợ để có ký tự đại diện mẫu URL * ở giữa bản đồ. Nó chỉ cho phép ký tự đại diện * vào cuối ánh xạ như vậy /prefix/* hoặc khi bắt đầu ánh xạ như vậy *.suffix.

Với cú pháp mẫu URL được phép chuẩn, đặt cược tốt nhất của bạn là ánh xạ nó trên /xyz/* và trích xuất thông tin đường dẫn bằng cách sử dụng HttpServletRequest#getPathInfo().

Vì vậy, đưa ra một <url-pattern>/xyz/*</url-pattern>, đây là một ví dụ Kickoff cơ bản như thế nào để trích xuất các thông tin đường dẫn, kiểm tra vô số mảng nằm ngoài giới hạn kiểm tra bỏ qua:

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

Nếu bạn muốn kiểm soát nhiều hơn mịn hạt giống càng tốt với mod_rewrite của Apache HTTPD, sau đó bạn có thể xem số URL rewrite filter của Tuckey.

+0

Cảm ơn bạn! Điều này giải quyết được vấn đề của tôi. – BlackEagle

+0

Đây có phải là cách * thực sự cần trích xuất các tham số url không phải là tham số GET không? Điều này có vẻ khá cồng kềnh, khó duy trì, dễ bị lỗi và năm 1995 nói chung. – Herbert

+2

@Herbert: chỉ cần sử dụng một khung công tác trên API Servlet hỗ trợ các tham số đường dẫn, chẳng hạn như JAX-RS hoặc MVC. – BalusC

3

Tính năng này hỗ trợ ánh xạ url đó; nhưng không cung cấp bất kỳ xác nhận nào.

Trong xml web của bạn, bạn có thể làm điều này ....

/xyz/* 

Nhưng điều đó sẽ không đảm bảo rằng các dấu test là hiện tại và đó là mục cuối cùng. Nếu bạn đang tìm kiếm một cái gì đó tinh vi hơn, bạn nên thử urlrewritefilter.

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

0

Như đã trình bày ở trên, servlets cơ sở không hỗ trợ các mẫu như bạn chỉ định trong câu hỏi của bạn. Spring MVC hỗ trợ các mẫu. Here là liên kết đến phần thích hợp trong số Spring Reference Document.

0

Bạn không nên làm điều đó trong web.xml thay vì bạn có thể trỏ mọi yêu cầu để lọc của bạn (Patternfilter) và có thể kiểm tra 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 
    } 

} 
7

Như những người khác đã chỉ ra, các đặc điểm kỹ thuật servlet không cho phép các mẫu như vậy; tuy nhiên, bạn có thể xem xét JAX-RS cho phép các mẫu như vậy, nếu điều này phù hợp với trường hợp sử dụng của bạn.

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

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

} 

Hoặc:

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

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

} 

(liên quan đến:. https://stackoverflow.com/a/8303767/843093)

-2

Bạn có thể sử dụng thư viện này: http://zerh.github.io/ServletIO/, vì vậy bạn có thể chuyển đổi servlets của bạn trong bộ điều khiển MVC và sử dụng khá url

+1

Dựa trên tên miền/URL của (các) liên kết của bạn giống hoặc có chứa tên người dùng của bạn, dường như bạn đã liên kết với trang web của riêng mình. Nếu bạn làm như vậy, bạn * phải tiết lộ rằng đó là trang web của bạn *. Nếu bạn không tiết lộ rằng đó là trang web của riêng bạn, nó thường được coi là spam. Xem: [** Điều gì có nghĩa là quảng cáo tự "Tốt"? **] (// meta.stackexchange.com/q/182212) và [Cách không phải là người gửi spam] (// stackoverflow.com/help/promotion). – Makyen

+0

Liên kết tới giải pháp tiềm năng luôn được chào đón, nhưng vui lòng [thêm ngữ cảnh xung quanh liên kết] (// meta.stackoverflow.com/a/8259) để người dùng đồng nghiệp của bạn sẽ biết ý tưởng đó là gì và tại sao lại có. ** Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang web mục tiêu không thể truy cập hoặc vĩnh viễn ngoại tuyến. ** Hãy xem xét rằng _barely nhiều hơn một liên kết đến một trang web bên ngoài là một lý do có thể là [Tại sao và một số câu trả lời đã bị xóa như thế nào?] (// stackoverflow.com/help/deleted-answers). – Makyen

Các vấn đề liên quan