programmera.net -> jsp -> normal     för utskrift      info@programmera.net

JavaBeans i JSP

1. Vad är en JavaBean
2. En första böna
3. Testa din första böna i JSP
4. Deklaration
5. Räckvidd
6. Hur bönan initieras
7. Använda bönor i script

1. Vad är en JavaBean

JavaBean (böna) är en klass som bara lagrar data. Ofta använder man bönor för att slussa data mellan databasen och webbläsaren. En böna är en implementation av DTO (Data Transfer Object). Nedan listas några anledningar till att använda bönor:

  • Bönor gör det lättare att hantera data. De aktuella data ligger alltid i bönan och kan därför lätt nås från olika delar av programmet.
  • Bönor har en räckvidd som bestämmer objektets livstid och synlighet. Om räckvidden sätts till session sparas bönan i session-objektet. Detta är ett bekvämt sätt att koppla de data som är relevanta för en användare till användaren.
  • Användandet av bönor gör att webbapplikationen går mot objektorienterad paradigm (istället för funktionell paradigm).
En böna är egentligen en vanlig klass men måste uppfylla vissa krav:
  • En böna måste vara en publik klass.
  • En böna måste ligga i ett paket. Det är standard att använda ditt företags bakvända domännamn som paketnamn för att undvika krockar, t.ex. nu.programmera. Paketet och bönan placeras under /WEB-INF/classes/.
  • En böna måste ha en konstruktor som inte tar några argument. Detta för att de enkelt ska kunna skapas av webb-behållaren. Defaultkostruktorn duger gott, men glöm inte att defaultkonstruktorn försvinner om du definierar en konstruktor själv, och då kanske du inte har någon konstruktor som inte tar argument.
  • En böna får inte ha några publika instansvariabler.
  • En böna måste ha set och get-metoder för varje privat instansvariabel som ska gå att komma åt utifrån. Om instansvariabeln är av typen boolean kan get-metoden ersättas med en is-metod. T.ex. variabeln firstname av typen String behöver alltså ha metoderna public String getFirstname() och public void setFirstname(String).
Men:
  • En böna behöver inte ärva från någon speciell klass eller implementera något gränssnitt.

2. En första böna

Vi skapar en klass ollesBean.java med följande innehåll:
package nu.programmera;

class ollesBean{
  private String firstname;
  private String lastname;
  public String getFirstname(){ 
	  return firstname;
  }
  public String getLastname(){ 
	  return lastname;
  }
  public void setFirstname(String s){
	  firstname=s;
  }
  public void setLastname(String s){
	  lastname=s;
  }
}
Klassen sparas till sökvägen CATALINA_HOME/webapps/examples/WEB-INF/classes/nu/programmera/ollesBean.java och kompileras. Nu har vi skapat en böna.

3. Testa din första böna i JSP

För att använda bönan skapar vi två JSP-sidor, test1.jsp och test2.jsp. Koden förklaras längre ner på sidan. Vi börjar med att skapa test1.jsp med sökvägen CATALINA_HOME/webapps/examples/jsp/test1.jsp:
<HTML>
<BODY>
<H1>Testa bönan 1</H1>
<FORM ACTION="test2.jsp" METHOD="post">
Fyll i:
<BR/>förnamn: <INPUT type="text" name="firstname" >
<BR/>efternamn: <INPUT type="text" name="lastname">
<BR/><INPUT type="submit" value="skicka" >
</FORM>
</BODY>
</HTML>
Sedan test2.jsp i samma katalog:
<jsp:useBean id="ob" class="nu.programmera.ollesBean" scope="session" />
<jsp:setProperty name="ob" property="*" /> 
<HTML>
<BODY>
<H1>Testa bönan 2</H1>
<BR/>förnamn: <jsp:getProperty name="ob" property="firstname"  />
<BR/>efternamn: <jsp:getProperty name="ob" property="lastname"  />
</BODY>
</HTML>
Vi testar den första sidan:



Efter att vi tryckt på submit får vi:



4. Deklaration

Innan man kan använda en böna måste den deklareras med jsp:useBean. Deklarationen av bönan ollesBean i filen test2.jsp ser ut såhär:
<jsp:useBean id="ob" class="nu.programmera.ollesBean" scope="session" />
Nedan förklaras de olika attributen i som kan användas i jsp:useBean:

Attribut Obligatorisk Beskrivning
id  Ja  Detta är det namn som man använder för att använda objektet senare i JSP-sidan.
scope  Ja  Objektets livstid, förklaras nedan.
class  Nej  Sökvägen till bönan. Webb-behållaren söker i /WEB-INF/classes/ efter bönan.
type  Nej  Bönans klass, superklass, eller något gränssnitt som bönan implementerar. Objektet får den specifierade typen. Om attributet inte finns får objektet typen som specifieras i attributet class.
beanName  Nej  Skapar ett objekt med metoden java.beans.Beans.instantiate().

