betacode

Руководство Java Servlet для начинающих

  1. Что такое Servlet?
  2. Жизненный цикл Servlet
  3. Установка Tomcat Web Server
  4. Создать Web Project чтобы начать с Servlet
  5. Установка Eclipse для запуска на tomcat
  6. Некоторые классы участвующие в примере
  7. Создать ваш первый Servlet
  8. Инициализированные параметры Servlet
  9. Конфигурация Servlet используя Annotation
  10. Servlet Url Pattern
  11. Получить основную информацию Servlet
  12. Forward (Пересылка)
  13. Redirect (Перенаправление)
  14. Сессия (Session)
  15. Руководство использования Servlet-Filter
  16. Руководство программирования JSP

1. Что такое Servlet?

Java Servlet это программа работающая на Веб или на приложении сервера (Application Server) и действует как промежуточный уровень между запросом из веб браузера или другого клиентского HTTP (Client) и базой данных или приложениями на HTTP сервере (HTTP Server).

Используя Servlet, вы можете получить ввод от пользователей через формы на веб страницах, от базы данных или другого реусурса, и создать динамические веб страницы.

2. Жизненный цикл Servlet

Изображение ниже иллюстрирует жизненный цикл Servlet. С момента создания, обработки от пользователя, до момента разрушения.
Существует 5 шагов:
  • Скачать класс Servlet в память.
  • Создать объект Servlet.
  • Вызвать метод init() в Servlet.
  • Вызвать метод service() вServlet.
  • Вызвать метод destroy() в Servlet.

Шаги 1, 2 & 3 выполняются один единственный раз, когда Servlet загружен в первый раз. По умолчанию Servlet не загружаются (load) пока он не получит первый запрос от пользователя. Вы можете заставить Servlet Container (Servlet Контейнер) загрузить Servlet при запуске.

Шаг 4 выполняется много раз, каждый раз при запросе от пользователя к Servlet.
Bước 5 выполняется когда контейнер Servlet (Servlet Container) разгружает (unloaded) Servlet.
Вы можете посмотреть следующие изображения чтобы лучше понять про жизненный цикл Servlet.
При отправлении запроса (request) пользователя к Servlet, Servlet вызывает метод service() чтобы обработать запрос пользователя, service() вызывает один из двух методов doGet() или doPost(). В вашем Servlet, вам нужно переопределить и обработать эти методы.
Так, когда пользователь отправляет запрос Servlet, Servlet создается в момент получения первого запроса, одновременно вызывается метод init() в servlet чтобы инициализировать его, init() вызывается один единственный раз. Метод destroy() используется для разрушения servlet, вызывается единственный раз когда вы отменяете развертывание (undeloy) веб приложения или отключаете (shutdown) Web Server (Веб Сервер).

3. Установка Tomcat Web Server

Чтобы начать с Servlet, вам необходимо скачать Tomcat Web Server и объявить его с Eclipse. Вы можете посмотреть руководство по ссылке:

4. Создать Web Project чтобы начать с Servlet

  • File/New/Other
  • Project Name: ServletTutorial
Эта изображение созданного Project:
Создать файл index.html:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

   <h1>Hello World</h1>

</body>
</html>

5. Установка Eclipse для запуска на tomcat

До сих пор мы ничего не сделали с Servlet. И теперь мы конфигурируем, чтобы запустить веб-приложение выше. Затем мы начнем с Servlet.
В eclipse, нажмите на правую кнопку мыши на Project ServletTutorial , выберите Properties
Выберите местоположение установки вашего Tomcat 8.
Щелкните правой кнопкой мыши на проект ServletTutorial, выберите "Run As / Run on Server".
Website работает в браузере на Eclipse.
Принцип работы:
Когда вы вводите ссылку:
Тогда вебсайт возвращает содержимое страницы index.html, это понятно. Однако, если вы вводите ссылку:
Это означает, что вы не указали ясно какую страницу, webserver будет искать страницу по умолчанию, который объявляен в теге <welcome-file> который вы объявили в web.xml, чтобы возвратить.
Примечание: /ServletTutorialназывается Context-Path, каждый вебсайт имеет Context-Path, вы можете конфигурировать для него другое значение, или оставить пустым. Если оставляете пустым, вы можете получить доступ в ваш веб через:
http://localhost:8080
http://localhost:8080/index.html
При запуске с Tomcat по умолчанию он использует название проекта как Context-Path.
Смотрите иллюстрированный пример ниже:

