Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Маппинг DispatcherServlet на короткий урл
Постоянная ссылка 19-12-2007 anydoby java

С того самого момента, как я начал пользоваться Spring MVC, мне не нравились длинные линки, которые получаются, если мапить DispatcherServlet на URL типа /dispatcher/* или же *.htm. Хотелось бы, чтобы выглядел линк на контроллер покороче, например: http://mycom.com/mycontroller. Оказалось, что это делается, правда, при этом появляется несколько проблем, которые я собираюсь решить в данной статье.

Итак, чтобы замапить dispatcher сервлет на короткий урл, достаточно объявить это в web.xml:


  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

Все отлично, однако возникает проблема - все линки на статические ресурсы также начнают ломиться на данный сервлет. Например: http://mycom.com/images/image.png тоже сработает. Как с этим бороться?

Есть два способа. Первый можно использовать, если нагрузка на ресурс сравнительно небольшая и статического контента у вас немного. Пишем сервлет:


import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

public class StaticServlet extends HttpServlet {

	private static final long serialVersionUID = 8458501870440200891L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String resourcePath = req.getServletPath() + req.getPathInfo();
		String realPath = getServletContext().getRealPath(resourcePath);
		FileInputStream fileInputStream = new FileInputStream(realPath);
		try {
			IOUtils.copy(fileInputStream, resp.getOutputStream());
		} finally {
			fileInputStream.close();
		}
	}
	
}

И мапим его на те пути, где у нас будет лежать статика:


  <servlet>
  	<servlet-name>static</servlet-name>
  	<servlet-class>StaticServlet</servlet-class>
  </servlet>

  <servlet-mapping>
  	<servlet-name>static</servlet-name>
  	<url-pattern>/images/*</url-pattern>
  	<url-pattern>/css/*</url-pattern>
  	<url-pattern>/img/*</url-pattern>
  	<url-pattern>/js/*</url-pattern>
  	<url-pattern>/swf/*</url-pattern>
  </servlet-mapping>

Все, проблема решена.

Однако, ежели у вас большой наплыв посетителей, и много статики, которую, естественно, гонять через java.io нет смысла, лучше воспользоваться apache. Например, выделяем поддомен static.mycom.com и мапим этот домен на папки со статическим контентом. Можно то же самое сделать и через tomcat, или же создать просто отдельный webapp только со статическим контентом. В общем, есть простанство для выбора.

Добавить комментарий

education-rf
15-06-2009

Писать сервлет свой необязательно. Он обычно есть уже встроенный контейнером. Только нужно знать его имя. А вот имя у него зависит только от фантазии разработчиков контейнера. Например, в Tomcat и Jetty он называется default, а в Resin - resin-file.

Ну, соответственно

<servlet-mapping>
       <servlet-name>default</servlet-name>
      <!-- <servlet-name>resin-file</servlet-name> -->
       <url-pattern>*.css</url-pattern>
       <url-pattern>*.gif</url-pattern>
       <url-pattern>*.js</url-pattern>
   </servlet-mapping>

111
04-09-2009

Сделай себе короткий URL на УРЛки.НЕТ

111
04-09-2009

Вот правильная ссылка чтобы сделать себе короткий URL на УРЛки.НЕТ

Предыдущая статья Интеграция Spring и DWR Следующая статья Удобный Matcher для jMock