Добро пожаловать, JSP!

Пример 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

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

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

    %>     

Добро пожаловать!

Сегодня

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

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

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

      

Добро пожаловать!

Сегодня 08.04.2016 11:08:56

Как можно увидеть, 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 _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map 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("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write(" \r\n"); out.write(" \r\n"); out.write(" \r\n"); out.write(" \r\n"); out.write(" Добро пожаловать!\r\n"); out.write(" Сегодня "); out.print( getFormattedDate() ); out.write("\r\n"); out.write(" \r\n"); out.write("\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

        

Пример атрибута errorPage

Результат деления на нуль :

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

        

Страница обработки ошибки

Ваша страница сгенерировала ошибку :

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

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

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

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

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

            

Exception : $
Exception message : $

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

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

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

Источник

Introduction to Java Server Pages JSP

This tutorial is the first one of several where we will see what are JSP pages, how they work and their main uses, as well as its related technologies.

What is a JSP?

A JSP is a document based in HTMLs tags and in its own tags. Below we will see an example of a page called login.jsp:








String user = request.getParameter("user");
String pass = request.getParameter("password");
if ("edu4java".equals(user) && "eli4java".equals(pass)) out.println("login ok");
> else out.println("invalid login");
>
%>

Here we can see that all the code is HTML except for what is inside the tags which is java code. This JSP does the same as the code in the following Servlet.

package com.edu4java.servlets; 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 LoginServlet extends HttpServlet < @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < String user = request.getParameter("user"); String pass = request.getParameter("password"); if ("edu4java".equals(user) && "eli4java".equals(pass)) < response(response, "login ok"); >else < response(response, "invalid login"); >> private void response(HttpServletResponse resp, String msg) throws IOException < PrintWriter out = resp.getWriter(); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println("" + msg + ""); out.println(""); out.println(""); > >

From the point of view of a web page designer, the jsp is a lot more simple than a servlet. Taking into account that normally in the companies, the web designers don´t have great knowledge on java and vice versa, it is obvious the advantages of the JSP. If there is a lot of html on the page and there is a lot of work, it can become a nightmare, even for the most senior java developer. Imagine pages and pages of out.println( .

 String user = request.getParameter("user"); 
String pass = request.getParameter("password");
if ("edu4java".equals(user) && "eli4java".equals(pass)) out.println("login ok");
> else out.println("invalid login");
>
%>

If we take a look at the java code of the JSP we can notice that there is no declaration of the variables «request» and «out». These variables are known as Implicit Objects and there are predefined with standard names to be used by the programmer in the java code of the JSPs. Below there is a description of some of these Implicit Objects:

request object with the information received from the browser.
response object which will contain the information that we will send back as a response to the browser.
out object Writer which we can use to send Html (or any another type of content) to the browser.
session object which keeps the data in between calls of the same user.
application object which keeps the data during all the life of the application.

The objects request y response are the ones which are received as parameters in the methods doPost(HttpServletRequest request, HttpServletResponse response) and doGet(HttpServletRequest request, HttpServletResponse response). The objects request, response and application allows us to keep information and we will see them in detail in a tutorial on «web application scope».

Testing login.jsp

We copy login.jsp into WebContent and we modify login.html so that instead of calling /login, it calls directly to login.jsp

Click on the right button of the mouse in login.html — Run as — Run on server. http://localhost:8080/first-jee/login.html is open. We fill user, password and we click on the Submit Query button.

Another advantage of the JSPs, is that it is not necessary to declare them in the web.xml.

How does a JSP work in the server o Servlet container?

When we deploy a JSP and start a server, the server creates the java code for a servlet based on the JSP content and it compiles it. In my installation we can find the files .java and .class of this servlet in:

It is not necessary to understand all the generated java code but it is interesting to have a look at it.

package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class login_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent < private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static java.util.List _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.AnnotationProcessor _jsp_annotationprocessor; public Object getDependants() < return _jspx_dependants; >public void _jspInit() < _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig() .getServletContext()).getExpressionFactory(); _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig() .getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName()); >public void _jspDestroy() < >public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException < PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try < response.setContentType("text/html"); 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("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\t"); String user = request.getParameter("user"); String pass = request.getParameter("password"); if ("edu4java".equals(user) && "eli4java".equals(pass)) < out.println("login ok"); >else < out.println("invalid login"); >out.write("\r\n"); out.write("\r\n"); out.write(""); > catch (Throwable t) < if (!(t instanceof SkipPageException))< out = _jspx_out; if (out != null && out.getBufferSize() != 0) try < out.clearBuffer(); >catch (java.io.IOException e) <> if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); > > finally < _jspxFactory.releasePageContext(_jspx_page_context); >> >
  • The class HttpJspBase extends from HttpServlet.
  • _jspService(HttpServletRequest request, HttpServletResponse response) replaces doPost and doGet.
  • We can see the declarations of the implicit objects request, response, out, session, etc.
  • The html code of our JSP is sent to the browser using out.write().

Источник

Читайте также:  Задание последовательности в python
Оцените статью