Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 (Server-Side Programming using Java Server Pages) cs236607.

Similar presentations


Presentation on theme: "1 (Server-Side Programming using Java Server Pages) cs236607."— Presentation transcript:

1 1 (Server-Side Programming using Java Server Pages) cs236607

2 2

3 3 Motivation Software components (e.g. objects, data structures, primitives) are extensively used in Web applications For example: Service local variables Attributes forwarded in requests Session attributes, such as user information Application attributes, such as access counters See tutorial at http://java.sun.com/docs/books/tutorial/javabeans/ http://java.sun.com/docs/books/tutorial/javabeans/ cs236607

4 4 Motivation Standard actions are used to manipulate components: declaration, reading from the suitable context, setting of new values (according to input parameters), storing inside the suitable context, etc. Java Beans provide a specification for automatic handling and manipulation of software components in JSP (and other technologies...) cs236607

5 5 Java Beans: The Idea Java Beans are simply objects of classes that follow some (natural) coding convention: An empty constructor A readable property has a matching getter A writable property has a matching setter Use JSP actions to access and manipulate the bean, and special action attributes to specify the properties of the bean, e.g., its scope JSP programmers do not wish to write cumbersome code or class files cs236607

6 6 Example 1: Access Counter In the following example, we use a Bean to maintain an access counter for requests to the pages cs236607

7 7 package myUtils; public class CounterBean { private int counter; public CounterBean() { counter = 0; } public int getCounter() { return counter; } public void setCounter(int i) { counter = i; } public void increment() { ++counter; } } Counter Bean CounterBean.java Bean must reside in a package A Bean is created by an empty constructor Counter setter and getter Other methods can be implemented as well A Bean is a concept and therefore there’s no need to extend any class or implement any interface! (though it would’ve been very Java-ish to create an empty interface “Bean”) cs236607

8 8 Bean Example <jsp:useBean id="accessCounter" class=“myUtils.CounterBean" scope="application"/> Welcome to Page A Accesses to this application: Page B pageA.jsp Invokes getCounter() An instance named according to the given id is either found in the relevant scope or is created The default scope is page You could also use the type attribute in order to instantiate a data type which is either superclass of class or an interface that class implements cs236607

9 9 Bean Example <jsp:useBean id="accessCounter" class=“myUtils.CounterBean" scope="application"/> Welcome to Page B Accesses to this application: Page A pageB.jsp A very similar JSP Since an instance named according to the given id can be found in the application scope, no instantiation takes place cs236607

