Szoftverfejlesztés J2EE platformon - Labor: Servlet és JSP

A VIK Wikiből

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.



Hello World servlet

  • File / New Project / Web / Web Application
    • Name: Hello
    • Frameworkot most nem hasznalunk.
  • Source Packages / New Servlet
    • Name: HelloWorldServletf
    • Package: hello.web
  • Letrejon a HelloWorldServlet.java, benne a doGet(), doPost() es processRequest() metodusokkal. Az elso ketto atiranyit a processRequest()-re
  • <body> es </body> koze szurjuk be a kovetkezo kodot:
String nev = request.getParameter("nev");
if (nev!=null) {
	out.println("<font color='red'>Szia " + nev + "!</font>");
}

out.println("<form action='HelloWorldServlet' method='GET'>");
out.println("<input type='text' name='nev'>");
out.println("<input type='submit' value='Hello'");
out.println("</form>");
  • Configuration Files / sunweb.xml / Locale ful / New...
    • Locale: hu_HU
    • Character set: UTF-8
  • Inditas: Hello / Deploy Project, majd egy bongeszoben http://zoneX:8080/Hello/HelloWorldServlet (X=1..20)
    • altalanosan: http://szerver cime/context-root/eroforras neve
    • context-root alapbol a project neve, sun-web.xml-ben atdefinialhato
    • ha nem adunk meg eroforras nevet, az index.jsp-re iranyit at, a default oldal a web.xml Pages fulen allithato

Filterek használata

  • Source Packages / New / File/Folder... / Web / Filter
    • Name: HelloFilter
    • package: hello.web
  • Letrejon a HelloFilter.java, az elcseszett indentalast Ctrl+Shift+F-fel lehet javitani
    • Ami erdekes: doBeforeProcessing() es doAfterProcessing() metodusok
  • doBeforeProcessing() metodusba irjuk bele a kovetkezo kodot:
for (Enumeration en = request.getParameterNames(); en.hasMoreElements(); ) {
	String name = (String)en.nextElement();
	if (!"nev".equalsIgnoreCase(name)) {
		HttpServletResponse r = (HttpServletResponse) response;
		r.sendRedirect("HelloWorldServlet?nev=csaltal");
		// redirect utan a chain.doFilter() mar nem csinal semmit
	}
}

Hello world alkalmazás jsp-ben

Kiíratás beágyazott kóddal

  • A generalt index.jsp-t egeszitsuk ki a kovetkezo sorokkal:
<% 
	String name = request.getParameter("nev");
	if (name != null) {
%>
		<font color="red">Hello <%=name%>!</font>
<%
	}
%>

<form>
	<input type="text" name="nev">
	<input type="submit" value="Hello">
</form>

Kiíratás EL segítségével

  • A kiirato sort csereljuk a kovetkezore:
<font color="red">Hello ${param.nev}!</font>

Kiíratás JSTL tag library segítségével

<c:if test="${param.nev != null}">
	<font color="red">Hello ${param.nev}!</font>
</c:if>
  • Az oldal tamadhato cross-site scriptinggel: irjuk be a textboxba, hogy
    <script> alert("Tamadas!"); <script>
  • javitas: <font color="red">Hello <c:out value="${param.nev}"/>!</font>
  • ha nem akarjuk, hogy kiirataskor escape-elje a stringet, <c:out value="..." escapeXml="false"/>

DisplayTag library használata

  • A library tamogatja a <table> taget, amivel lapozhato tablazatot lehet letrehozni
  • Libraries / Add JAR/Folder...
  • Valasszuk ki displaytag konyvtarbol az osszes jsp-t
  • Hozzunk letre egy Person osztalyt
    • A gettereket es settereket jobb gomb / Refactor / Encapsulate Fields menuponttal tudjuk generaltatni
package hello.web;

public class Person {
	 
	 private String nev;
	 private int eletkor;
	 private String email;
	 
	 public String getNev() {
		  return nev;
	 }

	 public void setNev(String nev) {
		  this.nev = nev;
	 }

	 public int getEletkor() {
		  return eletkor;
	 }

	 public void setEletkor(int eletkor) {
		  this.eletkor = eletkor;
	 }

	 public String getEmail() {
		  return email;
	 }

	 public void setEmail(String email) {
		  this.email = email;
	 }
	 
	 public Person() {
	 }
	 
	 public Person(String nev, int eletkor, String email) {
		  this.nev = nev;
		  this.eletkor = eletkor;
		  this.email = email;
	 }
}
  • Hozzunk letre egy SearchServlet-et a hello.web package-be
  • processRequest()-be irjuk be a kovetkezot:
