Съпоставяне на два сървлета в web.xml, където единият URL шаблон е подниз на другия

Имам уеб приложение, където бих искал да свържа JSP към адрес http://host:port/status и сървлет към адреси като http://host:port/status/.... Възможно ли е това? Според тази статия трябва да е възможно ("контейнерът предпочита точно съвпадение на пътя през съвпадение на път с заместващ знак") поне за някои контейнери и спецификацията на Java Servlet съдържа подобни примери (макар и без заместващ знак, на стр. 12-123 във версията от април 2013 г.), но ако опитам следното в web.xml, изглежда като ако JSP никога не се извиква и всички заявки (също към http://host:port/status) се насочват към сървлета. Моят JSP и сървлет се хостват на Google App Engine.

<servlet>
    <servlet-name>Status</servlet-name>
    <jsp-file>/Status.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>Status</servlet-name>
    <url-pattern>/status</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>StatusUpload</servlet-name>
    <servlet-class>com.example.StatusUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>StatusUpload</servlet-name>
    <url-pattern>/status/*</url-pattern>
</servlet-mapping>

person Drux    schedule 08.05.2014    source източник
comment
Какъв изобщо би бил смисълът да се прави това?   -  person developerwjk    schedule 09.05.2014
comment
@developerwjk Напр. това: данните се събират чрез POST заявки, които пристигат на status/postfix. Потребителите могат да изследват събраните от насекоми данни на status. Поддържа URL пространството от имена чисто IMHO.   -  person Drux    schedule 09.05.2014


Отговори (1)


Вместо да съпоставяте един и същ url към два различни JSP/Servlet в web.xml, можете да използвате филтър за пренаписване на URL като Tuckey UrlRewriteFilter, който използва конфигурационен файл urlrewrite.xml, който също ще бъде поставен в WEB-INF. Той използва регулярен израз в правилата.

Тези две правила трябва да направят това, което искате:

      <rule>
        <from>^/status$</from>
        <to>/Status.jsp</to>
      </rule>
      <rule>
        <from>^/status/(.*)$</from>
        <to>/StatusUpload/?param=$1</to>
      </rule>

След това в WEB-INF вече няма да картографирате JSP, а ще картографирате сървлета към StatusUpload. Когато потребителят отиде на /status/postfix, филтърът за пренаписване на URL ще препрати към сървлета (с постфиксната част, предадена като параметър) в задната част, без адресът, който потребителят вижда в адресната лента, да се промени.

person developerwjk    schedule 09.05.2014
comment
+1 Интересно, но твърде сложно за моята цел (твърде много колела). Все още се надявам, че това може да се направи само на ниво web.xml/url-pattern. - person Drux; 10.05.2014
comment
Изисква още един jar файл от 174kb. Но тъй като правилата за пренаписване използват регулярни изрази, той е много по-мощен и няма да се налага сами да анализирате постфиксната част на вашия url в параметри, което ще направите с метода web.xml. Причината, поради която се поколебах да предложа това в началото, беше, че от въпроса не стана ясно, че ще използвате части от пътя на url като параметри, но мисля, че ще го направите. - person developerwjk; 12.05.2014