После выхода версии 3.0 использование Servlet стало довольно удобным. Добавление аннотаций позволяет отказаться от web.xml и писать веб-приложения с нулевой конфигурацией.
Однако после использования остались некоторые сожаления. Речь идёт о поддержке REST-стиля URL. После долгого использования SpringMVC стиль REST-URL стал очень нравиться. Поиск в интернете привёл к проекту servletrest, который размещён на Google Code: http://code.google.com/p/servletrest/.
Исходный код содержит всего несколько классов, которые были быстро изучены и протестированы. Действительно, поддержка REST-сервлетов возможна, но ошибки также очевидны. Наиболее заметная из них заключается в том, что поддерживаемые REST сервлеты не могут получить доступ к ServletContext. Причина в том, что servletrest при инициализации сервлета не вызывает метод init сервлета, то есть не инициализирует ServletConfig. Также существует проблема с получением параметров из URI, которая является слишком сложной. Более того, из-за первой проблемы параметры фактически недоступны.
Потратив некоторое время, была создана новая реализация под названием summer-restful. Её основная цель — позволить обычным сервлетам поддерживать REST-стиль URL и исправить очевидные ошибки в servletrest.
Определяется фильтр.
При запуске контейнера выполняется сканирование и проверка всех сервлетов, помеченных аннотациями. Упомянутые аннотации являются пользовательскими и называются @SummerServlet. Они имеют два параметра: name и UrlPatterns. Сервлеты, соответствующие правилам, инициализируются, а их urlPatterns используются в качестве ключа для сохранения в Map. Следует отметить, что наши пользовательские urlPatterns в @SummerServlet поддерживают формат URL, подобный /*/detail/*
, что позволяет обычным сервлетам использовать REST-стиль URL.
Фильтр перехватывает все запросы. Анализируется путь сервлета в запросе, и если он соответствует ключу в Map, возвращается соответствующий сервлет, и параметры из URL внедряются в запрос. В противном случае выполняются стандартные действия.
Процесс состоит из двух шагов.
Пример конфигурации через web.xml:
<filter>
<filter-name>summerFilter</filter-name>
<filter-class>cn._5iurl.restful.SummerFilter</filter-class>
<init-param>
<param-name>servletPackage</param-name>
<param-value>cn._5iurl.test.servlet</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>summerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Также можно настроить через аннотацию. Для этого необходимо создать новый фильтр, наследующий SummerFilter. Пример:
@WebFilter(filterName="restFilter", initParams=@WebInitParam(name="servletPackage", value="cn._5iurl.test.servlet"), urlPatterns="/*")
public class CRestFilter extends SummerFilter{
}
В сервлетах, требующих REST-стиля URL, больше не нужно настраивать XML или использовать аннотацию @WebServlet, вместо этого используется аннотация @SummerServlet. Пример:
@SummerServlet(name="detailServlet", urlPatterns="/*/detail/*")
public class DetailServlet extends HttpServlet{
private static final long serialVersionUID = 8268477143225755822L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String category = (String)req.getAttribute("p0");
String id = (String)req.getAttribute("p1");
req.setAttribute("id", id);
req.getRequestDispatcher("/WEB-INF/www/"+category+"/detail.jsp").forward(req, resp);
}
}
Получение параметров из URL. Что это значит? Рассмотрим предыдущий пример. Предположим, пользователь обращается по адресу: http://localhost:8015/cms/user/detail/1. Можно увидеть, что он соответствует нашему определённому правилу URL:
/*/detail/*
Как мы можем получить скрытые значения параметров user и 1? Опять же, рассмотрим пример:
String category = (String)req.getAttribute("p0");
String id = (String)req.getAttribute("p1");
Очень просто, верно? Исходный код также здесь. Make yourself at home.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )