1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cevin15-summer-restful

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Введение

После выхода версии 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.

doFilter

Фильтр перехватывает все запросы. Анализируется путь сервлета в запросе, и если он соответствует ключу в 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

Получение параметров из 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 )

Вы можете оставить комментарий после Вход в систему

Введение

При помощи нескольких простых классов можно сделать так, чтобы ваш servlet поддерживал URL в стиле REST. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/cevin15-summer-restful.git
git@api.gitlife.ru:oschina-mirror/cevin15-summer-restful.git
oschina-mirror
cevin15-summer-restful
cevin15-summer-restful
master