У сервлета нет расширений? - PullRequest
       4

У сервлета нет расширений?

1 голос
/ 01 февраля 2010

Мне нравится знать, что когда пользователь запрашивает страницу jsp, мы пишем hello.jsp или любой html-файл, который мы пишем hello.html, или любое изображение hello.jpeg. Мой вопрос: у сервлета нет расширения? Это называется прямо по имени?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

Для сервлетов вы должны явно указать контейнеру сервлетов, какие URL-адреса (либо конкретные, либо подстановочные знаки) сопоставляются с каким сервлетом. Например:

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.example.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

В приведенном выше примере URL-адрес /hello будет сопоставлен с сервлетом com.example.HelloWorld.

Вы также можете сделать несколько подстановочных знаков. Например:

<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

Это сопоставит запросы, оканчивающиеся на ".html", с сервлетом HelloWorld. Но вы не ограничены какими-либо конкретными расширениями. Вы можете использовать все, что захотите:

<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>*.foo</url-pattern>
</servlet-mapping>

Вся эта конфигурация находится в файле web.xml вашего веб-приложения.

1 голос
/ 01 февраля 2010

Нет, у вас это полностью в ваших руках. Он не обязательно называется своим именем, он называется url-pattern. Вы можете назвать это как угодно, например /pages/* будет запускать сервлет всякий раз, когда вы вызываете http://example.com/pages/foo.jsp или http://example.com/pages/foo (что, в свою очередь, возвращает информацию о пути обратно на request.getPathInfo(), чтобы вы могли определить, какое действие предпринять и / или куда направить запрос). Или *.page, который запускает сервлет всякий раз, когда вы вызываете http://example.com/foo.page (который, в свою очередь, возвращает URI на request.getRequestURI()).

Для предварительной обработки запросов (когда кто-то запрашивает страницу для просмотра) вы обычно используете метод doGet(). Для постобработки запросов (после отправки формы POST) обычно используется метод doPost().

Вы можете создать столько сервлетов, сколько захотите, например, RegisterServlet прослушивание /register, которое поддерживается register.jsp в качестве вида и LoginServlet прослушивание /login и login.jsp в качестве вида и так далее. Вы можете скрыть JSP от прямого доступа, поместив их в /WEB-INF, чтобы пользователи были вынуждены вызывать их через сервлет.

В мире MVC обычно существует способ прослушивания только одного сервлета на определенном url-pattern, который называется Front Controller . Например, в Sun JSF есть FacesServlet, который запускается всякий раз, когда вызывается URL, соответствующий по умолчанию *.jsf или /faces/*. Например, в Apache Struts есть ActionServlet, который по умолчанию прослушивает *.do. Они определяют, какое действие предпринять и / или какое представление (файл JSP) отображать, основываясь на URL-адресе, параметрах запроса и / или сопоставлениях. Однако вы можете изменить эти значения по умолчанию url-pattern s. Вы даже можете изменить url-pattern по умолчанию JspServlet в servlercontainer web.xml, который по умолчанию прослушивает *.jsp. Однако рекомендуется придерживаться разумного и стандартизированного url-pattern.

Может быть интересно знать, что любые другие «неопределенные» шаблоны URL-адресов покрываются сервлетом «по умолчанию». Проверьте сервлет-контейнер web.xml, вы увидите один сервлет, который прослушивает / и, таким образом, фактически обслуживает все . Он также управляет отображением списков директой. Например, в Tomcat он называется DefaultServlet и описан здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...