De tre sista attributen är lite märkliga, ingen av dem är obligatorisk men antingen class eller type måste finnas. De förklars senare.

5. Räckvidd

Bönans räckvidd bestämmer hur länge ett objekt överlever och vilka som kan få tillgång till det. Räckvidden bestämms med scope då bönan deklareras. När jsp:useBean översätts till servletkod, tittar tolken på attributet scope för att avgöra i vilket objekt bönan ska lagras i. Följande märke:
<jsp:useBean id="ob" class="nu.programmera.ollesBean" scope="session" />
Detta märke kommer att generera följande kod i Servletten:
HttpSession ses=request.getSession(true);
nu.programmera.ollesBean ob= (nu.programmera.ollesBean) ses.getAttribute("ob");
if(ob == null){
  ob= new nu.programmera.ollesBean();
  ses.setAttribute("ob",ob);
}
Alltså, vi ser att scope="session" gör att objektet lagras som attributet ob i session-objektet. Nedan beskrivs de olika räckvidderna en böna kan deklareras med:

Räckvidd Lagras Beskrivning
page  Lokalt  Objektet kastas då JSP-sidan är processad.
request  request  Objektet överlever så länge som request-objektet, d.v.s. under hela bearbetningen av HTTP-förfrågan. request-objektet kan nås inifrån bönor, märkesbibliotek, JSP-sidor som inkluderas och JSP-sidor som man kommer till via jsp:forward.
session  session  Objektet överlever så länge som session-objektet överlever. Detta är kanske den vanligaste räckvidden för bönor, och det är framförallt bönor man lagrar i session-objektet. Endast ägaren av sessionen kan komma åt objektet.
application  context  Objektet överlever så länge som context-objektet överlever, d.v.s. tills servern stängs av. Webb-behållaren skapar bara ett enda objekt som alla webbanvändare delar på.

6. Hur bönan initieras

I vårt exempel har vi bara använt attributet class, men även type och beanName måste beskrivas. Detta är vad webb-behållaren generellt försöker göra när den träffar på en jsp:useBean:

  1. Letar efter ett objekt med det namn som specifieras i det specifierade räckvidden. T.ex. ses.getAttribute("ob");.
  2. Om den hittar ett objekt, så använder den det. Om du har specifierat type blir objektet den typen.
  3. Om den inte hittar ett objekt, används attributet class för att skapa ett.
Nu är det inte så enkelt, eftersom de tre attributen class, type och beanName kan kombineras på olika sätt. Följande kombinationer är godkända:
  • class="paket.klass": Om ett objekt redan existerar används det, annars skapas ett nytt från konstruktorn class.
  • class="paket.klass" + type="paket.klass": Om ett objekt existerar används det, annars skapas ett nytt från konstruktorn class med typen type.
  • type="paket.klass": Om ett objekt existerar av denna typ används det, annars kastas ett undantag.
  • beanName="paket.klass.ser" + type="paket.klass": Om ett objekt existerar används det, annars avänds metoden java.beans.Beans.instantiate() för att skapa ett objekt. Objektet får typen type.

7. Använda bönor i script

I exemplet ovan har vi bara använt bönan med XML-märkena jsp:setProperty och jsp:getProperty. Detta är de enda XML-märken som en böna kan ha, och de räcker inte så långt. Ofta har bönor metoder som man vill använda, och då måste man använda scriptlets. För att demonstrera detta sätt lägger vi till följande metod i ollesBean:
public String getFullName(String title){
  return title +" "+ firstname + " "+lastname;
}
Vi kompilerar om ollesBean.java, och skapar en ny sida test3.jsp:
<jsp:useBean id="ob" class="nu.programmera.ollesBean" scope="session" />
<HTML>
<BODY>
<H1>Testa bönan 3</H1>
<% ob.setFirstname("Frans"); %>
Hela namnet: <%= ob.getFullName("Herr") %>
</BODY>
</HTML>
Spara test3.jsp tillsammans med de andra i CATALINA_HOME/webapps/examples/jsp/. Gör följande:

  1. Starta om Tomcat.
  2. Kör sidan localhost:7070/examples/jsp/test1.jsp och klicka på submit. Du kommer då till test2.jsp.
  3. Kör sidan localhost:7070/examples/jsp/test3.jsp och du får följande resultat:


Om man prompt inte vill använda sig av script i JSP-sidan kan man istället skriva märkesbibliotek där alla anrop sker via XML. Märkesbibliotek beskrivs på sidan  märkesbibliotek .