What is servlet mapping in java
Learn about what is new and changed in recent servlet specifications, and how to create and configure servlets.
This chapter includes the following sections:
What’s New and Changed in Servlets
These sections summarize the changes in the Servlet programming model and requirements between Servlet 4.0 and 3.1.
What’s New and Changed in Servlet 4.0
WebLogic Server supports the Servlet 4.0 specification (see https://jcp.org/en/jsr/detail?id=369 ), which introduces the following new features:
- Support for HTTP/2—HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection. It also introduces an unsolicited push of representations from servers to clients.
- Server Push—Server push is the most visible of the improvements in HTTP/2 to appear in the servlet API. All of the new features in HTTP/2, including server push, are aimed at improving the perceived performance of the web browsing experience. Server push is the ability of the server to anticipate what will be needed by the client in advance of the client’s request. It lets the server pre-populate the browser’s cache in advance of the browser asking for the resource to put in the cache. For example, servers might know that whenever a browser requests index.html , it will shortly thereafter request header.gif , footer.gif , and style.css . Servers can preemptively start sending the bytes of these assets along with the bytes of the index.html .
To use server push, obtain a reference to a PushBuilder from an HttpServletRequest , edit the builder as desired, then call push() .
PushBuilder pb = req.newPushBuilder(); pb.path("bar.jpg"); pb.push();
EXAMPLES_HOME/examples/src/examples/javaee8/servlet/server-push
EXAMPLES_HOME/examples/src/examples/javaee8/servlet/trailer
EXAMPLES_HOME/examples/src/examples/javaee8/servlet/mapping-discovery
What Was New and Changed in Servlet 3.1
The Servlet 3.1 specification (see https://jcp.org/en/jsr/detail?id=340 ) introduced the following features:
- Support added for non-blocking I/O reads and writes—Servlet 3.0 allowed asynchronous request processing but only traditional I/O was permitted, which restricted scalability of your applications because threads associated with client requests could be sitting idle due to input/output considerations. Servlet 3.1 supports non-blocking I/O for read and write listeners, which allows you to build scalable applications.
- Supports HTTP protocol upgrade processing—HTTP/1.1 allows the client to specify additional communication protocols that it supports and would like to use. Servlet 3.1 supports the HTTP protocol upgrade functionality in servlets.
- Enhanced security by handling uncovered HTTP methods—The deny-uncovered-http-methods flag can be set in an application’s web.xml file, which forces the container to deny any HTTP protocol method when it is used with a request URL for which the HTTP method is uncovered at the combined security constraint that applies to the url-pattern that is the best match for the request URL.
- New Java EE 7 servlet examples—When you install WebLogic Server complete with the examples, the examples source code is placed in the EXAMPLES_HOME\examples\src\examples\javaee7 directory. The default path is ORACLE_HOME\wlserver\samples\server . From this directory, you can access the source code and instruction files for the Servlet 3.1 code examples without having to set up the samples domain. The ORACLE_HOME\user_projects\domains\wl_server directory contains the WebLogic Server examples domain; it contains your applications and the XML configuration files that define how your applications and Oracle WebLogic Server will behave, as well as startup and environment scripts. For more information about the WebLogic Server code examples, see Sample Applications and Code Examples in Understanding Oracle WebLogic Server .
- Using HTTP Protocol Upgrade API – demonstrates how to use the HTTP Protocol Upgrade API that allows the client to specify additional communication protocols.
EXAMPLES_HOME/examples/src/examples/javaee7/servlet/http-upgrade
EXAMPLES_HOME/examples/src/examples/javaee7/servlet/non-blocking-io-read
EXAMPLES_HOME/examples/src/examples/javaee7/servlet/non-blocking-io-write
EXAMPLES_HOME/examples/src/examples/javaee7/servlet/session-id-change
EXAMPLES_HOME/examples/src/examples/javaee7/servlet/uncovered-http-method
Can anyone explain servlet mapping?
I’m trying to write a web application using SpringMVC. Normally I’d just map some made-up file extension to Spring’s front controller and live happily, but this time I’m going for REST-like URLs, with no file-name extensions. Mapping everything under my context path to the front controller (let’s call it «app«) means I should take care of static files also, something I’d rather not do (why reinvent yet another weel?), so some combination with tomcat’s default servlet (let’s call it «tomcat«) appears to be the way to go. I got the thing to work doing something like
and repeating the latter for each one of the file extensions of my static content. I’m just wondering why the following setups, which to me are equivalent to the one above, don’t work.
app /* tomcat *.ext app / tomcat /some-static-content-folder/* 3 Answers 3
I think I may know what is going on.
In your working web.xml you have set your servlet to be the default servlet (/ by itself is the default servlet called if there are no other matches), it will answer any request that doesn’t match another mapping.
In Failed 1 your /* mapping does appear to be a valid path mapping. With the /* mapping in web.xml it answers all requests except other path mappings. According to the specification extension mappings are implicit mappings that are overwritten by explicit mappings. That’s why the extension mapping failed. Everything was explicitly mapped to app.
In Failed 2, App is responsible for everything, except content that matches the static content mapping. To show what is happening in the quick test I set up. Here is an example. /some-static-content-folder/ contains test.png
Trying to access test.png I tried:
/some-static-content-folder/test.png
and the file was not found. However trying
/some-static-content-folder/some-static-content-folder/test.png
it comes up. So it seems that the Tomcat default servlet (6.0.16 at least) drops the servlet mapping and will try to find the file by using the remaining path. According to this post Servlet for serving static content Jetty gives the behavior you and I were expecting.
Is there some reason you can’t do something like map a root directory for your rest calls. Something like app mapped to /rest_root/* than you are responsible for anything that goes on in the rest_root folder, but anywhere else should be handled by Tomcat, unless you make another explicit mapping. I suggest setting your rest servlet to a path mapping, because it declares the intent better. Using / or /* don’t seem appropriate, since you have to map out the exceptions. Using SO as an example, my rest mappings would be something like
/users/* for the user servlet
/posts/* for the posts servlet
Please correct anything that I got wrong.
What is servlet mapping in java
В предыдущих статьях при определении сервлетов применялась аннотация @WebServlet , которая устанавливала конечную точку, с которой сопоставлялся сервлет. Например, следующий сервлет
@WebServlet("/hello") public class HelloServlet extends HttpServlet
сопоставляется с путем "/hello". То есть сервлет HelloServlet будет обрабатывать запросы типа "http://localhost:8081/[название_приложения]/hello" или "http://somesite.com/[название_приложения]/hello".
Но есть и другой способ сопоставления путей и сервлетов. Он представляет использование файла web.xml.
Файл web.xml хранит информацию о конфигурации приложения. Он не является обязательной частью приложения, как можно увидеть из предыдущих статей, тем не менее он широко используется для настройки конфигурации.
Данный файл должен располагаться в папке WEB-INF приложения. При запуске Tomcat считывает его содержимое и использует считанную конфигурацию. Если же файл содержит ошибки, то Tomcat отображает ошибку.
web.xml имеет определенную структуру. Все вложенные узлы, которые определяют конфигурацию, помещаются в корневой узел .
У элемента web-app определяется ряд атрибутов. В данном случае атрибуты xmlns и xmlns:xsi указывают на используемые пространства имен xml. Атрибут version указывает на версию спецификации сервлетов или Servlet API, которая используется в приложении. Последняя версия API сервлетов - 4-я версия.
С помощью элемента можно задать сопоставление сервлета с запрашиваемым URL.
Например, добавим в проект в Eclipse в папку WebConent/WEB-INF новый файл web.xml :
Определим в нем следующий код:
HelloWorld HelloServlet HelloWorld /welcome Прежде всего вначале с помощью элемента определяется сервлет. Элемент задает имя сервлета, на которое будет проецироватья класс, указанный в элементе . То есть, допустим, у нас проекте есть класс сервлета HelloServlet, который будет проецироваться на имя HelloWorld. Имя может быть произвольным и может совпадать с названием класса.
Затем в элементе сервлет с именем HelloWorld (по сути сервлет HelloServlet) сопоставляется с путем "/welcome".
Допустим, сервлет HelloServlet будет выглядеть следующим образом:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet < protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); PrintWriter writer = response.getWriter(); try < writer.println("
Welcome to servlets
"); > finally < writer.close(); >> >Теперь, чтобы обратиться к этому сервлету, надо использовать путь "/welcome":