Java-serversider

JSP
Udvidelse .jsp
MIME -type applikation/jsp
Udvikler Eclipse Foundation
Seneste udgivelse 3.1.0 (15. maj 2022 ) ( 2022-05-15 )
Formattype filformat , skabelonmotor og teknisk specifikation
Standard(er) JSR 245
Internet side projects.eclipse.org/… ​(  engelsk)
 Mediefiler på Wikimedia Commons

JSP ( JavaServer Pages ) er en teknologi, der gør det muligt for webudviklere at skabe indhold, der har både statiske og dynamiske komponenter. En JSP-side indeholder to typer tekst: statiske kildedata, som kan være i et af tekstformaterne HTML , SVG , WML eller XML , og JSP-elementer, der konstruerer dynamisk indhold. Derudover kan JSP-tag-biblioteker samt Expression Language (EL) bruges til at indlejre Java -kode i det statiske indhold på JSP-sider.

JSP-sidekoden oversættes til Java-servletkode ved hjælp af Jasper JSP-sidekompileren og kompileres derefter til Java Virtual Machine ( JVM ) bytekode . Servlet-beholdere, der er i stand til at udføre JSP-sider, er skrevet i det platformsuafhængige Java-sprog. JSP'er indlæses på serveren og administreres fra en speciel Java-serverpakkestruktur kaldet Jakarta EE Web Application. Typisk er sider pakket i .war og .ear filarkiver .

JSP-teknologi er en platform-uafhængig, bærbar og let udvidelsesbar teknologi til udvikling af webapplikationer .

Versioner

Siden version 1.2 har udviklingen af ​​JavaServer Pages fundet sted under Java Community Process . JSR 53 definerer JSP 1.2- og Servlet 2.3-standarderne, mens JSR 152 definerer JSP 2.0-specifikationen. I maj 2006 blev JSP-specifikationen 2.1 frigivet under JSR 245 som en del af Java EE 5 . Den 10. december 2009 blev JSP 2.2-specifikationen frigivet som indholdet af JSR 245- udgivelsen .

JSP 1.0 og JSP 1.1

Disse versioner er fundamentalt forskellige fra de tidligere versioner, som blev opfattet som Javas svar på ASP . Nogle af kernefunktionerne i tidligere versioner (såsom muligheden for at udvikle tag-biblioteker) er blevet fjernet eller erstattet i overensstemmelse med princippet om adskillelse af kode og indhold. Da det er svært at navigere og adskille indholdet fra selve koden i store mængder kildekode , opstod ideen om at adskille (overføre) dem ved hjælp af JSP-tags, som f.eks <jsp:useBean/>. For at implementere denne idé er JSP-tags blevet opdelt i tre logiske grupper: direktiver, scriptelementer og handlinger.

JSP 1.2

JSP 1.2 udvider JavaServer Pages 1.1 (JSP 1.1) specifikationen som følger:

JSP 2.0

Den nye version af JSP-specifikationen tilføjer følgende funktionalitet:

Hej $ { param . _ besøgende } <%-- ligner : Hej , < %= anmodning . getParameter ( "besøgende" ) %> --%>

JSP 2.1

Java EE 5-platformen fokuserer på nem udvikling ved hjælp af Java-sprogsannoteringer, der blev introduceret af J2SE 5.0 . JSP 2.1 understøtter dette mål ved at definere afhængighedsinjektionsannotationer på JSP-udsagn og kontekstlyttere.

Oversigt

JavaServer Pages (JSP) giver dig mulighed for at adskille den dynamiske del af siderne fra den statiske HTML . Den dynamiske del er omgivet af specielle tags "<% %>":

Dit værtsnavn : <% = anmodning . getRemoteHost () %>

JSP-sider har en udvidelse .jspog er placeret samme sted som almindelige websider. Strukturen af ​​sådanne sider kan bestå af fem konstruktioner: HTML , kommentarer, script-elementer, direktiver og handlinger. JSP-siden kompileres til en servlet med statisk indhold, der sendes til outputstrømmen, der er knyttet til servicemetoden . På den første anmodning kan denne proces derfor forårsage en lille forsinkelse. Kommentarer i et dokument eller program får ikke programmet til at bremse, da de ignoreres af compileren og udføreren. Script-elementer giver dig mulighed for at specificere Java -kode , der senere vil blive en del af den endelige servlet, direktiver giver dig mulighed for at kontrollere hele strukturen af ​​servlet, og handlinger tjener til at specificere de eksisterende komponenter, der bruges, samt styre adfærden af ​​JSP-motoren . For at gøre scripting nemmere er der foruddefinerede variabler som f.eks request, response, pageContext, session, out, application, config, page, exception. Et eksempel på en JSP-side, der bruger alle JSP-komponenter:

Kommentarer