10 10 myUtils.CounterBean accessCounter = null; synchronized (application) { accessCounter = (myUtils.CounterBean) _jspx_page_context.getAttribute("accessCounter", PageContext.APPLICATION_SCOPE); if (accessCounter == null) { accessCounter = new myUtils.CounterBean(); _jspx_page_context.setAttribute("accessCounter", accessCounter, PageContext.APPLICATION_SCOPE); } Part of the Generated Servlet Similar effect to getServletContext().setAttribute() Similar effect to getServletContext().getAttribute() The instance is created and kept in the application’s scope as required. Note however that accessing this instance is out of the synchronized scope cs236607

11 11 Example 2: Session Data In the following example, we use a Bean in order to keep a user's details throughout the session cs236607

12 12 package myUtils; public class UserInfoBean { private String firstName; private String lastName; public UserInfoBean() { firstName = lastName = null;} public String getFirstName() {return firstName;} public String getLastName() {return lastName;} public void setFirstName(String string) {firstName = string;} public void setLastName(String string) {lastName = string;} } UserInfoBean.java cs236607

13 13 Information Form Fill in your details: Your First Name: Your Last Name: infoForm.html cs236607

14 14 Page A Hello, Have a nice session! User Info B infoA.jsp Match all the request parameters to corresponding properties. You could match parameters to properties explicitly using property=… param=… You can also set properties with explicit values using property=… value=… The String values are converted to the right bean’s property types.. cs236607

15 15 Page B Hello, Have a nice session! User Info A infoB.jsp A very similar JSP This time the request has no parameters so no bean properties are set cs236607

16 16 Advantages of Java Beans Easy and standard management of data Automatic management of bean sharing and lots more Good programming style Allow standard but not direct access to members You can add code to the setters and getters (e.g. constraint checks) without changing the client code You can change the internal representation of the data without changing the client code Increase of separation between business logic (written by programmers) and HTML (written by GUI artists) cs236607

17 17 cs236607

18 18 Custom JSP Tags JSP code may use custom tags – tags that are defined and implemented by the programmer The programmer defines how each of the custom tags is translated into Java code There are two methods to define custom tags: Tag libraries - used in old versions of JSP Tag files - much simpler, introduced in JSP 2.0 cs236607

19 19 Tag Libraries A tag library consists of: Tag handlers - Java classes that define how each of the new tags is translated into Java code A TLD (Tag Library Descriptor) file, which is an XML file that defines the structure and the implementing class of each tag (see a tutorial at http://java.sun.com/products/jsp/tutorial/TagLibrariesTOC.html ) http://java.sun.com/products/jsp/tutorial/TagLibrariesTOC.html cs236607

20 20 package my; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; public class DateTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().getOut().print(new java.util.Date()); } DateTag.java A Simple TagLib Example Using the JSP-context, You can also acquire other implicit objects by calling getSession(), getRequest() etc… The class file is placed in webapps/myapp/WEB-INF/classes/my/ The java file is placed in webapps/myapp/WEB-INF/src/my/ Base class of tags which don’t handle the body or the attributes We must use a package (not necessarily named like your application) since this is a helper class which is imported form the JSP’s generated Servlet that is placed within a named package Goal: cs236607

21 21 1.0 2.0 date my.DateTag empty my-taglib.tld Hello. The time is: taglibuse.jsp As you can see from the path, the taglib is specifically defined to the current application context. The prefix for this tag must appear before the tag itself (looks like a namespace). The Prefix can’t be empty The path could be a URL. If you choose to use a local path, it must begin with /WEB-INF/tags/ Set this value that indicates your tag library version Name of the tag Tag’s class file in /myapp/WEB-INF/classes/my/ This defined tag contains no body You can add here more tags… cs236607

22 22 Taglib with Attributes package my; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import java.io.IOException; public class DateTag2 extends TagSupport { private boolean isLongFormat = false; public void setIsLongFormat(boolean b) { isLongFormat = b; } public boolean getIsLongFormat() { return isLongFormat; { DateTag2.java Base class of tags which do handle attributes In our example the attribute is defined as not required so it must have a default value Attribute’s setter method Attribute’s getter method This member’s name should be identical to the attribute’s. The setter/getter methods should be named after the attribute (i.e. “get” + capital ( )) cs236607

23 23 public int doStartTag() throws JspException { try { if (isLongFormat) { pageContext.getOut().print(new java.util.Date().getTime()); } else { pageContext.getOut().print(new java.util.Date()); } } catch (Exception e) { throw new JspException("DateTag: " + e.getMessage()); } return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } Invoked when the generated Servlet starts processing the “start tag” Prints the date according to the isLongFormat attribute Signals the generated Servlet there’s no body within the tag to process Invoked when the generated Servlet starts processing the “end tag” Signals the generated Servlet to continue executing the generated Servlet code cs236607

24 24 date2 my.DateTag2 empty isLongFormat false my-taglib2.tld Hello. The time is: Milliseconds since the epoch : taglibuse2.jsp Same as before, only with different names for the tagclass You can put several blocks one after another The attribute is “not required” so you have to define a default value in DateTag2.java Uses default attribute value Uses a given attribute value cs236607

25 25 How does it work? taglibuse2.jsp taglibuse2_jsp.java JspContext DateTag2 setIsLongFormat() doStartTag() doEndTag() JSP to Java Servlet translation Create the JspContext When the translation engine first encounters it creates a new instance of DateTag2 (so we needn’t worry about concurrency issues) and passes it the JspContext reference The attribute value is set using the setter method. The translator actually translated the attribute string value as it appears in the JSP source, to a boolean value as the Java tag class expects it… “Start tag” is reached “End tag” is reached cs236607

26 26 Tag Files JSP 2.0 provides an extremely simplified way of defining tags The motivation: JSP programmers prefer not to write cumbersome code or class files The idea: for each custom tag, write a tag file tagName.tag that implements the tag translation using JSP code This way, the programmer can avoid creating tag handlers and TLD files cs236607

27 27 The Simplified Example Hello. The time is: date.tag taguse.jsp In this new mechanism we use tagdir instead of uri we used in the old taglib implementation cs236607

28 28 <%!private String createDate(String isLong) { if ((isLong == null) || (isLong.equals("false"))) { return new java.util.Date().toString();} else { return new Long(new java.util.Date().getTime()).toString();} } %> The Attributes Example Hello. The time is: Milliseconds since the epoch : date3.tag taguse3.jsp Private method declaration Default and isLongFormat=“false” case Calls the private method isLongFormat=“true” case Default case isLongFormat=“true” A new directive The isLongFormat parameter is identified as the isLongFormat attribute because we used the attribute directive cs236607

29 29 Other Capabilities of Custom Tags Attributes You can add validation mechanism for the attributes values Tag Body Tag translation may choose to ignore, include or change the tag body cs236607

30 30 cs236607

31 31 JSP Expression Language JSP expression language is a comfortable tool to access useful objects in JSP This language provides shortcuts in a somewhat JavaScript-like syntax An expression in EL is written as ${expr} For example: Hi, ${user}. Welcome Note that the EL expression does not violate the XML syntax as opposed to cs236607

32 32 EL Variables JSP EL does not recognize JSP's implicit objects, but rather has its own set Each of these objects maps names to values param, paramValues, header,headerValues, cookie, initParam, pageScope, requestScope, sessionScope, applicationScope For example, use the param[“x”] or param.x to get the value of the parameter x Map a parameter name to a single value or to multiple values Map a header name to a single value or to multiple values Maps a cookie name to a single value Maps a context initialization parameter name to a single value cs236607

33 33 EL Variables (cont) A variable that is not an EL implicit object is looked up at the page, request, session (if valid) and application scopes That is, x is evaluated as the first non-null element obtained by executing pageContext.getAttribute("x"), request.getAttribute("x"), etc. Might be confusing. Make sure you know what you’re accessing! cs236607

34 34 Object Properties In JSP EL, Property prop of Object o is referred to as o[prop] Property prop of Object o is evaluated as follows: If o is a Map object, then o.get(prop) is returned If o is a List or an array, then prop is converted into an integer and o.get(prop) or o[prop] is returned Otherwise, treat o “as a bean”, that is: convert p to a string, and return the corresponding getter of o, that is o.getProp() The term o.p is equivalent to o["p"] cs236607

35 35 An Example <% response.addCookie(new Cookie(“nameof",“homer")); session.setAttribute(“homepage", new java.net.URL("http://www.simpsons.com")); String[] strs = {"str1","str2"}; session.setAttribute("arr", strs); %> JSP Expressions Write the parameter x: elcall.jsp cs236607

36 36 EL Examples Expression-Language Examples Parameter x : ${param["x"]} Cookie name : ${cookie.nameof.value} Header Connection : ${header.Connection} Path of session attr. homepage : ${sessionScope.homepage.path} Element arr[${param.x}] : ${arr[param.x]} el.jsp The default value is TRUE cookie[“nameof”].getValue() header [“Connection”] sessionScope[“homepage”]. getPath(). You can omit the sessionScope ${…} means evaluate the expression inside the {} Only the ${param.x} is evaluated sessionScope[“arr”][param[“x”] cs236607

37 37 cs236607

38 38 Simple XML Production "> JSP directive which sets the MIME-type of the result… Ordinary XML declarations Link with XSL stylesheet cs236607

39 39 Generated XML red blue green cs236607

40 40 JSPX files are JSP files that have the extension jspx and have XML syntax JSPX files are also referred to as JSP documents Special JSP tags are used to replace non-XML JSP symbols ( <%, <%@, etc.) (Tags and EL can help too!) The default content type of JSPX is text/xml (and not text/html ) You can also keep the.jsp suffix and tell the container that a JSP file acts as a JSPX file (and therefore its output is of XML type etc.) JSPX Files (JSP Documents) cs236607

41 41 Advantages/Disadvantages of JSPX Since JSPX documents conform to a legal XML structure you can: Check if the document is well formed XML Validate the document against a DTD Nest and scope namespaces within the document Use all kinds of XML tools (e.g. editors) The main disadvantage is JSPX documents they can grow very long and very (very) cumbersome Much ado about nothing? Sometimes the above “advantages” simple aren’t needed or are of little help cs236607

42 42 Expression Code Declaration <jsp:directive.type Attribute="value"/> An empty element cs236607

43 43 Problems on the Way to a Legal XML The XML declaration ( ) and the DOCTYPE definition are now those of the JSPX file. How do we include the declaration+dtd of the original XML document in the result XML? Solution: use the tag to explicitly require DOCTYPE and XML declarations (next slide…) How do we generate dynamic attribute values and still keep the document well formed? Solution 1: use for explicit element construction Solution 2: use an EL expression The following line is an illegal XML opening tag: i “> cs236607

44 44 <jsp:output doctype-root-element="colors" doctype-system="colors.dtd" /> static String[] colors = {"red","blue","green"}; i colors[i] } Namespace of basic JSP elements and Tag libraries.. Root element + DTD of the resulting XML Do not omit the XML declaration of the result The result is equivalent to the original line: "> CDATA is used because of <. Altenatively: use < cs236607

45 45 A Few More Problems on the Way Where can we add an XSL declaration? It should be: outside the root element (colors), but also after jsp:output which must be defined after jsp namespace declaration within the colors element… When using the include directive, the JSP might become illegal XML with more than a single root A solution: Use the element as the document root Does this solve all the problems which might arise when using the include directive? cs236607

46 46 ]]> static String[] colors = {"red","blue","green"}; i colors[i] } Now we can add the XSL We use CDATA because of the etc Still problematic: Which DTD should we use? the DTD should enable every JSP element within every other element… cs236607

47 Links JSP Tutorial: http://courses.coreservlets.com/Course- Materials/csajsp2.htmlhttp://courses.coreservlets.com/Course- Materials/csajsp2.html Advanced Tutorials: http://courses.coreservlets.com/Course- Materials/msajsp.html http://courses.coreservlets.com/Course- Materials/msajsp.html JSP API: http://tomcat.apache.org/tomcat-5.5- doc/jspapi/http://tomcat.apache.org/tomcat-5.5- doc/jspapi/ JSP Syntax Reference: http://java.sun.com/products/jsp/syntax/2.0/syntaxref 20.html http://java.sun.com/products/jsp/syntax/2.0/syntaxref 20.html cs23660747


Download ppt "1 (Server-Side Programming using Java Server Pages) cs236607."

Similar presentations


Ads by Google