JAVA – JSP
JAVA SERVER PAGES
PODSTAWY
2
Źródło strony JSP
<%--
Document : index
Created on : 2008-12-15, 15:47:11 Author : Paolo
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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 Page</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
Wygenerowany servlet
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.Vector _jspx_dependants;
private org.apache.jasper.runtime.ResourceInjector _jspx_resourceInjector;
public Object getDependants() { return _jspx_dependants;
}
4
Metoda _jspService standardowe zmienne lokalne
....
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;charset=UTF-8");
response.setHeader("X-Powered-By", "JSP/2.1");
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;
_jspx_resourceInjector = (org.apache.jasper.runtime.ResourceInjector) application.getAttribute("com.sun.appserv.jsp.resource.injector");
...
}
Metoda _jspService cd.
....
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n");
out.write(" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
out.write(" <title>JSP Page</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" <h1>Hello World!</h1>\n");
out.write(" </body>\n");
out.write("</html>\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0) out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
6
Predefiniowane zmienne
request
– Pierwszy argument metody do obsługi parametrów żądania (typ obiektu HttpServletRequest)
response
– Drugi argument metody do obsługi odpowiedzi (typ obiektu HttpServletResponse )
out
– Obiekt do generowania odpowiedzi przez servlet, (typ obiektu JspWriter) wykorzystuje buforowanie
session
– Obiekt do obsługi mechanizmu sesji związanej z żądaniem (typ obiektu HttpSession) Mechanizm sesji może być wyłączony przez dyrektywę „page”
application
– obiekt do obsługi zmiennych dostępnych w całej aplikacji webowej (typ obiektu ServletContext) Dostęp uzyskany jest przez metodę getServletContext().
Elementy stron jsp
• Skryptlety <% … %>
• Komentarze <%-- … --%>
• Dyrektywy <%@ … %>
• Deklaracje <%! … %>
• Wyrażenia <%= … %>
• Akcje <jsp: …>
8
Wyrażenia (Expressions)
out.print( MyElements.JSPElement.Add(2, 3) );
<%= MyElements.JSPElement.Add(2, 3) %>
out.print( new MyElements.JSPElement().Subtract(2, 3) );
<%= new MyElements.JSPElement().Subtract(2, 3) %>
public class JSPElement {
public static double Add(double a, double b) {
return a+b;
}
public double Subtract(double a, double b) {
return a-b;
} }
Wyrażenia cd (Składnia XML)
Uwaga nie można mieszać znaczników XML ze standardowymi na jednej stronie
<jsp:expression>Java Expression</jsp:expression>
10
Skryplety
Format
– <% Java Code %>
• Wynik
Kod zostaje wstawiony Bezpośrednio do metody _jspService Przykład
<%
String queryData = request.getQueryString();
out.println(" Parametry zadania GET " + queryData);
%>
<% response.setContentType("text/plain"); %>
Składnia w formacie XML
<jsp:scriptlet>Java Code</jsp:scriptlet>
Skryplety przykład
<!DOCTYPE …>
<HTML>
<HEAD>
<TITLE>Color Testing</TITLE>
</HEAD>
<%
String bgColor = request.getParameter("bgColor");
if ((bgColor == null)||(bgColor.trim().equals(""))){
bgColor = "WHITE";
}
%>
<BODY BGCOLOR="<%= bgColor %>">
<H2 ALIGN="CENTER">Test zmiany koloru tła
12
Skryplety właściwości
•Skryplety są wstawiane w servlet dokładnie tak jak zostały napisane,
•Niekoniecznie muszą tworzyć pełne wyrażenia w języku Java,
•Jednak pełne wyrażenia są barziej przejżyste łatwiejsze do analizy
Przykład:
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
Kod wynikowy w servlecie
– if (Math.random() < 0.5) {
out.println("Have a <B>nice</B> day!");
} else {
out.println("Have a <B>lousy</B> day!");
}
Deklaracje
Format
<%!Java Code %>
Wynik
Kod jest wstawiany do definicji klasy servletu poza istniejącymi metodami Przykład
<%! private int someField = 5; %>
<%! private void someMethod(...) {...} %>
Składnia w formacie XML
<jsp:declaration>Java Code</jsp:declaration>
Uwagi:
14
Deklaracje: przykład Kod strony JSP
<H1>Some Heading</H1>
<%!
private String randomHeading() {
return("<H2>" + Math.random() + "</H2>");
}
%>
<%= randomHeading() %>
Deklaracje: Przykład Kod Servletu
public class xxxx implements HttpJspPage {
private String randomHeading() {
return("<H2>" + Math.random() + "</H2>");
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession();
JspWriter out = response.getWriter();
out.println("<H1>Some Heading</H1>");
out.println(randomHeading());
16
Delklaracje Przykład 2
<!DOCTYPE …>
<HTML>
<HEAD>
<TITLE>JSP Declarations</TITLE>
<LINK REL=STYLESHEET HREF="JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<H1>JSP Declarations</H1>
<%! private int accessCount = 0; %>
<H2>Accesses to page since server reboot:
<%= ++accessCount %></H2>
</BODY></HTML>
Metody init i destroy w stronach JSP
Strony JSP mogą wymagać wywołania metod init i destroy
Servlet wygenerowny ze strony JSP może już wykorzystywać te funkcje
Nie można więc wykorzystać deklaracji do ich zdefiniowania, gdyż spowoduje to problemy
Rozwiązanie:
Przeładwać funkcje jspInit i jspDestroy.
Automatycznie generowane servlety wywołują te funkcje, których ciało w wersji
podstawowej jest puste
18
Dyrektywy
<%@ method = ” ...”%>
Dyrektywa page import
Format
<%@ page import="package.class" %>
<%@ page import="package.class1,...,package.classN" %>
Wynik
Dodaje instrukcje import do definicji servletu
Uwagi
Klasy wykorzystywane przez strony JSP muszą być zawarte w pakietach (czyli umieszczoene w odpowiednich katalogach np..:
…/WEB-INF/classes
Przykład
20
Dyrektywa
page contentType
Format
<%@ page contentType="MIME-Type" %>
<%@ page contentType="MIME-Type; charset=Character-Set" %>
<%@ page pageEncoding="Character-Set" %>
Wynik
Określa tym MIME strony generowanej przez servlet utworzony na podstawie definicji strony JSP
Uwagi
– Wartość atrybutu nie może być określona podczas obsługi żądania
Przykład
<%@ page contentType="application/vnd.ms-excel" %>
Dyrektywa
page contentType cd
Ustawienie atrybutu contentType nie może być wyrażeniem warunkowycm Poniższy kod powoduje ustawienie typu MIME (application/vnd.ms- excel) niezależnie od parametrów żądania
<% boolean usingExcel = checkUserRequest(request); %>
<% if (usingExcel) { %>
<%@ page contentType="application/vnd.ms-excel" %>
<% } %>
Trzeba wykorzystać skryplet i wywołać metodę response.setContentType
<%
String format = request.getParameter("format");
if ((format != null) && (format.equals("excel"))) {
22
Dyrektywa page session
Format
<%@ page session="true" %> <%-- Default --%>
<%@ page session="false" %>
Wynik
Określa czy na dana strona implementuje mechanizm Sesji Uwagi
Domyślnie ustawiona na true
Wyłącznie pozwala zaoszczędzić pamięć w przypadku bardzo obciążonego serwera
16
Dyrektywa page buffer
Format
<%@ page buffer="sizekb" %>
<%@ page buffer="none" %>
Wynik
Określa rozmiar bufora wykorzystywanego przez zmienną out
Uwagi
Buforowanie umożliwia ustawienie nagłówków HTTP nawet jeśli pewna część strony została już wygenerowana (dopuki buffor nie został zapełniony lub celowo opróżniony)
Serwer może zastosować większy buffor niż zdefiniowano (nie mniejszy)
24
Dyrektywa page errorPage
Format
<%@ page errorPage=”Wględny adres URL" %>
Wynik
Określa stronę JSP przeznaczonej do obsługi wyjątku wygenerowanego leczni nie przechwyconego przez bierzącą stronę.
Uwagi
Wygenerowany wyjątek jest dosteępny automatycznie dla docelowej strony JSP prze zmienną exception
Plik konfiguracyjny web.xml pozwala na zdefniowanie wielu stron do obsługi konkretnych wyjątków bądź błędów HTTP
Dyrektywa
page isErrorPage
Format
<%@ page isErrorPage="true" %>
<%@ page isErrorPage="false" %> <%-- Default --%>
Wynik
Określa że bierząca strona bezie stroną przeznaczoną do obsługi błędów generowanych przez inną stronę JSP
Uwagi
Tworzona jest dodatkowo zmienna o nazwie exception
Należy przechwytywać jak najwięcej wyjątków mechanizm stron do obsługi błędów stosować w sytuacjach wyjątkowych
26
Dyrektywa page extends
Format
<%@ page extends="package.class" %>
Wynik
Określa klasę bazową dla wygenerowanego na podstawie strony JSP servletu
Uwagi
Stosować rozważnie
Typowe zastosowanie to wykorzystanie klas dostarczonych przez producenta serwera, na którym uruchamiana jest aplikacja (np.. Identyfikacja użytkownika itp.)
Inne dyrektywy
Format
<%@ page isThreadSafe="true" %> <%-- Default --%>
<%@ page isThreadSafe="false" %>
Wynik
Informacja dla systemu, że kod nie jest bezpieczny (threadsafe), więc sysem powinien wyłączyć wspólny dostęp do zasobów dla innych wątków
Zazwyczaj oznacza to że servlet impelmentuje SingleThreadModel
• Uwagi
Unikać, Powoduje degradację wydajności
Format
<%@ page isELIgnored="false" %>
<%@ page isELIgnored="true" %>
28
• JSP Expressions
– Format: <%= expression %>
– Wrapped in out.print and inserted into _jspService
• JSP Scriptlets – Format: <% code %>
– Inserted verbatim into the servlet’s _jspService method
• JSP Declarations – Format: <%! code %>
–Inserted verbatim into the body of the servlet class
• Predefined variables
– request, response, out, session, application
• Limit the Java code that is directly in page – Use helper classes, beans, servlet/JSP combo (MVC), JSP expression language, custom tags