Kommentarer bruges til at forklare kildekoden til et program. På JSP-sider kan kommentarer opdeles i to grupper:

  • JSP-kildekodekommentarer
  • HTML markup kommentarer .

JSP-kildekodekommentarer er markeret med en speciel sekvens af tegn: <%--i begyndelsen og --%>i slutningen af ​​kommentaren. Denne type kommentar fjernes, når JSP-siden kompileres. JSP kommentar eksempel:

<% -- Viser produktkataloget og den aktuelle indkøbskurv . --%>

HTML - markeringskommentarer er formateret i overensstemmelse med reglerne for HTML-sproget. Denne type kommentarer behandles som statisk tekst af JSP-kompileren og placeres i output-HTML-dokumentet. JSP-udtryk inde i HTML-kommentarer udføres. HTML kommentar eksempel:

<!-- Sidens oprettelsesdato : < %= ny java . brug . Dato () %> -->

Scriptelementer

JSP-specifikationen skelner mellem tre typer scriptelementer:

  • Erklæringer <%!en eller flere erklæringer%>
  • Udtryk <%=enkelt udtryk%>
  • skriftletter <%_%>

Deklarationer bruges almindeligvis til at definere variabler, metoder, indre klasser og andre gyldige Java-konstruktioner på klasseniveau. Udtrykkene bliver argumenter til out.print() metoden. Ved hjælp af scriptlets er arbejdsdele af Java-kode indlejret i JSP-sider.

JSP-erklæringer

