2012-02-24 1 views
1

Я хотел бы, чтобы отобразить все URL-адреса для одного главного сервлета, кроме моих статических файлов (например, таблиц стилей, графики и прочее) и все еще быть в состоянии позвонить из моих страниц JSP сервлетов ..(почти) все URL-адреса на один сервлет

Мое намерение состоит в том, чтобы предоставить пользователям «URL-адрес суеты», чтобы любой URL-адрес, который не указывает на статический файл или ресурс, отображается на мой основной сервлет.

Как это сделать?

Если это помогает, я могу иметь все свои статические файлы и JSP в отдельных папках. Есть ли способ сопоставить эти папки перед/* mapping ..?

+5

О боже, я работаю с такой системой, и это боль в попке! Даже если бы я знал это, я бы не сказал вам. – MartinL

+0

Вы хотите катить свой собственный фрейм? – home

+1

До сих пор я нашел это решение: http://stackoverflow.com/questions/870150/how-to-access-static-resources-when-using-default-servlet/3593513#3593513 – KarmicMind

ответ

0

Вдохновленный How to access static resources when mapping a global front controller servlet on /* Я пришел к этому решению:

в /war/WEB-INF/web.xml:

<filter> 
    <filter-name>MainFilter</filter-name> 
    <filter-class>com.example.mywebsite.MainFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>MainFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet> 
    <servlet-name>MainServlet</servlet-name> 
    <servlet-class>com.example.mywebsite.MainServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern>/MainServlet/*</url-pattern> 
</servlet-mapping> 

в MainFilter.java:

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    String path = req.getRequestURI(); 
    String topfolder = path.substring(1); 
    if (topfolder.contains("/")) { 
     topfolder = topfolder.substring(0, topfolder.indexOf("/")); 
    } 

    if (topfolder.startsWith("_")) { 
     chain.doFilter(request, response); 
    } else if (topfolder.endsWith(":")) { 
     request.getRequestDispatcher(path.replaceFirst(":", "")).forward(request, response); 
    } else { 
     request.getRequestDispatcher("/MainServlet" + path).forward(request, response); 
    } 

} 

Теперь вы можете положить все ваши статическое содержимое в подпапки в вашей ВОЙНЫ. Тогда, если вы хотите сделать ссылку на /war/css/style.css от вашего HTML, вы просто ссылаться на него как "/css:/style.css" .. Или вы можете назвать ваши папки/файлы с _ в начале и относятся к ним как обычно ..

(Также Правило _ гарантирует, что разработчики Google App Engine могут получить доступ к /_ah/admin)

0

Как правильно сказано в комментарии, используйте отдельный сервлет для отдельных JSP, если для этого не существует обоснованной причины. Если вы хотите это сделать, вы можете просто иметь блок if--else в своем сервлете, который сопоставляется различными URL-адресами и на основе входящего и отправляемого запроса в соответствующий JSP.

Как

... 
else if(request.getServletPath().equals("/user/account")){ 
     //relevant processing and setting request attribute goes here 
     request.getRequestDispatcher("account_jsp_page.jsp").forward(request, response); 
} 
else if (....){ 
.... 

Я предлагаю против этого плана. лучше сделайте свой web.xml, чтобы выполнить маршрутизацию. Или лучше использовать инфраструктуру, которая справится с этим для вас.

0

Я бы рекомендовал использовать фреймворк для обработки маршрутизации, например Spring и Struts лучше справляются с обработкой маршрутизации. Вы можете сделать сервлет или web.xml сделать это, но тогда не повторное использование кода из фреймворка просто кажется бессмысленным в этом случае. Поэтому я рекомендовал бы с весной или Struts 2

0

Два способа сделать это, и не является совершенным:

  • Определить расширение для «действий» и карту, что ваш сервлет (как .Не в Struts 1).
  • Есть все запросы сервлетов перейти к конкретному подпути (например/действия/*)

Правила отображения в web.xml довольно ограничены, поскольку контейнер соответствует расширения после правил пути, это не можно отобразить сервлет на /*, except *.jsp.

Как обычно, я не думаю, что «использовать фреймворк» обязательно является ответом - если проект относительно невелик, добавленная сложность может не стоить того.

0

Помимо всех фреймворков, которые могут сделать это для вас, как уже указывали другие, попробуйте сопоставить это наоборот.

Итак, вместо того чтобы пытаться отобразить все, кроме исключений, наметить исключения и позволить всем пройти через ваш сервлет. Вы можете легко достичь этого, поставив фильтр upfront, который отображает все ваши статические файлы.