JavaServer sider
| ManchaServer sider:EME | ||
|---|---|---|
| Dynamisk webside del | ||
| Generel information | ||
| Udvikler | Sun Microsystems | |
| Teknisk information | ||
| Planlagt ind | Java | |
| Understøttede platforme | Java EE | |
| Versioner | ||
| Seneste stabile version | 2,3 () | |
| Links | ||
JavaServer Pages (JSP) er en teknologi, der hjælper softwareudviklere med at skabe dynamiske websider baseret på HTML og XML , blandt andre typer dokumenter. JSP ligner PHP , men bruger programmeringssproget Java .
For at implementere og køre JavaServer Pages kræves en webserver , der understøtter servlet -containere såsom Apache Tomcat eller Jetty .
TagLibs -> JSP -> Application Server (Servlets) -> Client (Browser)
Ydeevnen af en JSP-side er den samme som den tilsvarende servlet, da koden er kompileret som enhver anden Java-klasse. Til gengæld vil den virtuelle maskine dynamisk kompilere de dele af applikationen, der kræver det til maskinkode. Dette gør JSP performer og mere effektiv end andre webteknologier, der eksekverer kode på en rent fortolket måde.
Den største fordel ved JSP i forhold til andre sprog er, at Java-sproget er et generelt sprog, der overgår webverdenen og er velegnet til at skabe klasser, der håndterer forretningslogik og dataadgang på en pæn måde. Dette giver dig mulighed for at adskille webapplikationer i lag, hvilket efterlader den del, der har ansvaret for at generere HTML-dokumentet i JSP-filen.
En anden fordel er, at JSP arver Javas portabilitet, og det er muligt at køre applikationerne på flere platforme uden ændringer. Det er endda almindeligt, at udviklere arbejder på én platform, og applikationen ender med at køre på en anden.
Servlets og Java Server Pages (JSP'er) er to metoder til at skabe dynamiske websider på serveren ved hjælp af Java-sproget. I den forstand ligner de andre metoder eller sprog, såsom PHP , ASP eller CGI'er , programmer, der genererer websider på serveren. De adskiller sig dog fra dem på andre ting.
Til at begynde med kører JSP'er og servlets på en Java virtuel maskine, hvilket betyder, at de i princippet kan bruges på enhver type computer, så længe der er en Java virtuel maskine til det. Hver servlet (eller JSP, vi vil bruge den i flæng fra nu af) kører på sin egen tråd, det vil sige i sin egen kontekst; men den begynder ikke at udføre hver gang den modtager en anmodning, men fortsætter fra den ene anmodning til den næste, så der ikke spildes nogen tid på at påkalde den (indlæs program + tolk ). Dens vedholdenhed giver den også mulighed for at gøre en række ting mere effektivt: at oprette forbindelse til databaser og administrere sessioner, for eksempel.
JSP'er er faktisk en alternativ måde at skabe servlets på, da JSP-koden oversættes til Java-servlet-kode første gang, den kaldes, og derefter er det den nye servlet-kode, der udføres og producerer HTML-koden, der udgør responswebsiden, som output.
Beskrivelse
JSP kan ses som en abstraktion på højt niveau af Java-servlets. JavaServer-sider oversættes til servlets i realtid; hver servlet cachelagres og genbruges, indtil den originale JSP er ændret. Med andre ord er JSP'er java-sider til et webmiljø.
Eksempel på JSP-dokument
Kodeeksempel på en JSP-side:
<%@ page errorPage = "myerror.jsp" %>
<%@ page import = "com.foo.bar" %>
<html>
<head>
<%! int serverInstanceVariable = 1 ; %>
…
<%! int localStackBasedVariable = 1 ; %>
…
JSP'er
Eksempel på en JSP-build eller "output":
pakke jsp_servlet;
importer java.util.*;
importer java.io.*;
importer javax.servlet.*;
importer javax.servlet.http.*;
importer javax.servlet.jsp.*;
importer javax.servlet.jsp.tagext.*;
import com.foo.bar; //importeret som et resultat af <%@ page import = "com.foo.bar" %>
stof...
klasse _myservlet implementerer javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {
//indsat som
//resultat på <%! int serverInstanceVariable = 1 ; %>
int serverInstanceVariable = 1;
…
public void _jspService( javax.servlet.http.HttpServletRequest anmodning,
javax.servlet.http.HttpServletResponse-svar)
kaster javax.servlet.ServletException,
java.io.IOException
{
javax.servlet.ServletConfig config = ...;//hent servlet-konfiguration
Objektside = denne;
PageContext pageContext = …;//hent sidekonteksten for denne anmodning
javax.servlet.jsp.JspWriter ud = pageContext.getOut();
HttpSession session = request.getSession( true );
…
For at køre JSP-sider skal du bruge en webserver med en webcontainer, der overholder JSP- og Servlet-specifikationerne. Tomcat 5 er en komplet referenceimplementering til Java Servlet 2.2- og JSP 1.1-specifikationerne.
Syntaks
Implicitte variabler
JSP-sider indeholder visse privilegerede variabler uden behov for at erklære eller konfigurere dem:
| Variabel | klasse |
|---|---|
pageContext
|
javax.servlet.jsp.PageContext
|
request
|
javax.servlet.http.HttpServletRequest
|
response
|
javax.servlet.http.HttpServletResponse
|
session
|
javax.servlet.http.HttpSession
|
config
|
javax.servlet.ServletConfig
|
application
|
javax.servlet.ServletContext
|
out
|
javax.servlet.jsp.JspWriter
|
page
|
java.lang.Object
|
exception
|
java.lang.Exception
|
Direktiver
De er tags, hvorfra der genereres information, som kan bruges af JSP-motoren. De producerer ikke synligt output til brugeren, men konfigurerer snarere, hvordan JSP-siden vil blive eksekveret.
Dens syntaks er:
<%@ directiva atributo="valor" %>
De tilgængelige direktiver er:
include: Inkluder indholdet af en fil på siden ved hjælp af filattributten .
<%@ include file="cabecera.html" %>
taglib: Importer tagbiblioteker (tagbiblioteker)
<%@ taglib uri="/tags/struts-html" prefix="html" %>
page: Specificerer attributter relateret til siden, der skal gengives. Attributterne er:
Attribut Syntaks Udnyttelse import<%@ page import="class; class" %>Importer Java-klasser og -pakker, der skal bruges i JSP-filen. session<%@ page session="false" %>Angiver, om dataene i sessionen skal bruges; standard til "sand". contentType<%@ page contentType="class; class" %>Angiver MIME-typen for "response"-objektet; som standard "text/html; charset=ISO-8859-1". buffer<%@ page buffer="12KB" %>Buffer brugt af forfatterobjekt "ud"; kan tage værdien af "ingen"; standard "8KB". errorPage<%@ page errorPage="/path_to_error_page" %>Angiver stien til den fejlside, der vil blive fremkaldt, hvis der opstår en undtagelse under udførelsen af denne JSP-fil. isErrorPage<%@ page isErrorPage="true" %>Bestemmer, om denne JSP-fil er en undtagelseshåndteringsside. Kun sådanne sider kan få adgang til den implicitte variabel "undtagelse", som indeholder den undtagelse, der forårsagede, at fejlsiden blev kaldt.
Udsagn
De giver os mulighed for at erklære variabler, funktioner og statiske data.
<%! int maxAlumnosClase = 30; %>
Scriptlets
Scriptlets er stykker Java-kode, der er indlejret mellem de statiske elementer på siden...
<% ... código Java ... %>
Udtryk
Udtryk evalueres inde i servlet'en. De må ikke ende med ";".
<%= maxAlumnosClase + 1%>
Følgende eksempel ville sætte attributten "title" indeholdt i anmodningsobjektet som titlen på siden:
<%
String titulo = "";
if (request.getAttribute("titulo") != null) {
titulo = (String) request.getAttribute ("titulo");
}
%>
...
<title><%=titulo%></title>
....
Tags
JSP-tags for at forenkle koden og give mere funktionalitet.
Udvikling af websteder ved hjælp af tags har visse fordele, såsom:
- lette læring.
- lette vedligeholdelsen.
- fremme modularitet og genbrug.
- forenkle koden og reducere antallet af krævede linjer.
Dens syntaks ville være:
<%@ taglib uri="/taglib/lycka" prefix="lycka" %>
...
<lycka:hola/>
...
Når Java-koden genereres til Servlet, vil dette hej -tag blive fortolket af applikationsserveren som tilhørende lycka - tagbiblioteket . Dette bibliotek vil blive identificeret i deskriptorfilen i vores applikation (web.xml) med ressourcenavnet (URI) /taglib/lycka .
<taglib-uri>/taglib/lycka</taglib-uri>
<taglib-location>/WEB-INF/tags/lycka.tld</taglib-location>
En implementering af denne deskriptorfil, /WEB-INF/tags/ lycka.tld kunne være:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>simp</shortname>
<uri>http://www.hachisvertas.net/jcs/taglibs/lycka</uri>
<info>A simple sample tag library</info>
<tag>
<name>hola</name>
<tagclass>org.lcyka.taglibs.miEtiqueta</tagclass>
<bodycontent>empty</bodycontent>
<info>Alaba la belleza de mi gata.</info>
</tag>
</taglib>
Og endelig vil applikationsserveren erstatte tagget med dets tilhørende Java-kode, org.lcyka.taglibs.myTag :
package org.lcyka.taglibs;
import ...;
public class miEtiqueta extends TagSupport {
public int doStartTag {
try {
pageContext.getOut().print("Mi gata es preciosa");
} catch (IOException ioe) {
}
return SKIP_BODY;
}
Og endelig ville browseren vise:
min kat er smuk
JSP-tags
Det er de tags, der tilhører JSP-specifikationen. De giver grundlæggende funktionalitet.
Et første sæt tags giver funktionalitet på sideniveau på en meget enkel måde:
- <jsp:forward> , omdirigerer anmodningen til en anden URL
- <jsp:include> , inkluderer teksten fra en fil på siden
- <jsp:plugin> , downloader et Java-plugin (en applet eller en Bean).
En anden gruppe giver dig mulighed for at manipulere JavaBean-komponenter uden kendskab til Java.
- <jsp:useBean> , giver dig mulighed for at manipulere en Bean (hvis den ikke findes, vil Beanen blive oprettet), og specificerer dens omfang, klasse og type.
- <jsp:getProperty> , henter den angivne egenskab fra en tidligere erklæret bean og skriver den til responsobjektet.
- <jsp:setProperty> , indstiller værdien af en egenskab for en tidligere erklæret bønne.
JSTL-tags
De leveres af Sun i JSTL- distributionen .
- kerne , iterationer, conditionals, URL-manipulation og andre generelle funktioner.
- xml , til XML-manipulation og til XML-Transformation.
- sql , til at administrere forbindelser til databaser.
- i18n , til internationalisering og formatering af tegnstrenge som figurer.
Struts TagLib tags
Distribueret af Apache til at arbejde sammen med Struts Framework.
- PHP
- bønner
- HTML
- logik
- indlejret
- vjgp
Brugerdefinerede etiketter
Vi har tidligere set et eksempel på at lave et brugerdefineret tag gemt i vores eget tagbibliotek.
For at udvikle brugerdefinerede tags vil vi bruge Tag Libraries API.
Java Servlet API er:
javax.servlet.*
JSP API strækker sig fra denne API,
javax.servlet.jsp.*
Endelig strækker Tag Libraries API sig fra sidstnævnte,
javax.servlet.jsp.tagext.*
De mest relevante af denne API er:
- grænseflader _
- Tag, som alle tags skal implementere.
- BodyTag udvider den forrige og definerer yderligere metoder til at inspicere et tags brødtekst.
- Klasserne
- BodyContent, en handler til at læse og skrive til et tags brødtekst.
- BodyTagSupport, som implementerer BodyTag-grænsefladen.
- TagAttributeInfo, for at få oplysninger om attributterne for tagget, der er erklæret i TLD'et.
- TagData, som indeholder attributternes værdier.
- TagExtraInfo, for at specificere ekstra information om et tag, såsom de variabler, som det introducerer i koden eller de attributter, der vil blive valideret.
- TagInfo, baseret på oplysninger fra TLD.
- TagLibraryInfo, repræsenterer informationen fra en TLD.
- TagSupport, implementerer Tag-grænsefladen.
- VariableInfo, indeholder oplysninger såsom typen og omfanget af de variabler, der er oprettet eller ændret af tagget.
En mere detaljeret beskrivelse kan findes på http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/jsp/tagext/package-summary.html
Et andet eksempel på et tag kunne være følgende Java-kode:
package org.lycka.taglibs;
import ...;
public class LowerCaseTag extends BodyTagSupport {
public int doAfterBody() throws JspException {
try {
BodyContent body = getBodyContent();
JspWriter writer = body.getEnclosingWriter();
String bodyString = body.getString();
if ( bodyString != null ) {
writer.print( bodyString.toLowerCase());
}
} catch(IOException ioe) {
throw new JspException("Error: IOException while writing to the user");
}
return SKIP_BODY;
}
}
Efter at have fundet starten af tagget, vil runtime først kalde doStart() metoden, efter at klassen er instantieret. Det kan returnere en af følgende værdier:
- SKIP_BODY, behandler ikke indholdet af taggets brødtekst.
- EVAL_BODY_INCLUDE , evaluerer tekstens krop.
- EVAL_BODY_TAG , evaluerer taggets krop og caster resultatet til en anden strøm, der er gemt i en egenskab for tagget.
Metoden doAfterBody() efter at have behandlet tekstens krop.
Til sidst vil doEndTag() metoden blive kaldt. Du kan returnere:
- EVAL_PAGE for at fortsætte med at behandle JSP-siden
- SKIP_PAGE, for at stoppe behandlingen af JSP-siden, for eksempel for at omdirigere siden
Erklæret i biblioteksbeskrivelsen som
<tag>
<name>lowercase</name>
<tagclass>org.lycka.taglibs.LowerCaseTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>Put body in lowercase.</info>
</tag>
Brugt på JSP-siden
<%@ taglib uri="/taglib/lycka" prefix="lycka" %>
...
<lycka:lowercase>Esto es un EJEMPLO</lycka:lowercase>
Og dit output ville være
Dette er et eksempel