Web-fejlesztés NGM_IN002_1 Dinamikus tartalom 3. Template feldolgozás
Template feldolgozás Statikus (HTML) fájlok dinamikus tartalom beszúrással (speciális tagek) Template processzor PHP Cold Fusion ASP JSP Adatbázis lekérdezések Vezérlési szerkezetek Iteratív feldolgozás Templatek el!nyei Létrehozás, karbantartás nem programozó oldaltervez!k által minél fejletebb megoldás annál inkább programozási tevékenység Tartalom és megjelenítés szétválasztása MVC tervezési minta template mint interfész
JSP technológia Üzleti logika és megjelenítés szétválasztása megjelenítés: XML, HTML üzleti logika: Java Beans, taglib-ek Kiterjeszthet!ség Servlet technológia Kliens Szerver <html> <body> Dinamikus tartalom </body> </html> <html> <body> <jsp:usebean.../> <jsp:getproperty.../> <jsp:getproperty.../> </body> </html> A JSP el!nyei vs. ASP J2EE vs. PHP Java API vs. Servletek módosíthatóság separation of concerns script és tag alapú dinamikus tartalom szerver oldali fordítás -> hatékony specifikáció hordozhatóság többféle implementáció
JSP vs. servletek servlet tisztán servlet public class OrderServlet...{ public void doget(...) { if(isordervalid(req)){ saveorder(req); out.println("<html>"); out.println("<body>");... private void isordervalid(...) {... private void saveorder(...) {... kérés feldolgozás megjelenítés public class OrderServlet...{ public void doget(...) { if(bean.isordervalid(req)){ bean.saveorder(...);... forward("conf.jsp"); <html> <body> <ora:loop name="order">... </ora:loop> </body> </html> üzleti logika isordervalid() JSP JavaBeans saveorder() JSP elemek " "Expressions: <%= expression %> " "Statements: <% statement %> " "Declarations: <%! declaration %> " "JSP directives: <%@ directive %> Alternative XML syntax: " "<jsp:expression>...</jsp:expression> " "<jsp:scriptlet>...</jsp:scriptlet> " "<jsp:declaration>...</jsp:declaration> " "<jsp:directive.../> " "<jsp:include.../>
JSP feldolgozás hello.jsp GET /hello.jsp helloservlet.java Kliens HTTP/1.1 200 OK <html>... Szerver helloservlet. class JSP és servlet együttm#ködés Tipikus megközelítés servlet: tartalom kezelés Javaban JSP: megjelenítés HTML-ben Kommunikáció HttpSession attribútumok RequestDispatcher
Tartalom generálási lehet!ségek JavaBeanek öndokumentálás alkalmazás kialakítása programozás nélkül Scriptelemek kódbeágyazás script nyelven (java) kerülend! (szeparálás) JavaBean JavaBeanek jellemz!i paraméter nélküli constructor nincs public példány változó perzisztens értékek -> properties getxxxx, setxxx metódusok szerializálhatóság megoszthatóság usebean scope page (PageContext) request (ServletRequest) session (HttpSession) application (ServletContext)
JSP és MVC model adatok, feldolgozási m#veletek java osztályok view megjelenítés JSP oldalak controller kérések fogadása, model update servlet Apache Struts framework Struts
PHP Szerver oldali script nyelv Apache modul C-szer# szintaxis objektum orientáltság beágyazás html oldalba xml szer# <?php...?> sgml szer# <??> script <script language= php > fels!bb szint# template megoldások Smarty JSP példa <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Welcome to Our Store</TITLE> </HEAD> <BODY> <H1>Welcome to Our Store</H1> <SMALL>Welcome, <!-- User name is "New User" for first-time visitors --> <%= Utils.getUserNameFromCookie(request) %> To access your account settings, click <A HREF="Account-Settings.html">here.</A> </SMALL> <P> Regular HTML for all the rest of the on-line store$s Web page. </BODY> </HTML>
...... Generált servlet <% response.adddateheader("expires", 0); %> <html><head><title>jsp</title></head> <body><h1>hello World!</h1> <%! private int hits = 0; %> You are visitor number <% synchronized(this) { out.println(++hits); %> since the last time the service was restarted. <p> This page was last updated: <%= new java.util.date().tolocalestring() %> </body></html> response.setcontenttype("text/html;charset=iso-8859-1"); pagecontext = _jspxfactory.getpagecontext(this, request, response,"", true, 8192, true); application = pagecontext.getservletcontext(); config = pagecontext.getservletconfig(); session = pagecontext.getsession(); out = pagecontext.getout(); // begin [file="/helloworld2.jsp";from=(0,2);to=(0,41)] response.adddateheader("expires", 0); // end // HTML // begin [file="/helloworld2.jsp";from=(0,43);to=(3,0)] out.write("\r\n<html><head><title>jsp</title></head>\r\n<body><h1>hello World!</h1>\r\n"); // end // HTML // begin [file="/helloworld2.jsp";from=(3,28);to=(4,23)] out.write("\r\nyou are visitor number "); // end // begin [file="/helloworld2.jsp";from=(4,25);to=(4,70)] synchronized(this) { out.println(++hits); // end // HTML // begin [file="/helloworld2.jsp";from=(4,72);to=(7,28)] out.write("\r\nsince the last time the server was restarted.\r\n<p>\r\nthis page was last updated: "); // end RequestDispatcher public class Register extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { String email = request.getparameter("email"); HttpSession session = request.getsession(true); session.setattribute("email", email); RequestDispatcher dispatcher = getservletcontext().getrequestdispatcher ("/present.jsp"); dispatcher.forward(request, response);
Script vs. Bean <% %> ShoppingCart cart = (ShoppingCart)session. getattribute("cart"); // If the user has no cart, create a new one if (cart == null) { cart = new ShoppingCart(); session.setattribute("cart", cart); <jsp:usebean id="cart" class="cart.shoppingcart" scope="session"/> Bean használata <%@ page language="java" contenttype="text/html" %> <html> <body bgcolor="white"> <jsp:usebean id="clock" class="java.util.date" /> The current time at the server is: <ul> <li>date: <jsp:getproperty name="clock" property="date" /> <li>month: <jsp:getproperty name="clock" property="month" /> <li>year: <jsp:getproperty name="clock" property="year" /> <li>hours: <jsp:getproperty name="clock" property="hours" /> <li>minutes: <jsp:getproperty name="clock" property="minutes" /> </ul> </body> </html>
JavaBean /** Simple bean to illustrate sharing beans through * use of the scope attribute of jsp:usebean. */ public class AccessCountBean { private String firstpage; private int accesscount = 1; public String getfirstpage() { " return(firstpage); public void setfirstpage(string firstpage) { " this.firstpage = firstpage; public int getaccesscount() { " return(accesscount++); Bean scope <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Shared Access Counts: Page 1</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <TABLE BORDER=5 ALIGN="CENTER"> <TR><TH CLASS="TITLE"> Shared Access Counts: Page 1 </TH></TR></TABLE> <P> <jsp:usebean id="counter" class="coreservlets.accesscountbean" scope="application"> " <jsp:setproperty name="counter" property="firstpage" value="sharedcounts1.jsp" /> </jsp:usebean> Of SharedCounts1.jsp (this page), <A HREF="SharedCounts2.jsp">SharedCounts2.jsp</A>, and <A HREF="SharedCounts3.jsp">SharedCounts3.jsp</A>, <jsp:getproperty name="counter" property="firstpage" /> was the first page accessed. <P> Collectively, the three pages have been accessed <jsp:getproperty name="counter" property="accesscount" /> times. </BODY> </HTML>