2015-01-23 2 views
0

Я хочу правильно отобразить свой сервлет 1) Я хочу, чтобы он пришел к этому сервлету, когда URL-адрес подобен «show.jsp/anything», т.е. когда пользователь вводит «show.jsp /» + анимирование, состоящее из «алфавитов и цифр» "но не "символы", то есть, когда пользователь вводит "show.jsp/1232342 $ 3 = 4" он должен бросить ошибку мой MappingКак правильно нанести сервлет?

<servlet> 
     <servlet-name>show</servlet-name> 
     <jsp-file>/show.jsp</jsp-file> 
</servlet> 
<servlet-mapping> 
     <servlet-name>show</servlet-name> 
     <url-pattern>/show.jsp/*</url-pattern> 
</servlet-mapping> 

, когда пользователь вводит " show.jsp/ASD% & hdfsjf ", он должен перейти к другому URL-адресу , т.е. что я должен писать вместо

<url-pattern>/show.jsp/*</url-pattern> 

ответ

1

Возможно, это не ожидаемый ответ, но вам нужно будет использовать то, что предлагает Java EE. Спецификация Servlet 3.0 говорит:

В дескрипторе развертывания веб-приложений, следующий синтаксис используется для определения отображения:

  • Строка, начиная с / символа и заканчивая /* суффикс используется для отображения пути ,
  • Строка, начинающаяся с префикса *., используется в качестве отображения расширений.
  • Пустая строка ("") представляет собой специальный шаблон URL, который точно сопоставляется с корнем контекста приложения , то есть запросами формы http://host:port/ /. В этом случае информация о пути - /, а путь сервлетов и путь контекста - пустая строка ("").
  • Строка, содержащая только символ /, указывает «сервлет программы по умолчанию» приложения. В этом случае путь сервлета является URI запроса минус путь контекста, а информация о пути имеет значение null.
  • Все остальные строки используются только для точных совпадений.

Это означает, что вы не можете делать то, что вы хотите, за исключением того, что вы можете использовать тот факт, что контейнер будет использовать:

  • первое точное совпадение
  • следующий самый длинный матч

Например, если вы хотите нанести на карту /show.jsp/asd сервлету и /show.jsp/* другому, это возможно. Но нет способа различить тип символов.

Это не соответствует тому, что вы хотите, но это так, как это работает ...


Если вы действительно хотите сделать это, вам придется разработать реле сервлет, отображенный на `/ шоу .jsp/*». Он проанализирует строку PathInfo и переадресует один из других (неотобразованных) сервлетов в зависимости от того, содержит ли они символы не алфавита или нет.

В Интернете.XML:

<servlet> 
     <servlet-name>relay</servlet-name> 
     <servlet-class>distinguished.classof.Relay</servlet-class> 
</servlet> 
<servlet> 
     <servlet-name>show</servlet-name> 
     <jsp-file>/show.jsp</jsp-file> 
</servlet> 
<servlet> 
     <servlet-name>other</servlet-name> 
     <jsp-file>/other.jsp</jsp-file> 
</servlet> 
<servlet-mapping> 
     <servlet-name>relay</servlet-name> 
     <url-pattern>/show.jsp/*</url-pattern> 
</servlet-mapping> 

Реле:

public class Relay extends HttpServlet { 
    static final String SHOW = "show"; 
    static final String OTHER= "other"; 
    private Pattern pattern; 


    @Override 
    protected void service(HttpServletRequest hsr, HttpServletResponse hsr1) throws ServletException, IOException { 
     String info= hsr.getPathInfo(); 
     RequestDispatcher dispatcher = getServletContext.getNamedDispatcher(
       pattern.matcher(info).matches() ? SHOW : OTHER); 
     dispatcher.forward(hsr, hsr1); 
    } 

    @Override 
    public void init() throws ServletException { 
     pattern = Pattern.compile("\\w*"); 
    } 
} 
Смежные вопросы