Collection c = new ArrayList();
for (int i=0; i<50; i++) {
	c.add(new Person("#"+i, i*2, "emberke"+i+"@valami.hu"));
}
request.setAttribute("resultList", c);
// a http keres feldolgozasat tovabbitja a megadott komponensnek
// kb. egy include-nak felel meg
request.getRequestDispatcher("result.jsp").forward(request, response);
  • Hozzuk letre a result.jsp-t
  • Include-oljuk be a displaytag libraryt
<%@taglib uri="http://displaytag.sf.net" prefix="display"%>
  • Irassuk ki a resultListet
<h1>Results</h1>

<!-- sort="list": teljes listat rendezi -->
<!-- sort="page": csak az aktualis oldalt -->
<!-- sort="external": kulso programkod vegzi a rendezest -->
<!-- defaultorder lehet "ascending" vagy "descending"
	  meg kell hozza adni a defaultsort attributumot is -->
<!-- defaultsort: hanyadik oszlop alapjan rendezzen (default erteke 1) -->
<!-- requestURI: hova iranyitson at lapozas vagy rendezes eseten.
	  Alapbol a result.jsp-re iranyitana at, de a SearchServletre kene,
	  mert az allitja elo a resultList-et -->
<display:table name="resultList" sort="list" defaultorder="descending" pagesize="10" requestURI="SearchServlet">
	 <display:column property="nev" title="Ez a neve" sortable="true"/>
	 <display:column property="eletkor" title="Ennyi idos" sortable="true"/>
	 <display:column property="email" title="Ez az email cime" sortable="true"/>
</display:table>
  • A web.xml-ben toroljuk a filtert, majd futtassuk

A tablazat minden esetben legeneralodik. Egy lehetseges megoldas:

  • SearchServlet-ben: =request.getSession().setAttribute("resultList", c);=
  • result.jsp-ben: =<display:table name="sessionScope.resultList" sort="list" defaultorder="descending" pagesize="10">=
  • Nagy tablazat eseten gondoskodni kell rola, hogy ha nem hasznaljuk, torlodjon a sessionbol. Szivas.

Saját tag library

  • New / File/Folder... / Web / Tag Library Descriptor
    • Name: mytaglib
  • New / ... / Tag Handler
    • Name: FormatDateTag
    • Tag Support Class: SimpleTagSupport
    • Attributes / New...: java.util.Date date, String format

doTag()-en belul

try {
	SimpleDateFormat d = new SimpleDateFormat(format);
	if (date==null) date = new Date();
	out.println(d.format(date));
} catch (java.io.IOException ex) {
	...
}

index.jsp:

<%@taglib uri="WEB-INF/tlds/mytaglib.tld" prefix="my"%>
...
Az aktualis datum: <my:FormatDate format="yy/MM/dd"/>
<!-- vagy: <my:FormatDate date="<%=new java.util.Date()%> format="yy/MM/dd"/> -->

Egyszeru megoldas:

  • New / ... / Tag File
  • jsp szintaktikaval lehet dolgozni

Önálló feladat

Irni kell egy login.jsp-t. A parametereket a LoginServlet ellenorzi. Ha sikeres a bejelentkezes, a success.jsp-re kell atiranyitani, kulonben az error.jsp-re. A success.jsp-t egy filterrel meg kell vedeni, hogy csak bejelentkezes utan legyen elerheto.

Megoldás

  • Ezen a helyen volt linkelve a(z) login.jsp nevű fájl ("login.jsp" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Valaszthato/J2EELaborJSP oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
web/login.jsp
  • Ezen a helyen volt linkelve a(z) LoginServlet.java nevű fájl ("LoginServlet.java" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Valaszthato/J2EELaborJSP oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
src/java/hello/web/LoginServlet.java
  • Ezen a helyen volt linkelve a(z) LoginFilter.java nevű fájl ("LoginFilter.java" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Valaszthato/J2EELaborJSP oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
src/java/hello/web/LoginFilter.java
  • Ezen a helyen volt linkelve a(z) success.jsp nevű fájl ("success.jsp" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Valaszthato/J2EELaborJSP oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
web/success.jsp
  • Ezen a helyen volt linkelve a(z) error.jsp nevű fájl ("error.jsp" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Valaszthato/J2EELaborJSP oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
web/error.jsp
  • Ezen a helyen volt linkelve a(z) web.xml nevű fájl ("web.xml" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Valaszthato/J2EELaborJSP oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
web/WEB-INF/web.xml

-- Peti - 2006.10.18.