6. Некоторые классы участвующие в примере

Некоторые классы, которые будут участвовать в следующем примере данной статьи.
Constants.java
package org.o7planning.tutorial.beans;

public class Constants {

  public static final String ATTRIBUTE_USER_NAME_KEY ="ATTRIBUTE_USER_NAME_KEY";
   
  public static final String SESSION_USER_KEY ="SESSION_USER_KEY";
   
  public static final String CALLBACK_URL_KEY ="CALLBACK_URL_KEY";
   
}
UserInfo.java
package org.o7planning.tutorial.beans;

public class UserInfo {

   public String userName;
   private int post;
   private String country;
   
   public UserInfo(String userName, String country, int post)  {
       this.userName= userName;
       this.country= country;
       this.post= post;
   }

   public int getPost() {
       return post;
   }

   public void setPost(int post) {
       this.post = post;
   }

   public String getCountry() {
       return country;
   }

   public void setCountry(String country) {
       this.country = country;
   }

   public void setUserName(String userName) {
       this.userName = userName;
   }

   public UserInfo(String userName) {
       this.userName = userName;
   }

   public String getUserName() {
       return this.userName;
   }
}

7. Создать ваш первый Servlet

HelloServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HelloServlet extends HttpServlet {
   
   private static final long serialVersionUID = 1L;

   
   public HelloServlet() {
   }

   @Override
   protected void doGet(HttpServletRequest request,
           HttpServletResponse response) throws ServletException, IOException {
       
       ServletOutputStream out = response.getOutputStream();
       
       out.println("<html>");
       out.println("<head><title>Hello Servlet</title></head>");
       
       out.println("<body>");
       out.println("<h3>Hello World</h3>");
       out.println("This is my first Servlet");
       out.println("</body>");
       out.println("<html>");
   }

   @Override
   protected void doPost(HttpServletRequest request,
           HttpServletResponse response) throws ServletException, IOException {
       this.doGet(request, response);
   }

}
Это изображение Hello Servlet созданноесо многими ошибками. Эти ошибки просто из-за того, что вы еще объявили библиотеку Servlet.
Нужно объявить библиотеку Servlet, эти библиотеки являьтся библиотекой Runtime в Servlet, она есть на Web Server, здесь мы используем Tomcat, поэтому, объявите их.

Щелкните правой кнопкой мыши на проект и выберите Properties:
Теперь проект не имеет сообщение об ошибке.
Далее вам нужно объявить HelloServlet и ссылку для доступа в web.xml. Вам нужно добавить следующую конфигурацию:
<!-- Define servlet, named helloServlet -->
<servlet>
   <servlet-name>helloServlet</servlet-name>
   <servlet-class>org.o7planning.tutorial.servlet.HelloServlet</servlet-class>
</servlet>

<!-- Defines the path to access this Servlet -->
<servlet-mapping>
   <servlet-name>helloServlet</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   <display-name>ServletTutorial</display-name>

   
   <servlet>
       <servlet-name>helloServlet</servlet-name>
       <servlet-class>org.o7planning.tutorial.servlet.HelloServlet</servlet-class>
   </servlet>

   <servlet-mapping>
       <servlet-name>helloServlet</servlet-name>
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>


   <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>


</web-app>
Перезапустите проект через нажатие правой кнопки мыши на выбор:
  • Run As/Run on Server
