Пример JSP, hello world!

В отличие от сервлетов, требующих компиляции java-файла для получения класса (файла *.class) jsp страница не требует компиляции и регистрации в дескрипторе поставки web.xml.

Контейнер сервлетов расширили препроцессором, переводящим запись JSP страницы в сервлет. Препроцессор обрабатывает страницу JSP автоматически при первом обращении к ней. Полученный в результате его работы сервлет тут же компилируется и выполняется. Откомпилированный сервлет затем сохраняется в WEB-контейнере также, как и все сервлеты, и выполняется при последующих вызовах страницы JSP.

Пример Dynamic Web Project

Рассмотрим простой пример, в котором на JSP странице приветствия будут отображены текущая дата и время. Для разработки будет использована IDE Eclipse. На следующем скриншоте представлено определение типа проекта Dynamic Web Project.

Определим наименование проекта как HelloJSP и создадим в проекте файл index.jsp. Структура проекта представлена на следующем скриншоте.

Код дескриптора приложения web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
              http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee">
  <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

В дескрипторе приложения web.xml в качестве страницы приветствия определен JSP файл index.jsp.

Исходный код JSP страницы index.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*, java.text.*" %>

<%! 
String getFormattedDate() 
{ 
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss"); 
    return sdf.format(new Date()); 
} 
%>
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Добро пожаловать, JSP!</title>
  </head>
  <body>
       <h1>Добро пожаловать!</h1>
       <i>Сегодня <%= getFormattedDate() %></i>
  </body>
</html>

На JSP странице мы объявили (JSP declarations) функцию форматирования даты getFormattedDate(). Чтобы функция была выполнена во второй строке "импортированы" необходимы классы.

На следующем скриншоте страница index.jsp представлена в браузере.

Теперь можно посмотреть исходный код страницы, отображенной в браузере.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Добро пожаловать, JSP!</title>
  </head>
  <body>
       <h1>Добро пожаловать!</h1>
       <i>Сегодня 08.04.2016 11:08:56</i>
  </body>
</html>

Как можно увидеть, JSP директивы (directives) import, JSP объявления (declarations), JSP выражения (expressions) уже отсутствуют.

Исходный код сервлета index_jsp.java

В заключение рассмотрения данного простого пример можно по диагонали взглянуть на исходный код сервлета index_jsp.java, который сформирован из JSP страницы index.jsp. IDE Eclipse размещает сервлет в директории WORKSPACE/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/work/Catalina/localhost/HelloJSP/org/apache/jsp . Может быть использована другая поддиректория вместо tmp1 (к примеру, tmp0).

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.56
 * Generated at: 2016-04-08 06:52:38 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import java.text.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

 
String getFormattedDate() 
{ 
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss"); 
    return sdf.format(new Date()); 
} 

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"
                 http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      out.write("      <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("      <title>Добро пожаловать, JSP!</title>\r\n");
      out.write("  </head>\r\n");
      out.write("  <body\r\n");
      out.write("       <h1>Добро пожаловать!</h1>\r\n");
      out.write("       <i>Сегодня ");
      out.print( getFormattedDate() );
      out.write("</i>\r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

Перехват исключительных ситуаций, ErrorPage, isErrorPage

Для обработки исключительных ситуаций необходимо определить JSP страницу ошибки. Для создания такой страницы необходимо установить значение аттрибута isErrorPage директивы page в значение true. В этом случае будет открыт доступ к неявным объектам исключений в JSP. На странице, где возможна исключительная ситуация необходимо определить страницу ошибки в атрибуте errorPage директивы page.

Создадим две страницы : страницу генерирования ошибки errorPageAttribute.jsp и страницу обработки ошибки errorPage.jsp.

Исходный код errorPageAttribute.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page errorPage="errorPage.jsp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Пример атрибута errorPage</title>
    </head>
    <body>
        <h1>Пример атрибута errorPage</h1>
        Результат деления на нуль : <% int x = 5/0;%>
    </body>
</html>

Исходный код errorPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page isErrorPage="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
         <title>Страница обработки ошибки</title>
    </head>
    <body>
       <h1>Страница обработки ошибки</h1>
       <i>Ваша страница сгенерировала ошибку : <%= exception.toString() %> </i>
    </body>
</html>

Если мы попытаемся открыть страницу с генерацией ошибки errorPageAttribute.jsp, то сервер нас автоматически переадресует на страницу errorPage.jsp, скриншот которой будет выглядеть следующим образом.

Обратите внимание, что сервер открыл страницу обработки ошибки без перенаправления (url без redirect'a).

Перехват исключительных ситуаций с помощью JSTL тега <c:catch>

Для перехвата исключительных ситуаций с помощью JSTL Core Tags следует использовать тег <c:catch>. Тег c:catch записывает в переменную exception описание ошибки, которую можно обработать в теге c:if. В качестве примера демонстрируется JSP страница catch-exception.jsp, в которой создается и перехватывается исключительная ситуация.

Исходный код catch-exception.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Перехват исключений</title>
  </head>
  <body>
      <c:catch var ="exception">
          <% int x = 5/0; %>
      </c:catch>
  
      <c:if test = "${exception ne null}">
         <p>Exception : ${exception} <br />
         Exception message : ${exception.message}</p>
      </c:if>
  </body>
</html>

Если мы попытаемся открыть страницу с генерацией ошибки errorPageAttribute.jsp, то сервер нас автоматически переадресует на страницу errorPage.jsp, скриншот которой будет выглядеть следующим образом.

Скачать примеры

Исходные коды JSP страниц проекта HelloJSP (368 Кб), рассмотренных в тексте страницы, можно скачать здесь.

  Рейтинг@Mail.ru