670 likes | 902 Views
16 - JSP. Developement platform. You need a J2ee compatible server There is more possibilities. Here we look at: Tomcat & Axis (Apache), only webservice Sun Application Server with NetBeans But it could have been: Websphere with Eclipse (IBM) JBoss ("gnu") (with NetBeans, Eclipse,...)
E N D
Developement platform • You need a J2ee compatible serverThere is more possibilities. • Here we look at: • Tomcat & Axis (Apache), only webservice • Sun Application Server with NetBeans • But it could have been: • Websphere with Eclipse (IBM) • JBoss ("gnu") (with NetBeans, Eclipse,...) • JBulider • Apache Geronimo • mv.
J2EE covers from frontend to backend Enterprise Information Systems (EIS): Relational Database, Legacy Applications, ERP Systems
Some essential parts of J2EE • Servlet - Class that communicates by http (generates html, xml,...) • No directly counterparts in .Net, but is in the area of remoting • JSP - Java Server Script. • Similar to ASP.NET (not ASP classic!) • When it is requested the 1st time, it is precompiled to a servlet and thereafter a class file. • That is also happens in ASP.NET • JavaBeans - Components, that lives in the J2EE container • Entity beans are non volatile objects, that refers to entities in e.g. database • Session beans are volatile objects that takes care of communication with the client
Examples of n-tier • 4-tier J2EE applications • HTML client, JSP/Servlets, EJB, JDBC/Connector • 3-tier J2EE applications • HTML client, JSP/Servlets, JDBC • 3-tier J2EE applications • EJB standalone applications, EJB, JDBC/Connector • B2B Enterprise applications • J2EE platform to J2EE platform through the exchange of JMS or XML-based messages
J2EE (+J2SE+J2ME+..) and .NET (comparision) • Both J2EE and .Net supports object based n-tier applications • Both runs on several platforms (.net by Mono) • But: • More providers of j2ee (primary Sun and IBM, but also Oracle, Nowell...) • Java is (unofficial) build on standards. But is not under control of official authority. • C# is defined in a ANSI standard, but in praxis under MS control • J2EE contains a component container, that takes care of security, persistency i.e. • VisualStudio is a better IDE (imo) • .....
Serverscript • Er et script sprog som køres på serveren til at generere html-kode. • ASP, JSP og PHP er eksempler på scriptssprog • Der skal være en fortolker til det givne sprog. • Serveren finder ud af hvilken fortolker, der skal anvendes vha. mime typer
Hvad er JSP? • Modspil til ASP og PHP • Standard web-adgang til J2EE (web-server) • Bygger på Servlets • men er lettere at skrive, specielt ved output tunge servlets • og lettere at lave tool support
Eksempel <%@page import="java.util.*"%> <%! Calendar cal = Calendar.getInstance(); %> <% cal.setTime(new Date()); %> <HTML> <UL> <LI>Week=<%= cal.get(java.util.Calendar.WEEK_OF_YEAR)%> <LI>Year=<%=cal.get(java.util.Calendar.YEAR)%> </UL> </HTML>
Elementer • Statisk tekst (HTML eller XML) • Direktiver • Scripting elementer • Implicitte variable • Standard tags • Brugerdefinerede tags
Direktiver • <%@direktiv attribut=værdi ….%> • <%@page imports=”java.util.*” %> • Page • language • extends • imports • .. • Include • taglib
Scripting • Declarations • <%! Int i=43;%> • Scriptlets • <% cal.setTime(new Date()) %> • Expressions • <%= cal.get(Calendar.WEEK_OF_YEAR)%>
Forskel på <%! og <% • <!% ... %> udføres første gang siden loades (i en session).Bruges f.eks. til erklæringer og initialisering af variable:<%! int count=0; %> • <% ... %> udføres hver gang siden (re)loades. Bruges f.eks til generering af html:<% out.println(”<p>Antal er ”+count+”</p>”); %>
Implicite objekter • request • response • session • application
Expressions • En expression (udtryk) har formen:<%= expression %> • Typisk vil en expression tilføje en streng til html-koden. • F.eks:<p>Nu indsættes en streng: <%=”Strengelej” %></p>
Et andet eksempel <%@ page import="java.util.Date, java.text.DateFormat, java.io.File" %> <html> <head> <title>Express Yourself</title> <style type="text/css"> <!– body { background-color: #ffffff; } h1 { text-align: center; color: #008888; } u { color: #ff0000; } table { margin-left: 10%; margin-right: auto; } tr td { font: smaller; } p { margin-left: 5%; font-family: sans-serif; } --> </style> </head>
<body> <h1>Expressions</h1> <p>Some basic expressions:</p> <table> <tr> <td>call for an unformatted java.util.Date() returns:</td> <td><u><%= new Date() %></u></td> </tr> <tr> <td>call for the real path to the root of this JSP returns:</td> <td><u><%= application.getRealPath("/") %></u></td> </tr>
<tr> <td>call for the URL path and name of this JSP returns:</td> <td><u><%= request.getServletPath() %></u></td> </tr> <tr> <td>call for the file path and name of this JSP returns:</td> <td><u><%= new File(application.getRealPath(request.getServletPath())) %></u></td> </tr> </table>
<p>If we add some other methods and combine some of the above we get nicer output:</p> <table> <tr> <td>The current time is:</td> <td><u><%= DateFormat.getTimeInstance().format(new Date()) %></u></td> </tr> <tr> <td>This page was last modified:</td> <td><u><%= DateFormat.getInstance().format(new Date(new File(application.getRealPath(request.getServletPath())).lastModified())) %> </u></td> </tr> </table> </body> </html>
Erklæringer • Erklæring kan erklære en variabel som i Java. • Men man kan også lave metoder. • En erklæring har formen:<%!erklæring;[erklæring;]%> • F.eks: <%! private int etTal=14; private String enStreng=”Davs du”;%> • Variablen kan så senere bruges
Load counter <html> <head> <title>JSP erklæring: Counter</title> </head> <body> <h1>Declarations</h1> <%! private int j = -1; //Her er erklæringen%> <h2>Counter</h2> <p>Denne side er reloaded <%= ++j %> gange</p> </body> </html>
Metoder • Metoder kan også erklæres:<%! String hejMedDig(String navn) { return ”<P>Hej, jeg hedder ”+ navn +”</P>”; } %> • Kaldes med:<%=hejMedDig(”Sigurd”);
Scriplets • Er når man blander koden med JSP. • Ved tunge scripts bør man indkapsle i metoder eller i java klasser. • En fil med mange scriplets kan være svær at læse. • Eksempel på scriplet:<ul><% for(int i=0;i<10;i++) {%><li>Linie <%=i%><%}%></ul>
URL’s • URL: Uniform Resource Locator • Er det der står i adresse feltet i browseren • F.eks:http://www.computerworld.dk/Vis_artikel.asp?ArticleID=12 • Elleren_anden_port.ah.dk:337
Metoder til aflæsning af URL’s • request:getScheme()Aflæser protokollen • request:getServerName()Aflæser servernavn som ip adresse eller navn • request.getServerPort()Aflæser portnummer • request.getRequestURI()Aflæser selve sidens sti. Dvs. det der kommer mellem servernavnet og søgestrengen
QueryStrings • Man kan overføre værdier i URL’n • Bruges f.eks i søgemaskiner eller i indkøbskurven i et ehandelssystem • www.hunden.dk/vishund.jsp?race=”labrador”&”farve=”sort”&ben=4 • request.getParameter(String name) aflæser værdien • F.eks: request.getParameter(”race”) vil returnere ”labrador” • Tal fås således:int antalBen=Integer.parseInt(request.getParameter(”ben”)); • Hele strengen fås med:request.getQueryString() • request.getParameterNames() returnerer navne på parametrene
Forms • <form method=”post”>Navn: <input name=”navn” type=”text” size=”20”> <br></form> • Giver en ny url: minside.jsp?navn=... • method angiver hvordan URL’en skal dannes: • post tilføjer søgestrengen • get laver en helt ny url
get / post / action • Get: Tilføjer en QueryString til URL’en Bruges ved simple forms, hvor strengen er mindre end 255 tegn • Post: Sender data umiddelbart efter at resultat-url’en er fundet. Man kan ikke se data i url’en. De fås med getParameter(..) • Action Indlæser en ny side med parametrene. Den url, der står i browseren er den samme.
Et eksempel – post <form method="POST"> Navnet er <%=request.getParameter("feltNavn")%> <P> Navn <input type="text" name="feltNavn" size="20"> </p> <p><input type="submit" value="Submit" name="B1"> <input type="reset" value="Reset" name="B2"></p> </form>
Eksempel – Get <form method=”GET"> Navnet er <%=request.getParameter("feltNavn")%> <P>Navn <input type="text" name="feltNavn" size="20"></p> <p><input type="submit" value="Submit" name="B1"> <input type="reset" value="Reset" name="B2"></p> </form>
Eksempel – Action formtest.jsp: <form method="POST” action=result.jsp> <P>Navn <input type="text" name="feltNavn" size="20"></p> <p><input type="submit" value="Submit" name="B1"> <input type="reset" value="Reset" name="B2"></p> </form> result.jsp: <h1> Navnet er <%=request.getParameter("feltNavn")%></h1>
Indlæsning af flere ens parametre • F.eks varer til en indkøbskurv • Her bruges metoden:String [] request.getParameterValues(String name)
Eksempel <% //Hent alle værdier for vareNavn String varer[] = request.getParameterValues("vareNavn");%> <% //Udskriv alle værdier for (int i=0; i< varer.length;i++){ %> vare nr. <%=i+1%> er <%=varer[i]%> <br> <% } // slut på for-sætning%>
Forms, som de bruges meget <% //Hvis form er sendt som resultat af en POST sættes et flag boolean isOK=false; if(request.getMethod().equals("POST")){ isOK=true; } %> <% // Hvis den er ok, så udskriv resultat, eller bed om input if(isOK){%> Navn er <%=request.getParameter("feltNavn")%> <br> Email er <%=request.getParameter("feltEmail")%> <%} // end if %>
Forsat.... <% //Hvis den ikke er ok, så vis formen if(!isOK){%> <form method="POST"> <P> Navn <input type="text" name="feltNavn" size="20" value=<%=request.getParameter("feltNavn")%>> <br> Email <input type="text" name="feltEmail" size="20" value=<%=request.getParameter("feltEmail")%>> </p> <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p> </form> <%} //end if%>
Validering • Check at inputdata er gyldige (valide): • F.eks:<% //Valideringif(isOK){ if(request.getParameter("feltNavn").equals("")){ isOK=false; %> <h2>Navn skal angives</h2> <% } //endif } //endif %>
Scopes i JSP • Udover de generelle scopes kan man definere hvilket scope et objekt skal befinde sig i: • Page Eksisterer kun for siden. Når siden forlades dør variable/objekter • SessionEksisterer for sessionen. Sålænge browseren er åben, og ikke timed out • Application Eksisterer på server niveau. Sålænge serveren kører
Scriptelementer • Direktiver • <%@ page import=”java.util.*”%> • Declarations • <%! Int i=43;%> • Scriptlets • <% cal.setTime(new Date()) %> • Expressions • <%= cal.get(Calendar.WEEK_OF_YEAR)%>
Hvor dannes der her html-kode? <%! //erklæring af banner og links array String [] billeder = {"sas.gif", "kasino.gif", "bredband.gif","bolig.bmp"}; String [] links = {"http://www.sas.dk", "http://www.casino.com","http://www.tdc.dk","http://www.bolig.dk"}; int index=0; //initialisering af index til arrays %> <html> <body bgcolor="#FFFFFF" text="#000000"> <a href="<%=links[index]%>"> <img src="<%=billeder[index]%>" width="468" height="60" border="0"> </a> </body> </html> <% //flyt index index++; if(index==billeder.length) index=0; //reset index %>
Gode råd • Gør det i små skridt. Så kan du overskue, hvor det går galt • Lav designet førstOg lad vær med at tænke på JSP her. • Overvej hvilken del af html’en i designet at JSP skal skrive. • Skriv resten af JSP-koden.
Session • Med sessionsstyring er det muligt at tilpasse information og navigationsmuligheder til den enkelte bruger • Og registrere i f.eks et CRM-system, hvad brugeren gør. • HTTP (HTML) er udviklet til at vise statisk HTML. Derfor er der ikke indbygget sessionsstyring. • Sessionsstyring forudsætter serverside programmer eller scripts
Session og JSP • Første gang en bruger loader en side fra sitet genereres et unikt sessionid, som gemmes i browseren. • Hvis det er muligt bruges en cookie, ellers tilføjes en querystring til URL’n • Samtidigt oprettes et unikt sessionobjekt på serveren, som bl.a også indeholder id’et. • Et id kan kun tilknyttet et sessionobjekt
Attributes • Sessionobjektet anvendes ofte til at gemme forskellige variable. • Variable gemmes altså på serveren, og ikke i f.eks en cookie • Dette gøres med setAttribute(String navn, Object value)F.eks: session.setAttribute(”brugernavn”,”Børge”); • Den hentes igen med getAttribute(String navn)F.eks: String bruger=session.getAttribute(”brugernavn”); • Istedet for getAttribute og setAttribute kan man bruge hhv. getValue og setValue. Men de er deprecated, dvs de er på vej ud.
Object • setAttribute og getAttribute gemmer værdier af typen Object. • Fordelen er at alle objekter af klassser i Java kan gemmes. F.eks kan en indkøbskurv laves som en klasse, der gemmes. • Ulempen er at simple datatyper, f.eks int og boolean ikke kan gemmes direkte. • Man er nødt til lave dem til et objekt. F.eks kan en int gemmes således:int ant=7;session.setAttribute(”antal”,new Integer(ant)); • Den aflæses således:int ant=(Integer) session.getAttribute(”antal”).intValue();
Andre metoder • getAttributeNames() giver en liste med de anvendte attributer. • getCreationTime() giver tidspunktet for oprettelse af sessionobjektet • getID() giver sessionid’et. Kan være interessant hvis man kører flere services samtidigt eller ved logning • getLastAccessedTime() returnerer hvor lang tid der er gået siden sidste gang brugeren har gjort noget på sitet