Вы можете посмотреть принцип его работы в иллюстрации ниже:
Когда Servlet вызывается, в зависимости от ситуации, вызывается один из двух методов doGet(..) или doPost(..).
  • В частности, когда вызывается doGet(..) и когда вызывается doPost(..) мы обсудим позже.
В doGet() или doPost() вы можете получить объекты ServletOutputStream, это выходной поток (output stream), он отправляет данные браузеру пользователя. Вызвать ServletOutputStream.println(..), чтобы записать текст в поток (stream).
// Выходной поток (Output Stream),
// отправляет данные по направлению браузера пользователя.
ServletOutputStream out = response.getOutputStream();

8. Инициализированные параметры Servlet

Когда объявляется servlet в web.xml вы можете передать параметры инициализации для него.
InitParamServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class InitParamServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private String emailSupport1;

	public InitParamServlet() {
	}

	// Данный метод всегда вызывается 1 раз
	// сразу после того, как создается объект Servlet.
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);

		// Получить значение параметра инициализирования (initialization parameter) Servlet.
		// (По конфигурации данный Servlet в web.xml).
		this.emailSupport1 = config.getInitParameter("emailSupport1");
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Получить значение параметра инициализирования (initialization parameter) другим способом.
		String emailSupport2 = this.getServletConfig().getInitParameter("emailSupport2");

		ServletOutputStream out = response.getOutputStream();

		out.println("<html>");
		out.println("<head><title>Init Param</title></head>");

		out.println("<body>");
		out.println("<h3>Init Param</h3>");
		out.println("<p>emailSupport1 = " + this.emailSupport1 + "</p>");
		out.println("<p>emailSupport2 = " + emailSupport2 + "</p>");
		out.println("</body>");
		out.println("<html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Конфигурация servlet в web.xml:
<servlet>
    <servlet-name>initParamServlet</servlet-name>
    <servlet-class>org.o7planning.tutorial.servlet.InitParamServlet</servlet-class>
    
    <init-param>
        <param-name>emailSupport1</param-name>
        <param-value>abc@example.com</param-value>
    </init-param>

    <init-param>
        <param-name>emailSupport2</param-name>
        <param-value>tom@example.com</param-value>
    </init-param>

</servlet>    


<servlet-mapping>
    <servlet-name>initParamServlet</servlet-name>
    <url-pattern>/initParam</url-pattern>
</servlet-mapping>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   <display-name>ServletTutorial</display-name>

   
   <servlet>
       <servlet-name>helloServlet</servlet-name>
       <servlet-class>org.o7planning.tutorial.servlet.HelloServlet</servlet-class>
   </servlet>

   <servlet-mapping>
       <servlet-name>helloServlet</servlet-name>
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>


   <servlet>
       <servlet-name>initParamServlet</servlet-name>
       <servlet-class>org.o7planning.tutorial.servlet.InitParamServlet</servlet-class>
       
       <init-param>
           <param-name>emailSupport1</param-name>
           <param-value>abc@example.com</param-value>
       </init-param>
       
       <init-param>
           <param-name>emailSupport2</param-name>
           <param-value>tom@example.com</param-value>
       </init-param>
       
   </servlet>    
   
   
   <servlet-mapping>
       <servlet-name>initParamServlet</servlet-name>
       <url-pattern>/initParam</url-pattern>
   </servlet-mapping>


   
   <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>


</web-app>
Перезапустить веб приложение:

9. Конфигурация Servlet используя Annotation

С Servlet начиная от версии 3.0 можно конфигурировать Servlet используя Annotation, в этом проекте мы используем Servlet версии 3.x, так что мы можем использовать Annotation для конфигурации. Рассмотрим иллюстрированный пример.
AnnotationExampleServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Вы можете конфигурировать один или более URL pattern
// которые могут получить доступ в данный Servlet.
@WebServlet(urlPatterns = { "/annotationExample", "/annExample" }, initParams = {
		@WebInitParam(name = "emailSupport1", value = "abc@example.com"),
		@WebInitParam(name = "emailSupport2", value = "tom@example.com") })
public class AnnotationExampleServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private String emailSupport1;

	public AnnotationExampleServlet() {
	}

	// Данный метод вызывается перед первым сервисом этого Servlet.
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);

		this.emailSupport1 = config.getInitParameter("emailSupport1");
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String emailSupport2 = this.getServletConfig().getInitParameter("emailSupport2");

		ServletOutputStream out = response.getOutputStream();

		out.println("<html>");
		out.println("<head><title>Init Param</title></head>");

		out.println("<body>");
		out.println("<h3>Servlet with Annotation configuration</h3>");
		out.println("<p>emailSupport1 = " + this.emailSupport1 + "</p>");
		out.println("<p>emailSupport2 = " + emailSupport2 + "</p>");
		out.println("</body>");
		out.println("<html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Вы можете получить доступ к этому Servlet в одном из этих 2 ссылок:

10. Servlet Url Pattern

Есть 4 способа конфигурации ссылки для Servlet:
URL Pattern
Examples
/*
http://example.com/contextPath
/*
http://example.com/contextPath/status/abc
/status/abc/*
http://example.com/contextPath/status/abc
/status/abc/*
http://example.com/contextPath/status/abc/mnp
/status/abc/*
http://example.com/contextPath/status/abc/mnp?date=today
/status/abc/*
http://example.com/contextPath/test/abc/mnp
*.map
http://example.com/contextPath/status/abc.map
*.map
http://example.com/contextPath/status.map?date=today
*.map
http://example.com/contextPath/status/abc.MAP
/
Đây là Servlet mặc định.
Когда пользователь вводит ссылку в браузере, то она будет отправлена в WebContainer. WebContainer должен решить, какой Servlet будет обслуживать этот запрос от пользователя.

На изображении ниже показано, как WebContainer решаетиспользовать какой Servlet для обслуживания запроса от клиента.
Например, создать Servlet с URL-pattern со звездочкой, например:
  • url-pattern = "/any/*";
AsteriskServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = { "/any/*" })
public class AsteriskServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public AsteriskServlet() {
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		out.println("<html>");
		out.println("<head><title>Asterisk</title></head>");

		out.println("<body>");

		out.println("<h3>Hi, your URL match /any/*</h3>");

		out.println("</body>");
		out.println("<html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Эти URL имеющие следующий вид, обслуживаются AsteriskServlet (/any/*).
Servlet по умолчанию:
Servlet с url-pattern = /

Это servlet по умолчанию, servlet будет использоваться для обработки запроса (request), который имеет ссылку несовпадающую ни с каким url-pattern другого Servlet объявленный в вашем приложении.
Давайте посмотрим иллюстрированный пример с Servlet по умолчанию:
MyDefaultServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = { "/" })
public class MyDefaultServlet extends HttpServlet {

   private static final long serialVersionUID = 1L;

   public MyDefaultServlet() {
   }

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {

       ServletOutputStream out = response.getOutputStream();

       out.println("<html>");
       out.println("<head><title>Page not found</title></head>");

       out.println("<body>");
       out.println("<h3>Sorry! Page not found</h3>");
       out.println("<h1>404</h1>");
       out.println("Message from servlet: " + this.getClass().getName());
       out.println("</body>");
       out.println("<html>");
   }

   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       this.doGet(request, response);
   }

}
Вы можете перезапустить веб приложение, а также перейти по ссылке:
Ссылка выше имеет servletPath = /news/tomAndJerry, которая не совпадает ни с какой ссылкой Servlet, которую вы объявили. В то же время "Servlet по умолчанию" будет обслуживать этот запрос.

11. Получить основную информацию Servlet

Вы можете получить информацию, которая относится к услуге Servlet, например:
  1. Информация request от client.
  2. Информация Server
  3. Информация Client
  4. Информация Header высыланное по запросу ....
ExampleInfoServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/other/exampleInfo")
public class ExampleInfoServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public ExampleInfoServlet() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletOutputStream out = response.getOutputStream();

		out.println("<style> span {color:blue;} </style>");

		String requestURL = request.getRequestURL().toString();
		out.println("<br><span>requestURL:</span>");
		out.println(requestURL);

		String requestURI = request.getRequestURI();
		out.println("<br><span>requestURI:</span>");
		out.println(requestURI);

		String contextPath = request.getContextPath();
		out.println("<br><span>contextPath:</span>");
		out.println(contextPath);

		out.println("<br><span>servletPath:</span>");
		String servletPath = request.getServletPath();
		out.println(servletPath);

		String queryString = request.getQueryString();
		out.println("<br><span>queryString:</span>");
		out.println(queryString);

		String param1 = request.getParameter("text1");
		out.println("<br><span>getParameter text1:</span>");
		out.println(param1);

		String param2 = request.getParameter("text2");
		out.println("<br><span>getParameter text2:</span>");
		out.println(param2);

		// Server Infos
		out.println("<br><br><b>Server info:</b>");

		out.println("<br><span>serverName:</span>");
		String serverName = request.getServerName();
		out.println(serverName);

		out.println("<br><span>serverPort:</span>");
		int serverPort = request.getServerPort();
		out.println(serverPort + "");

		// Client Infos
		out.println("<br><br><b>Client info:</b>");

		out.println("<br><span>remoteAddr:</span>");
		String remoteAddr = request.getRemoteAddr();
		out.println(remoteAddr);

		out.println("<br><span>remoteHost:</span>");
		String remoteHost = request.getRemoteHost();
		out.println(remoteHost);

		out.println("<br><span>remoteHost:</span>");
		int remotePort = request.getRemotePort();
		out.println(remotePort + "");

		out.println("<br><span>remoteUser:</span>");
		String remoteUser = request.getRemoteUser();
		out.println(remoteUser);

		// Header Infos
		out.println("<br><br><b>headers:</b>");

		Enumeration<String> headers = request.getHeaderNames();
		while (headers.hasMoreElements()) {
			String header = headers.nextElement();
			out.println("<br><span>" + header + "</span>: " + request.getHeader(header));
		}

		// Servlet Context info:
		out.println("<br><br><b>Servlet Context info:</b>");
		ServletContext servletContext = request.getServletContext();

		// Местоположение веб приложения на жестком диске (hard disk).
		out.println("<br><span>realPath:</span>");
		String realPath = servletContext.getRealPath("");
		out.println(realPath);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Смотрите иллюстрацию ниже, с информацией, которая вас интересует:
Перезапустить веб приложение и получить доступ к ссылке:
Полученные результаты:

12. Forward (Пересылка)

No ADS
Пересылка (Forward): Когда запрос (request) браузера отправлен к Servlet, он может переслать запрос на другую страницу (или другой servlet). Адрес на браузере пользователя так же является ссылкой первой страницы, но содержание страницы создавается страницой пересылки.

Пересылающая страница обязательно должна быть одной страницей (или Servlet) в вашем веб приложении.

С Forward вы можете использовать request.setAttribute() для передачи данных от страницы 1 к странице 2.
ForwardDemoServlet.java
package org.o7planning.tutorial.servlet.other;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.tutorial.beans.Constants;

@WebServlet("/other/forwardDemo")
public class ForwardDemoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// Request:
	// http://localhost:8080/ServletTutorial/other/forwardDemo?forward=true
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Получить значение параметра (parameter) на URL.
		String forward = request.getParameter("forward");

		if ("true".equals(forward)) {
			System.out.println("Forward to ShowMeServlet");

			// Натроить данные в атрибут (attribute) request (запроса).
			request.setAttribute(Constants.ATTRIBUTE_USER_NAME_KEY, //
					"Hi, I'm Tom come from Walt Disney !");

			RequestDispatcher dispatcher //
					= request.getServletContext().getRequestDispatcher("/showMe");
			dispatcher.forward(request, response);

			return;
		}
		ServletOutputStream out = response.getOutputStream();
		out.println("<h3>Text of ForwardDemoServlet</h3>");
		out.println("- servletPath=" + request.getServletPath());
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Перезапустить Webserver и запустить поочередно 2 URL:
В случае 1: Нет Forward, данные которые видите на страницах созданы с помощью ForwardDemoServlet.
В Случае 2: Есть пересылка (forward) в Servlet ShowMeServlet. В этом случае URL на странице не меняется, когда данные создавались ShowMeServlet.
Forward (пересылка) часто используется в некоторых ситуациях,например пользователь запрашивает servlet A, однако эта страница требует сначала login, в servlet A проверяется , если еще не сделан login, то пересылает на servlet Login.
Вернемся к RequestDispatcher, у нас есть два метода, чтобы получить объект RequestDispatcher.
Ситуация, когда request.getServletContext ().getRequestDispatcher(url) возвращает RequestDispatcher с относительным расположением к contextPath (расположен относительно к корневой папке вебсайта).
  • http://localhost:8080/contextPath
  • http://localhost:8080/ServletTutorial
При вызыове request.getRequestDispatcher(url) возвращает RequestDispatcher имеет расположение относительное текущей странице
  • http://localhost:8080/ServletTutorial/other/forwardDemo
Примечание:
  • Перенаправление (Redirect) позволяет вам перенаправлять на сайты, включая те, что за пределами вебсайта.
  • Пересылка (Forward) позволяет только пересылку к страницам в вебсайте, а также может передавать данные между двумя страницами через request.setAttribute.

13. Redirect (Перенаправление)

No ADS
Перенаправление (Redirect): Когда запрос (request) от пользователя к Servlet (Страница А), этот Servlet может направить запрос на другую страницу (страница B), и закончить свою задачу. Страница может быть перенаправлена на страницу в вашем приложении, или может быть любой страницей. Адрес на браузере пользователя теперь отображает ссылку страницы B.
В отличии от пересылки (Forward). С Redirect вы не можете использовать request.setAttribute (..) для передачи данных от страницы А на страницу B.
ShowMeServlet.java
package org.o7planning.tutorial.servlet.other;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.tutorial.beans.Constants;

@WebServlet("/showMe")
public class ShowMeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Получить значение атрибута (attribute) request (запроса).
		String value = (String) request.getAttribute(Constants.ATTRIBUTE_USER_NAME_KEY);

		ServletOutputStream out = response.getOutputStream();

		out.println("<h1>ShowMeServlet</h1>");
		out.println(value);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
RedirectDemoServlet.java
package org.o7planning.tutorial.servlet.other;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/other/redirectDemo")
public class RedirectDemoServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	// Request:
	// http://localhost:8080/ServletTutorial/other/redirectDemo?redirect=true
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Получить значение параметра (parameter) на URL.
		String redirect = request.getParameter("redirect");

		if ("true".equals(redirect)) {
			System.out.println("Redirect to ShowMeServlet");

			// contextPath: Является пустым String "" или не пустым.
			// Если не пустой, то всегда начинается с /
			// и заканчивается с /
			String contextPath = request.getContextPath();

			// ==> /ServletTutorial/showMe
			response.sendRedirect(contextPath + "/showMe");
			return;
		}

		ServletOutputStream out = response.getOutputStream();
		out.println("<h3>Text of RedirectDemoServlet</h3>");
		out.println("- servletPath=" + request.getServletPath());
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Перезапустить webserver и получить доступ поочередно к 2 следующим ссылкам на браузере:
С первой ссылкой получили:
Со 2-ой ссылкой, request перенаправил на ShowMeServlet, ссылка URL которую вы видите на браузере - это ссылка servlet ShowMeServlet

14. Сессия (Session)

No ADS
Объект HttpSession описывает одна сессия (session) пользователя. Сессия пользователя хранит много информации о пользователе, и через разные запросы (request), отправленные на HTTP server.

Когда пользователь в первый раз заходит на ваш сайт, пользователь получает только один ID с отличающийся от других пользователей. Этот ID часто хранится в cookie или параметре request
Это код для вашего доступа в объект session:
protected void doGet(HttpServletRequest request,
   HttpServletResponse response)
       throws ServletException, IOException {

   HttpSession session = request.getSession();
}
Вы можете хранить значения в объекте session, и получить их потом, возможно на другой странице. Прежде всего, давайте посмотрим, как вы можете сохранить значения в объекте session
// Получить объект HttpSession
HttpSession session = request.getSession();

// Например пользователь успешно вошел в ситему (login).
UserInfo loginedInfo = new UserInfo("Tom", "USA", 5);

// Сохранить информацию пользователя в 1 атрибут (attribute) Session.
// Вы можете получить данную информацию методом getAttribute.
session.setAttribute(Constants.SESSION_USER_KEY, loginedInfo);
И получить информацию, хранящуюся в Session наопределенной странице
// Получить объект HttpSession.
HttpSession session = request.getSession();

// Получить объект UserInfo сохраненный в session
// после того, как пользователь успешно вошел в систему (login).
UserInfo loginedInfo 
    = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);
Посмотреть полный пример:
LoginServlet.java
package org.o7planning.tutorial.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.o7planning.tutorial.beans.Constants;
import org.o7planning.tutorial.beans.UserInfo;

@WebServlet(urlPatterns = { "/login" })
public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public LoginServlet() {
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		// Получить объект HttpSession
		HttpSession session = request.getSession();

		// Например пользователь успешно вошел в ситему (login).
		UserInfo loginedInfo = new UserInfo("Tom", "USA", 5);

		// Сохранить информацию пользователя в 1 атрибут (attribute) Session.
		session.setAttribute(Constants.SESSION_USER_KEY, loginedInfo);

		out.println("<html>");
		out.println("<head><title>Session example</title></head>");

		out.println("<body>");
		out.println("<h3>You are logined!, info stored in session</h3>");

		out.println("<a href='userInfo'>View User Info</a>");
		out.println("</body>");
		out.println("<html>");
	}

}
UserInfoServlet.java
package org.o7planning.tutorial.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.o7planning.tutorial.beans.Constants;
import org.o7planning.tutorial.beans.UserInfo;

@WebServlet(urlPatterns = { "/userInfo" })
public class UserInfoServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public UserInfoServlet() {
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		// Получить объект HttpSession.
		HttpSession session = request.getSession();

		// Получить объект UserInfo сохраненный в session
		// после того, как пользователь успешно вошел в систему (login).
		UserInfo loginedInfo = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);

		// Если еще не вошел в систему (login), Redirect (перенаправить) на страницу login (LoginServlet).
		if (loginedInfo == null) {
			// ==> /ServletTutorial/login
			response.sendRedirect(this.getServletContext().getContextPath() + "/login");
			return;
		}

		out.println("<html>");
		out.println("<head><title>Session example</title></head>");

		out.println("<body>");

		out.println("<h3>User Info:</h3>");

		out.println("<p>User Name:" + loginedInfo.getUserName() + "</p>");
		out.println("<p>Country:" + loginedInfo.getCountry() + "</p>");
		out.println("<p>Post:" + loginedInfo.getPost() + "</p>");

		out.println("</body>");
		out.println("<html>");
	}

}
Запуск примера:

15. Руководство использования Servlet-Filter

Далее вы можете посмотреть статью о Servlet Filter (Фильтр servlet):

16. Руководство программирования JSP

После Servlet вы можете изучить дальше JSP по ссылке:
No ADS

Руководства Java Servlet/JSP

Show More