Вы находитесь на странице: 1из 23

Servlets

Понятие Servlet
Сервлет - это самостоятельный web-компонент, который
функционирует в web-контейнере, динамически
генерируя HTML-страницу, XML или JSON документ или
другие данные (картинки, аудио, видео, и т.д.) в ответ на
полученный от клиента запрос или выступает в роди
контроллера обработки действия пользователя.
@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("Hello world!");
out.println("</body></html>");
out.close();
}
}
Жизненный цикл Servlet
• В случае отсутствия сервлета в контейнере:
1.Класс сервлета загружается контейнером.
2.Контейнер создает экземпляр класса сервлета.
3.Контейнер вызывает метод init(), который инициализирует
сервлет.
• Обслуживание клиентского запроса. Каждый запрос
обрабатывается в своем отдельном потоке. Контейнер
вызывает методы doGet(), doPost(), и т.д. для каждого
запроса.
• В случае если контейнеру необходимо удалить сервлет, он
вызывает метод destroy().

За весь жизненный цикл методы init() и destroy() вызываются только один раз.
Обработка запроса в Servlet
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPut(req, resp);
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doDelete(req, resp);
}
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doHead(req, resp);
}
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doTrace(req, resp);
}
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException{
super.doOptions(req, resp);
}
}
Исследование запросов и ответов
@WebServlet("/test-req-resp")
public class TestRequestResponseServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setDateHeader("Date", System.currentTimeMillis());
resp.addHeader("autor", "devstudy.net");
resp.setStatus(HttpServletResponse.SC_OK);
resp.setLocale(Locale.ITALIAN);
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<form action='/test-req-resp' method='post'>");
out.println("Your name: <input name='name'><br>");
out.println("<input type='submit'>");
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println(" Request method: "+req.getMethod());
out.println("<br>Request URI: "+req.getRequestURI());
out.println("<br>Protocol Version: "+req.getProtocol());
out.println("<br>Header 'User-Agent': "+req.getHeader("User-Agent"));
out.println("<br>Header 'Accept-Language': "+req.getLocale());
out.println("<br>Header 'Content-Length': "+req.getContentLength());
out.println("<br>Header 'Content-Type': "+req.getContentType());
out.println("<br>Remote address: "+req.getRemoteHost());
out.println("<br>Request parameter: "+req.getParameter("name"));
out.close();
}
}
Извлечение данных из запроса
Установка данных ответа
Конфигурирование сервлетов
Конфигурирование с помощью аннотаций

@WebServlet("/annotation")
public class AnnotationConfigServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().println("AnnotationConfigServlet");
}
}
Конфигурирование сервлетов
Конфигурирование с помощью XML
public class XMLConfigServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().println("XMLConfigServlet");
}
}

<web-app xmlns=http://xmlns.jcp.org/xml/ns/javaee
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version="3.1">

<servlet>
<servlet-name>XMLConfigServlet</servlet-name>
<servlet-class>net.devstudy.servlet.XMLConfigServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XMLConfigServlet</servlet-name>
<url-pattern>/xml</url-pattern>
</servlet-mapping>
</web-app>
Конфигурирование сервлетов
Конфигурирование с помощью Java классов
public class JavaConfigServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
resp.getWriter().println("JavaConfigServlet");
}
}
***************************************************************************************************************
package net.devstudy.config;
public class ApplicationConfigInitializer implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
JavaConfigServlet servlet = new JavaConfigServlet();
ServletRegistration.Dynamic servletConfig = ctx.addServlet("JavaConfigServlet", servlet);
servletConfig.addMapping("/java");
}
}
Конкурентный доступ
Чтение параметров запроса
http://localhost:8080/params?param1=qw&param2=7&param3=true&param4=a&param4=b&param4=c

@WebServlet("/params")
public class GetParametersServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String param1 = req.getParameter("param1");
int param2 = Integer.parseInt(req.getParameter("param2"));
boolean param3 = Boolean.parseBoolean(req.getParameter("param3"));
String[] param4 = req.getParameterValues("param4");
// process parameters
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
params.html:

<html><body>
<form action="/params" method="post" >
Param1: <input type="text" name="param1"><br>
Param2: <input type="number" name="param2"><br>
Param3: <input type="checkbox" name="param3" value="true"><br>
<hr>
Param4=a: <input type="checkbox" name="param4" value="a"><br>
Param4=b: <input type="checkbox" name="param4" value="b"><br>
Param4=c: <input type="checkbox" name="param4" value="c"><br>
<input type="submit">
</form>
</body></html>
Передача управления. Forward.
Существует 3 способа передачи управления между web компонентами:
forward, redirect, include

@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("Hello world");
//out.close();
}
}