JSP-erklæringer giver dig mulighed for at definere variabler, metoder, indre klasser og så videre. Deklarationer bruges til at definere de Java-konstruktioner, der bruges i programmet. Da erklæringer ikke gengives, bruges de normalt i forbindelse med JSP-udtryk eller scriptlets. JSP-eksemplet viser antallet af anmodninger til denne side, siden serveren blev startet (eller siden servlet'en sidst blev ændret og genindlæst). Bemærk, at vi i eksemplet bruger både en erklæring og et udtryk, og at der inde i konstruktionen er et semikolon ( ; ) efter erklæringen:

<%! privat int accessCount = 0 ; % > Antal sidehits siden serverindlæsning : < % = ++ accessCount % > JSP-udtryk

JSP-udtryk bruges til at indsætte Java-værdier direkte i outputtet. Java-udtryk evalueres, konverteres til en streng og indsættes på siden. Disse beregninger finder sted ved kørselstid (det vil sige, når siden er anmodet om), og derfor er der fuld adgang til information om selve anmodningen. I udtryk kan du bruge konstanter, variabler, kald til forskellige metoder. Alle udtryk, uanset kompleksiteten af ​​deres indhold, evalueres til et enkelt resultat eller tal. JSP-sider er afhængige af JSP Writer , som tager ethvert resultat af et udtryk, konverterer det til en type String(tekst) og buffer det . For eksempel viser følgende kode datoen og klokkeslættet for en given sideanmodning:

Aktuel tid : <%= new java . brug . Dato () %> Dit værtsnavn : <% = anmodning . getRemoteHost () %>

Du skal være opmærksom på tre regler:

  • JSP-udtryk skal indeholde Java-udtryk;
  • hvert JSP-udtryk må kun indeholde ét Java-udtryk;
  • JSP-udtryk må ikke slutte med semikolon ( ;), i modsætning til Java-erklæringer.
JSP Scripts

JSP-scriptlets giver dig mulighed for at indsætte enhver kode i en servlet-metode, der vil blive genereret, når siden gengives, hvilket giver dig mulighed for at bruge de fleste af Java-konstruktionerne. Scriptlets har også adgang til de samme foruddefinerede variabler som udtryk. Derfor skal du for eksempel bruge en foruddefineret variabel for at vise en værdi på en side out.

<% String queryData = anmodning . getQueryString (); ud . println ( "Yderligere forespørgselsdata: " + queryData ); %>

Koden inde i scriptlet er indsat, som den blev skrevet. Al statisk HTML (skabelontekst) før eller efter scriptlet er konverteret ved hjælp af print. For eksempel indeholder følgende JSP-kodestykke blandet skabelon- og scriptlettekst:

<% if ( Math . random () < 0,5 ) { %> < B > Hav en god dag </ B > ! <% } else { %> < B > Hav en dårlig dag </ B > til dig ! <% } %>

Efter konvertering af scriptlet vil koden se sådan ud:

if ( Matematik . tilfældig ( ) < 0,5 ) { ud . println ( "<B>Hav en god</B> dag!" ); } andet { ud . println ( "<B>Hav en dårlig dag</B> for dig!" ); }

Dette betyder, at scriptlets ikke behøver at indeholde komplette Java-snippets, og at blokke efterladt åbne kan påvirke statisk HTML uden for scriptlet.

JSP-direktiver

JSP-siden kan sende en besked til den relevante container med instruktioner om, hvad de skal gøre. Disse meddelelser kaldes direktiver. Alle direktiver begynder med <%@, efterfulgt af direktivets navn og en eller flere attributter med værdier og slutter med %>. Direktiverne på JSP-siden får containeren til at sende en anmodning om at udføre en specifik service, som ikke er erklæret i det genererede dokument. Formen af ​​direktiver kan repræsenteres som følger:

<% @ direktiv attribut = "værdi" %>

Du kan også kombinere indstilling af flere attributter på et enkelt direktiv:

<% @ direktiv attribut1 = "værdi1" attribut2 = "værdi2" ... attributN = " værdiN " %>

Der er tre hovedtyper af direktiver: side , som giver dig mulighed for at gøre ting som at importere klasser, ændre en servlets superklasse og så videre; include , som giver dig mulighed for at indsætte en fil i en servlet-klasse, når du oversætter en JSP-fil til en servlet; og taglib , som giver dig mulighed for at udvide mange tags med dine egne, som JSP-containeren er i stand til at fortolke.

JSP side direktiv

Som navnet antyder, giver dette direktiv attributter til JSP-siden. De attributter, der er defineret i dette direktiv, er indlejret i den givne JSP-side og alle dens indlejrede statiske elementer, uanset om de blev indsat med direktivet includeeller med handlingen jsp:include. Direktivets form er som pagefølger:

<% @ page attribute = " værdi " %>

Lad os tage følgende indgang som et eksempel:

<% @ page import = java . brug . * , com . mine klasser . * buffer = 15 kb %>

Dette direktiv angiver, at JSP-siden importerer klasser fra to Java-pakker java.utilog com.myclassesspecificerer derefter størrelsen af ​​den bufferhukommelse, der skal bruges til at behandle den givne JSP-side.

Overvej derefter direktivets attributter page:

  • import="пакет.class1, пакет.class2, ..., пакет.classN".Giver dig mulighed for at angive de pakker, der skal importeres. Dette er den eneste egenskab, der kan bruges flere gange i samme direktiv. Listen skal indeholde alle Java-klasser, som du vil bruge, og som ikke er en del af det originale sæt af importerede klasser. Kildesættet indeholder: java.lang.*, javax.servlet.*, javax.servlet.jsp.* и javax.servlet.http.*.Et eksempel på brug af attributten import:
<% @ page import = "java.util.Date, javax.text.SimpleDateFormat, com.myclasses.*" %>
  • language="java".Denne egenskab er beregnet til at indstille det anvendte programmeringssprog . Standardværdien er "java". Denne attribut er valgfri, men problemet kan stadig opstå, hvis containerens JSP-udbyder bruger andre sprog (såsom JavaScript ). Et eksempel på indtastning af denne attribut er som følger:
<% @ page language = " java " %>
  • extends="пакет.class".Angiver superklassen (overordnet klasse) for den genererede servlet. Typisk er en servlet en udvidelse af den oprindelige klasse. Erfarne programmører kan bruge denne egenskab til at skabe deres egne superklasser. Et eksempel på brug af denne attribut kan se sådan ud:
<% @ page extends = minPakke . HttpEksempel " %>
  • session="true|false".Denne attribut kan indstilles til sand eller falsk , hvilket afgør, om JSP-siden deltager i HTTP- oversættelsen . Værdien true("true", standarden) signalerer, at den foruddefinerede variabel session(type HttpSession) skal være bundet til en eksisterende session, hvis der er en, ellers oprettes og bindes en ny session til. Værdien false("false") angiver, at sessioner ikke vil blive brugt, og forsøg på at få adgang til variablen sessionvil resultere i en fejl ved oversættelse af JSP-siden til servlet'en. Et eksempel på brug af denne attribut kan se sådan ud:
<% @ page session = " falsk " %>
  • buffer="размерkb|none".Denne attribut angiver mængden af ​​bufferhukommelse, der kræves for JspWriter- objektet, der refereres til af den foruddefinerede variabel out. Standardværdien afhænger af serverindstillingerne, men bør være større end 8kb. Værdien angives enten i formen "sizekb" eller "ingen". Hvis du indstiller bufferhukommelsesværdien til none, så vil servletten ikke gemme noget i bufferhukommelsen og vil sende resultatet skrevet før variablen outdirekte til objektet PrintWriter, der leveres med objektet ServletResponse.. Hvis du indstiller bufferhukommelsesværdien til en specifik værdi, JspWritervil den gemme data i denne hukommelse, hvilket resulterer i en stigning i ydeevnen. I modsætning til et objekt kan PrintWriteret objekt JspWritergive undtagelser IOExceptions. Startværdien af ​​bufferhukommelsen er 8kB. Et eksempel på denne attribut kan se sådan ud:
<% @ pagebuffer = 12 kb % >
  • autoflush="true|false".Denne egenskab kan enten være sand eller falsk . Værdien true("true" som standard) angiver, at hvis bufferhukommelsen løber over, vil den automatisk blive ryddet. En værdi false("false"), som sjældent bruges, angiver, at et bufferoverløb skal resultere i en undtagelse ( IOExceptions). Normalt er attributterne bufferog autoflushsat sammen i et direktiv. Når du angiver en attributværdi, er buffer="none"indstilling af en værdi falsefor en attribut autoflushugyldig. Et eksempel kan se sådan ud:
<% @ side buffer = 16 kb autoflush = sand %>
  • isThreadSafe="true|false".Denne egenskab kan enten være sand eller falsk . Værdien true("true", standarden) angiver den normale servlet-udførelsestilstand, når flere anmodninger behandles samtidigt ved brug af en enkelt servlet-instans, baseret på den antagelse, at forfatteren har synkroniseret adgang til variabler i denne instans. Værdien false("false") signalerer, at servlet'en skal arve SingleThreadModel(enkelttrådet model), hvor sekventielle eller samtidige anmodninger håndteres af separate servlet-instanser. Med andre ord vil værdien truefå containeren til at sende flere anmodninger til servlet'en på én gang, mens værdien vil få falsecontaineren til at sende anmodninger én ad gangen. Et eksempel på brug ser sådan ud:
<% @ page isThreadSafe = falsk %>
  • info="информация".Angiver en streng, der kan hentes, når metoden bruges Servlet.getServletInfo().. Typisk returnerer denne metode information om servlet'en (såsom forfatter, version og ophavsret). Et eksempel på denne attribut kan se sådan ud:
<% @ page info = Forfatter : Petr Ivanovich ; version : 1.0 " %>
  • errorPage="url".Angiver en JSP-side, der kaldes, når der opstår hændelser, Throwablessom ikke håndteres af denne side. Hvis der opstår en undtagelse på en JSP-side, og JSP-siden ikke har sin egen kode til at løse undtagelsen, overfører containeren automatisk kontrol til den URL , du har angivet som værdien af ​​attributten errorPage. Et eksempelindlæg ser sådan ud:
<% @ page errorPage = " / myweb / errors / myerror . jsp " %>
  • isErrorPage="true|false".Denne egenskab kan enten være sand eller falsk . Signalerer om denne side kan bruges til fejlhåndtering for andre JSP-sider eller ej. Standardværdien er false"false". Et eksempel på brug af denne attribut kan se sådan ud:
<% @ page isErrorPage = sand %>
  • contentType="MIME-Тип".Denne attribut angiver MIMEoutputtypen, og du kan eventuelt indstille tegnkodningen i svaret ( HTML - svar). Standardværdien MIMEer text/html. For klarhedens skyld kan vi bruge følgende eksempel:
<% @ page contentType = "tekst/almindelig" %>

Du kan opnå det samme resultat ved at bruge et scriptlet:

<% svar . setContentType ( "tekst/almindelig" ); %> JSP inkluderer direktiv

Dette direktiv giver dig mulighed for at inkludere filer i en servlet, når du oversætter en JSP-side. Brug af direktivet ser sådan ud:

<% @ include file = "relativ url" %>

Den givne URL fortolkes normalt i forhold til JSP'en på den side, hvor linket er placeret, men som med alle andre relative URL'er kan du fortælle systemet placeringen af ​​den ressource, du er interesseret i i forhold til webserverens hjemmemappe ved at sætte et " / "- symbol foran URL'en . Indholdet af en include-fil behandles som almindelig JSP-tekst og kan derfor omfatte elementer som statisk HTML , script-elementer, direktiver og handlinger. For eksempel bruger mange websteder en lille navigationslinje på hver side. På grund af problemerne med at bruge HTML -rammer løses denne opgave ofte ved at placere en lille tabel øverst eller i venstre halvdel af siden, hvis HTML -kode gentages mange gange for hver side på siden. Direktivet er den mest naturlige måde at udføre denne opgave på, og redder udvikleren fra mareridtet med at kopiere HTML ind i hver enkelt fil. Det sker sådan her: include

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > < html > < head > < title > Testside < / title > </ head > < body > <% @ include file = "/navbar .html" %> <!-- Et specifikt fragment af denne side ... --> </ body > </ html >

Bemærk, at da direktivet includeinkluderer filer under sideoversættelse, efter at du har foretaget ændringer i navigationslinjen, bliver du nødt til at genoversætte alle JSP-sider, der bruger det. Hvilket i dette tilfælde er et godt kompromis, da navigationslinjen som regel ændres ret sjældent, og forbindelsesprocessen ikke mister sin effektivitet. Hvis de inkluderede filer ændres ret ofte, kan du bruge handlingen i stedet for jsp:include. Denne handling inkluderer filen under adgang til JSP.

JSP taglib direktiv

Som du allerede ved, skrives elementer på JSP-sider ved hjælp af tags (konventionelle skilte, etiketter, mærker). Det sæt af tags, som en JSP-container kan fortolke, kan udvides med såkaldte tag-biblioteker. Du kan også knytte handlinger til et udvidet sæt tags, hvilket resulterer i en udvidelse af selve JSP-sproget. Tags kan opdeles i standard- og brugerdefinerede tags. En generaliseret måde at skrive på kan se sådan ud:

<% @ taglib uri = " URI til at tagge bibliotek " prefix = " tegnpræfiks " % >

Tag-biblioteket skal identificeres med en URI -adresse (en unik ressource-id). URI kan enten være absolut eller relativ. Den unikke ressource-id identificerer placeringen af ​​et tag-bibliotek ( TLD ), der definerer det pågældende biblioteks egne tags. Et eksempel på en direktivindgang:

<% @ taglib uri = " http://www.moywebserver.ru/naydiznaki.tld " præfiks = "iskat" %>

En JSP-side kan indeholde et uendeligt antal direktiver taglib, men hvert direktiv skal have et andet præfiks, der definerer indholdet af biblioteket på siden. Som præfiks kan du bruge en hvilken som helst tekst, ord. Mens et direktiv taglibkan bruges hvor som helst på en JSP-side, skal alle indbyggede tags, som disse direktiver bruger, bruges bag dem.

Handlinger

JSP-handlinger bruger XML -syntakskonstruktioner til at kontrollere driften af ​​servletmotoren. Du kan dynamisk inkludere en fil, genbruge JavaBeans , dirigere brugeren til en anden side eller generere HTML til et Java-plugin . Alle disse handlinger diskuteres i detaljer nedenfor. Husk, at som med al XML , skelnes der mellem store og små bogstaver i element- og attributnavne. Handlinger kan opdeles i to grupper: standard og oprettet (egen, som programmøren opretter). Følgende standardhandlinger er tilladt:

  • jsp:declaration  — Erklæring, svarende til <% tag! … %>;
  • jsp:scriptlet  - Scriptlet, svarende til <% ... %> tag;
  • jsp:expression  - Udtryk, der ligner <%= ... %> tag;
  • jsp:text  - Tekstoutput;
  • jsp:useBean  - Find eller opret en ny JavaBean-instans;
  • jsp:setProperty  - Indstil JavaBean-egenskaber;
  • jsp:getProperty  - Indsæt en JavaBean-egenskab i outputstrømmen;
  • jsp:include  - Inkluderer filen på tidspunktet for sideanmodningen;
  • jsp:forward  - Omdirigerer anmodningen til en anden side;
  • jsp:param  - Tilføjer parametre til anmodningsobjektet, såsom forward, include, plugin.;
  • jsp:plugin  - Genererer kode (afhængigt af den anvendte browsertype), der opretter et tagOBJECTellerEMBEDtil et Java-plugin;
  • jsp:params  - Grupperer parametre i jsp:plugin-tagget;
  • jsp:fallback  - Angiver det indhold, der skal bruges af klientbrowseren, hvis plug-in'et ikke starter. Bruges inde i plugin-elementet.
jsp:useBean handling

Denne handling giver dig mulighed for at indlæse en JavaBean til senere brug på en JSP-side. Denne funktion giver dig mulighed for at genbruge Java-klasser uden at ofre fordelene ved JSP-servlets. Derudover er dette en måde at fjerne meget af Java-behandlingen fra JSP-siden. Hvis du overfører Java-behandling fra en JSP-side til en JavaBean, så kan disse funktioner så bruges på andre JSP-sider. Den enkleste syntaks til at specificere bønnen, der skal bruges, er:

< jsp : useBean id = "navn" class = "pakke.klasse" />

Typisk betyder dette "at oprette en ny forekomst af et objekt af klassen specificeret af klassen og associere det med en variabel navngivet af id ". Du kan dog indstille scope - attributten (tager værdierne for siden, page|request|session|applicationfor anmodninger, for sessioner eller dialoger, for applikationen), som ikke kun er forbundet med den aktuelle side. I dette tilfælde er det nyttigt at få referencer til eksisterende , og handlingen instansierer kun et nyt objekt, hvis der ikke findes et objekt med samme id og omfangsværdier . Nu hvor du har en , kan du ændre dens egenskaber med en handling , eller ved at bruge en scriptlet til at gøre det og eksplicit kalde objektets metode med variabelnavnet angivet tidligere via id -attributten . Husk på, at med bønner , når du siger "denne bønne har en egenskab af type X ved navn " mener du virkelig "denne klasse har en metode , der returnerer data af type X og en anden metode, der tager X som en parameter." Handlingen er dækket mere detaljeret i næste afsnit, men indtil videre skal du huske, at du enten udtrykkeligt kan indstille værdi ved at indstille param- attributten for at få værdien fra den tilsvarende forespørgselsparameter, eller blot opregne egenskaber for at få værdier fra forespørgselsparametre med samme navne som egenskaber. Du kan få værdierne af eksisterende egenskaber ved at bruge JSP-udtryk eller scriptlets ved at kalde den passende metode eller (oftest) ved at bruge en handling . pagerequestsessionapplicationbeanbeansjsp:useBeanbeanjsp:setPropertyfoogetFoosetFoojsp:setPropertygetXxxjsp:getProperty

Klassen givet til bønnen skal være i serverens normale klassemappe, ikke i den del, der er reserveret til klasser, der automatisk genindlæses efter redigering. For f.eks. Java-webserveren skal alle brugte klasser placeres i en mappe classeseller en .jar -fil i mappen lib, ikke i mappen servlets. Nedenfor er et simpelt eksempel, der indlæser beanog indstiller/får en simpel strengparameter.

BeanTest.jsp

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > < html > < head > < title > Genbrug af JavaBeans i JSP < / title > < / head > < body > < h1 > Genbrug af JavaBeans i JSP </ h1 > < jsp : useBean id = "test" class = "hall.SimpleBean" /> < jsp : setProperty name = "test" property = "message" value = "Hej WWW" /> < p > Meddelelse : < jsp : getProperty name = "test" egenskab = "meddelelse" /> </ p > </ body > </ html >

SimpleBean.java

pakkehal ; _ public class SimpleBean { private String message = "Beskedtekst ikke angivet" ; public String getMessage () { return ( message ); } public void setMessage ( String message ) { this . besked = besked _ } }

Et par flere detaljer om, hvordan du bruger jsp:useBean. Den nemmeste måde at bruge bean det på er at bruge konstruktionen:

< jsp : useBean id = "navn" class = "pakke.klasse" />

at indlæse beanog derefter bruge jsp:setPropertyog jsp:getPropertytil at ændre og få dens egenskaber (parametre). Der er dog to andre måder. Først kan du bruge containerformatet, nemlig:

< jsp : useBean ... > Body </ jsp : useBean >

for at sikre, at Body kun udføres, når en instans beanoprettes for første gang, og ikke når en eksisterende findes og bruges bean. Som diskuteret nedenfor, beanskan deles, så ikke alle udtryk jsp:useBeanresulterer i en ny forekomst af bean. For det andet, udover id og klasse , er der tre andre attributter, du kan bruge: scope , type og beanName . Disse attributter er beskrevet nedenfor:

  • id  - Giver navnet på den variabel, der refererer tilbean. Hvis det kan findesbeanmed de samme værdier afidogscope, så bruges det tidligere oprettede objekt i stedet for at oprette en ny instans;
  • class  - angiver det fulde navn på pakkenbean;
  • scope  - specificerer det omfang, detbeanskal være tilgængeligt i. Det kan tage fire gyldige værdier: side , anmodning , session og applikation . Den er som standard side , hvilket betyder, at denbeankun er tilgængelig på den aktuelle side (hostet på denPageContextaktuelle side). Anmodningsværdienbetyder, at denkun er tilgængelig for den aktuelle klientanmodning (hostet i objektet ) . Sessionsværdien betyder, at objektet er tilgængeligt for alle sider i den nuværendelevetid. Og endelig betyder værdiapplikationen , at den er tilgængelig for alle sider, der bruger den samme. Grunden til, at denne attribut er nødvendig, er, fordi denforårsager, at en ny forekomst af objektet oprettes, hvis der ikke er noget eksisterende objekt med sammeog. Ellers bruges et allerede eksisterende objekt, og alle elementereller nogen mellem taggeneignoreres.beanServletRequestHttpSessionServletContextjsp:useBeanidscopejsp:setParameterjsp:useBean
  • type  - angiver typen af ​​den variabel, der refererer til objektet. Skal matche navnet på den klasse, superklasse eller grænseflade, der implementeres. Variabelnavnet angives gennem attributtenid.
  • beanName  - giver det navnbean, der vil blive brugt af metodeninstantiate. Du kan angivetypeogbeanNameog udelade attributtenclass.
handling jsp:setProperty

Du kan bruge jsp:setPropertydet tidligere beskrevne beans. Du kan gøre dette på to måder. For det første kan du bruge jsp:setPropertyefter, men uden for elementet jsp:useBean, som vist i eksemplet:

< jsp : useBean id = "mitNavn" ... /> ... < jsp : setProperty name = "mitNavn" egenskab = "noget Ejendom" ... />

I dette tilfælde jsp:setPropertyudføres den, uanset om en eksisterende instans blev fundet, beaneller en ny instans blev oprettet. En anden mulighed er at placere jsp:setPropertyi elementets krop jsp:useBean, som vist i et andet eksempel:

< jsp : useBean id = "mitNavn" ... > ... < jsp : setProperty name = "mitNavn" egenskab = "noget Ejendom" ... /> </ jsp : useBean >

Dette jsp:setPropertygøres kun, hvis en ny instans af objektet er blevet oprettet, og ikke når en eksisterende er fundet. En handling jsp:setPropertyaccepterer følgende fire attributter:

  • navn  - Denne påkrævede attribut bruges til at indstillebeanegenskaberne, som vil blive indstillet. Elementetjsp:useBeanskal gå forud for brugen af ​​elementetjsp:setProperty.
  • egenskab  - Denne påkrævede attribut angiver den egenskab, du vil indstille. Der er dog et særligt tilfælde: værdien " * " betyder, at alle forespørgselsparametre, hvis navne matcher egenskabsnavnene,beanvideregives til den tilsvarende egenskabsindstillermetode.
  • værdi  - Denne valgfri attribut angiver værdien af ​​egenskaben. Strengværdier konverteres automatisk til numerisk, boolsk , boolsk , byte , byte , tegn og tegn ved hjælp af standardmetoden for denvalueOftilsvarende klasse. For eksempel vil værdien"true"for ejendommenbooleanellerBooleanblive konverteret ved hjælp af metodenBoolean.valueOf, og værdien "42" for ejendommenintellerIntegervil blive konverteret ved hjælp af metodenInteger.valueOf. Du kan ikke bruge værdi- og param- attributterne på samme tid , men du kan vælge slet ikke at bruge dem. Se beskrivelsen af ​​param- attributten nedenfor.
  • param  - Denne valgfri attribut angiver den forespørgselsparameter, der bruges til at hente egenskaben. Hvis denne parameter er fraværende i den aktuelle anmodning, sker der ingen handling: Systemet videregiver ikke værdiennulltil den metode, der angiver egenskaberne. Det er således acceptabelt at brugebeanstandardegenskaberne og kun tilsidesætte dem, hvis det kræves af anmodningsparametrene. For eksempel betyder følgende fragment følgende: "indstil egenskaben inumberOfItemshenhold til værdien af ​​anmodningsparameterennumItems, og hvis der ikke er en sådan parameter i anmodningen, foretages der ingen handling."
< jsp : setProperty name = "orderBean" property = "numberOfItems" param = "antalItems" />

Hvis du hverken bruger valueeller param, er det det samme, som hvis du havde givet et navn, der parammatcher navnet property. Du kan anvende dette princip med automatisk at bruge forespørgselsegenskaber, hvis navne matcher egenskabsnavne, og gå videre ved at indstille egenskabsnavnet til " * " og udelade værdi- og parameterparametrene . I dette tilfælde vil serveren behandle de gyldige egenskaber og forespørgselsparametre for at matche identiske navne. Det følgende er et eksempel, der bruges beantil at lave en tabel med primtal. Hvis der findes en parameter numDigitsi anmodningsdataene, sendes den til bean numDigits. Tilsvarende for numPrimes. JspPrimes.jsp

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > < html > < head > < title > Genbrug af JavaBeans i JSP < / title > < / head > < body > < h1 > Genbrug af JavaBeans i JSP </ h1 > < jsp : useBean id = "primeTable" class = "hall.NumberedPrimes" /> < jsp : setProperty name = "primeTable" property = "numDigits" /> < jsp : setProperty name = "primeTable" egenskab = "numPrimes" /> < p > Adskillige primtal for tegn < jsp : getProperty name = " primeTable " property = "numCifret" /> : < jsp : getProperty name = "primeTable" property = "numberedList" /> </ p > </ body > </ html > jsp:getProperty handling

Dette element bestemmer værdien af ​​egenskaben bean, konverterer den til en streng og sender den til outputstrømmen. For at udføre en handling skal der angives to attributter: navnet bean, som er forudindstillet i handlingen jsp:useBean, og navnet på den egenskab, hvis værdi skal bestemmes. Følgende er et eksempel på, hvordan du bruger denne handling:

< jsp : useBean id = "itemBean" ... /> ... < UL > < LI > Antal varer : < jsp : getProperty name = "itemBean" property = "numItems " / > < LI > Enhedspris : < jsp : getProperty name = "itemBean" property = "unitCost" /> </ UL > jsp:inkluder handling

Denne handling giver dig mulighed for at indsætte indholdet af filer på den genererede side. Handlingssyntaks:

< jsp : include page = "relativ URL" flush = "sand" />

I modsætning til direktivet include, som indsætter en fil under JSP-oversættelsesfasen af ​​siden, indsætter denne handling filen, når siden anmodes om. Dette resulterer i et vist tab af effektivitet og eliminerer muligheden for JSP-kode i den indsatte fil, men det giver en betydelig fordel med hensyn til fleksibilitet.

Et eksempel på indsættelse af indholdet af fire filer på en JSP-side:

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//DA" "http://www.w3.org/TR/html4/strict.dtd" > < html > < head > < title > Nyheder </ title > </ head > < body > < h1 > Nyheder </ h1 > < p > Her er uddrag fra vores fire mest populære artikler : </ p > < ol > < li >< jsp : include page = "news/Item1. html" flush = "true" /></ li > < li >< jsp : include page = "news/Item2.html" flush = "true" /></ li > < li >< jsp : include page = " news/ Item3.html" flush = "true" /></ li > < li >< jsp : include page = "news/Item4.html" flush = "true" /></ li > </ ol > </ body > </ html > jsp:forward action

Denne handling giver dig mulighed for at sende anmodningen til en anden statisk HTML-side, servlet eller JSP-side. I modsætning til en handling jsp:includeslutter behandlingen af ​​den aktuelle side. Den bruger én attribut page, som skal indeholde en relativ URL , baseret på hvilken objektet er bestilt request. jsp:paramDu kan tilføje andre parametre til de originale forespørgselsparametre, der er sendt til en anden side ved hjælp af en handling . Attributværdien pagekan enten være en statisk værdi eller en værdi beregnet under anmodningen, som vist i følgende to eksempler:

< jsp : forward page = "/utils/errorReporter.jsp" /> < jsp : forward page = "<%= someJavaExpression %>" />

Ved hjælp af en handling jsp:forwardkan du også overføre kontrol til en anden side, men med den betingelse, at der ikke blev skrevet noget til den udgående bufferhukommelse, før du kalder denne handling (ellers vil der blive kastet en undtagelse IllegalStateException).

jsp:param handling og jsp:params handling

Denne handling giver oplysninger om navn/værditype. Denne handling bruges hovedsageligt sammen med de allerede kendte handlinger jsp:includeog jsp:forward. Derudover kan den også bruges sammen med handlingen jsp:plugin. I andre tilfælde er brugen af ​​denne handling ligegyldig. Bruges jsp:parammed handlinger jsp:includeog jsp:forwardsender det originale objekt til nye sider request, som vil blive udvidet med de nye parametre. Hvis du angiver nye værdier for allerede eksisterende parametre, så er det de nye værdier, der har forrang. Ved hjælp af en handling jsp:paramskan du indstille flere parametre på én gang

jsp:plugin handling

Denne handling giver dig mulighed for at indsætte elementet OBJECT eller EMBED (afhængigt af hvilken type browser du bruger), der kræves for at køre applets, der bruger Java-plugin'et. Med andre ord tjener denne handling til at generere HTML for at indlejre Java API på JSP-siden. På samme måde kan du indsætte URL'en for at downloade moduler til Java API fra JavaSoft, som giver mulighed for at køre applets inde i browseren. Tilmeldingsformularen til denne handling ser således ud:

< jsp : plugin type = "bean|applet" code = "klassefil " codebase = "CodeBase-objekt" align = "placering" archive = "arkivliste " højde = "højde" hspace = "vandret rum" jreversion = "version" name = "komponentnavn" vspace = "vertical space" width = "width" nspluginurl = "url" iepluginurl = "url" > < jsp : params > < jsp : param name = "name1" value = "value1" /> < jsp : param name = "name2" value = "value2" /> ... < jsp : param name = "nameN" value = "valueN" /> </ jsp : params > < jsp : fallback > </ jsp : fallback > </ jsp : plugin >

Lad os se på et eksempel på brug af denne handling i appletkoden:

< jsp : plugin type = "applet" code = "Blink.class" width = 300 højde = 100 > < jsp : params > < jsp : param name = lbl value = "Ja, det er mere lækkert end bare skiveskåret brød! " /> < jsp : param name = speed value = "4" /> < jsp : params > < jsp : fallback > Din browser kan af en ukendt årsag ikke køre denne applet </ fallback > </ jsp : plugin >

Et eksempel på en JSP-side, der bruger XML-syntaks

<? xml version = "1.0" encoding = "UTF-8" ?> < jsp : root xmlns : jsp = "http://java.sun.com/JSP/Page" version = "2.0" > < jsp : direktiv . page contentType = "application/xhtml+xml; charset=UTF-8" /> < jsp : output doctype - root - element = "html" doctype - public = "-//W3C//DTD XHTML 1.1//EN" doctype - system = "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" udelad - xml - erklæring = "sand" /> < html xmlns = "http://www.w3.org/ 1999/xhtml" > < head > < meta http - equiv = "Content-Type" content = "text/html; charset=UTF-8" / > < title > Sidetitel </ title > </ head > < body > < h1 > Overskrift </ h1 > < p > Tekst </ p > < jsp : scriptlet > ud . print ( Calendar . getInstance ( request . getLocale ()). getFirstDayOfWeek () == Kalender . SUNDAY ? "I dit land starter ugen på søndag" : "I dit land starter ugen ikke på søndag" ); </ jsp : scriptlet > </ body > </ html > </ jsp : root >

Se også

Links