@WebServlet("/serv1")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
req.getRequestDispatcher("/hello-world").forward(req, resp);
}
}
Передача управления. Include.
@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("Hello world");
//out.close();
}
}
@WebServlet("/serv2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
PrintWriter out = resp.getWriter();
out.println("<html><body>");
//do not call out.close inside hello-world!!!
req.getRequestDispatcher("/hello-world").include(req, resp);
out.println("!!!");
out.println("</body></html>");
out.close();
}
}
Передача управления. Redirect.
@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("Hello world");
//out.close();
}
}
@WebServlet("/serv3")
public class Servlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.sendRedirect("/hello-world");
}
}
Передача данных между компонентами.
forward или include
@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
String attr1 = (String) req.getAttribute("attr1");
PrintWriter out = resp.getWriter();
out.println("Hello world: "+attr1);
}
}
@WebServlet("/serv1")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
req.setAttribute("attr1", "serv1");
req.getRequestDispatcher("/hello-world").forward(req, resp);
}
}
@WebServlet("/serv2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
PrintWriter out = resp.getWriter();
out.println("<html><body>");
req.setAttribute("attr1", "serv1");
req.getRequestDispatcher("/hello-world").include(req, resp);
out.println("</body></html>");
out.close();
}
}
Передача данных между компонентами.
redirect
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.sendRedirect("/hello-world?attr1=serv3");
}
@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String attr1 = req.getParameter("attr1");
resp.getWriter().println("Hello world: "+attr1);
}
}
********************************************************************************************************************************************
*
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.getSession().setAttribute("attr1", "serv3");
resp.sendRedirect("/hello-world");
}
@WebServlet("/hello-world")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String attr1 = (String)req.getSession().getAttribute("attr1");
req.getSession().removeAttribute("attr1");
resp.getWriter().println("Hello world: "+attr1);
}
}
Версии Servlets API
Версия Релиз Платформа Важнейшие изменения
Servlet 4.0 В разработке Java EE 8 HTTP/2
Неблокирующий ввод-вывод, поддержка
Servlet 3.1 Май 2013 JavaEE 7, JavaSE 7
нестандартных протоколов поверх HTTP
Pluggability, простота разработки, асинхронные
Servlet 3.0 Декабрь 2009 JavaEE 6, JavaSE 6 сервлеты, безопасность, загрузка файлов, Java и
Annotation конфигурация
Servlet 2.5 Сентябрь 2005 JavaEE 5 , J2SE 5.0 Требует J2SE 5.0, поддержка annotations
Servlet 2.4 Ноябрь 2003 J2EE 1.4, J2SE 1.3 web.xml использует XML Schema
Servlet 2.3 Август 2001 J2EE 1.3, J2SE 1.2 Появление Filter
Становится частью J2EE, предлагает независимые
Servlet 2.2 Август 1999 J2EE 1.2, J2SE 1.2
веб-приложения в .war файлах
Первая официальная спецификация, добавлены
Servlet 2.1 Ноябрь 1998 не оговорено
RequestDispatcher, ServletContext
Servlet 2.0 JDK 1.1 Часть Java Servlet Development Kit 2.0
Servlet 1.0 Июнь 1997
Версия Томката

http://tomcat.apache.org/whichversion.html
Примеры использования
Отображение картинки
@WebServlet(value="/image/*", initParams = {
@WebInitParam(name="ROOT_DIR", value="D:\\devstudy.net\\im-storage\\")
})
public class ShowPictureServlet extends HttpServlet {
private String rootDir;
@Override
public void init() throws ServletException {
rootDir = getServletConfig().getInitParameter("ROOT_DIR");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("image/jpg");
String[] parts = req.getRequestURI().split("/");
String fileName = parts[parts.length-1];
File file = new File(rootDir + fileName);
if(file.exists()) {
try(InputStream in = new BufferedInputStream(new FileInputStream(file));
OutputStream out = new BufferedOutputStream(resp.getOutputStream())) {
int data = -1;
while((data = in.read()) != -1) {
out.write(data);
}
out.flush();
}
} else {
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
}
Примеры использования
Отображение картинки
<!DOCTYPE html>
<html>
<body>
<h1>Image</h1>
<img src="/image/javalogo.png" alt= " java logo" >
</body>
</html>

Для того, чтобы отобразить эту страницу, к серверу


браузером должно быть произведено 2 запроса:
•По первому доставляется содержимое html-документа;
•По второму – сама картинка.
Примеры использования
@WebServlet("/login") Login сервлет
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
try (PrintWriter out = resp.getWriter()){
if(req.getAttribute("error") != null) {
out.println("<h5 style='color:red'>"+req.getAttribute("error")+"</h5>");
}
out.println("<form action='/login' method='post'>");
out.println("<input name='login' placeholder='Login'>");
out.println("<input name='password' placeholder='Password' type='password'>");
out.println("<input type='submit' value='Login'>");
out.println("</form>");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String login = req.getParameter("login");
String password = req.getParameter("password");
if(isValid(req, login, password)) {
resp.sendRedirect("/my-private-page");
} else {
doGet(req, resp);
}
}
private boolean isValid(HttpServletRequest req, String login, String password) {
if(login == null || login.trim().isEmpty()) {
req.setAttribute("error", "Login is required");
return false;
}
if(password == null || password.trim().isEmpty()) {
req.setAttribute("error", "Password is required");
return false;
}
return true;
}
}
Домашнее задание
Admin сервлет
Создать AdminServlet (‘/admin’), который должен проверить следующие
параметры:

1)Если ip адрес клиента равен IP, то вывести в консоль Login via ip: %s и
отобразить клиенту ОК;
2)Если header[ACCESS_KEY] равен ACCESSKEY, то вывести в консоль Login via
accessKey: %s и отобразить клиенту ОК;
3)Если param[login]=admin, param[password]=password, то вывести в консоль Login
via login and password: %s/%s и отобразить клиенту ОК;
4)Иначе вывести клиенту FAILED, 401 статус и в консоль отобразить текущее
состояние всех данных проверки;

5)Эталонные параметры задать через Init параметры!


6)Проверить работу сервлета

7)https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj/related

Вам также может понравиться