Building JSP Pages Using Expression Language (EL)Agenda:
Introduction
<%= request.getparameter("user") %> // is equivalent code ${param.user}To print the value of session scoped attribute "x" in jsp ? <%= session.getAttribute("x") %> // is equivalent code ${sessionScope.x}To use any variable x in EL compulsory it should be an attribute of some scope ? ${x}It prints the value of x attribute present in any scope(pageScope, requestScope, sessionScope, applicationScope) and if there is no such attribute then it prints BlankSpace but not null Ex 1: <%! int x=10; %> The value of x is : ${x} output : The value of x is : //BlankSpaceEx 2: <%@page isELIgnored="false" %> <%! int x=10; %> <% pageContext.setAttribute("x",x); %> The value of x is : ${x} output : The value of x is : 10 EL Implicit Objects (11) :EL contains 11 implicit objectsThe power of EL is just because of these implicit objects only. The following is the list of EL implicit objects
pageScope, requestScope, sessionScope, applicationScope
${sessionScope.x}Ex : To print the value of request scoped attribute "x" ${requestScope.x}Ex : ${sessionScope.x}It prints the value of session scoped attribute "x" , in sessionScope if there is no such attribute then we will get BlankSpace Ex : ${x}jsp engine first checks in pageScope for attribute "x" if it is available then it prints the value, then it's not available it will check in requestScope followed by sessionScope and applicationScope, it simply act as pageContext.findAttribute(x); scopes.jsp Note : ${leftVariable.rightVariable}
${person.empId} // here person attribute stored in some scopein Servlet code : package foo; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { foo.Person p=new foo.Person(); p.setName("Akshay"); foo.Dog d=new Dog(); d.setName("puppy"); p.setDog(d); request.setAttribute("person", p); request.setAttribute("arun", "SCWCD"); RequestDispatcher rd=request.getRequestDispatcher("demo.jsp"); rd.forward(request, response); } }in Jsp code : ${requestScope.arun} ${requestScope.person.dog.name} <%-- ${person.dog.name} --%>Note :
param & paramValues :We can use these implicit objects to retrieve form parameter values
${param.x} // it prints the value of form parameter x, if the specified parameter is not available then we will get BlankSpace If parameter associated with multiple values then we will get first value. param : Map
paramValues : Map
${paramValues.uname}
Note : EL handles null and ArrayIndexOutOfBoundException very nicely and prints BlankSpace. form.html<h3>Enter Your Details :</h3> <form action="formParam.jsp" method="post"> Enter Name :<input type="text" name="name" > <br> Enter Mail :<input type="text" name="mail" > <br> Enter Age:<input type="text" name="age" > <br> Enter Food 1 :<input type="text" name="food" > <br> Enter Food 2 :<input type="text" name="food" > <br> <input type="submit" value="Submit"> <br> </form>formParam.jsp <%@page isELIgnored="false"%> <h3>Form Parameter Values :</h3> Name : ${param.name} <br/> Mail : ${param.mail} <br/> Age : ${param.age} <br/> Food : ${param.food} <br/> Sex : ${param.sex} <br/> ParamValues.name : ${paramValues.name} <br/> ParamValues.name[0] : ${paramValues.name[0]} <br/> ParamValues.name[1] : ${paramValues.name[1]} <br/> ParamValues.food : ${paramValues.food} <br/> ParamValues.food[0] : ${paramValues.food[0]} <br/> ParamValues.food[1] : ${paramValues.food[1]} <br/> ParamValues.food[100] : ${paramValues.food[100]} <br/> header & headerValues :These are exactly similar to param and paramValues except that these are retrieving request headers.
If the specified request header is not available you will get BlankSpace as a output.
<%@page isELIgnored="false"%> <h3>Header Information :</h3> Accept : ${header.accept} <br/> Accept Values [0] : ${headerValues.accept[0]} <br/> Accept Values [1] : ${headerValues.accept[1]} <br/> Host : ${header.host} <br/> Host [0] : ${headerValues.host[0]} <br/> Some x is : ${header.x} <br/> Accept Language : ${header['accept-language']} <br/> initParam :By using initParam implicit object we can access ServletContext parameters but not servlet initialization parameters.
${initParam.user} // it prints the value associated associated with context parameter user. If the specified parameter is not available then we will get BlankSpace.${initParam.x} //BlankSpaceinitParam.jsp <%@page isELIgnored="false" %> <h3>Init Parameters are :</h3> Init Param Name : ${initParam.name} <br/> Init Param Mail : ${initParam.mail} <br/> Init Param Age : ${initParam.age} <br/> The X value is : ${initParam.x} <br/> The Y value is : ${initParam.y} <br/>web.xml <display-name>EL Implicit Objects</display-name> <context-param> <param-name>name</param-name> <param-value>Ashok</param-value> </context-param> <context-param> <param-name>mail</param-name> <param-value>admin@jobs4times.com</param-value> </context-param> <context-param> <param-name>age</param-name> <param-value>2022</param-value> </context-param> <context-param> <param-name>x</param-name> <param-value>12345</param-value> </context-param> <context-param> <param-name>y</param-name> <param-value>54321</param-value> </context-param>To print the value of "userName" cookie ? <% Cookie[] c=request.getCookies(); for(int i=0;i<c.length;i++){ if(c[i].getName().equals("userName")){ out.println(c[i].getValue()); } } %> (OR) <%@page isELIgnored="false" %> Cookie value is : ${cookie.userName.value} <br/> cookie :By using cookie implicit object we can retrieve cookies associated with the request
cookie : Map
cookie.jsp <%@page isELIgnored="false" %> <% Cookie c1=new Cookie("c1","SCJP"); Cookie c2=new Cookie("c2","SCWCD"); response.addCookie(c1); response.addCookie(c2); %> <h3>The Cookie Id is :</h3> ${cookie.JSESSIONID.name} <br/> ${cookie.JSESSIONID.value} <br/> ${cookie.JSESSIONID} <br/> Cookie c1 is : ${cookie.c1} <br/> Cookie c1 name is : ${cookie.c1.name} <br/> Cookie c1 value is : ${cookie.c1.value} <br/> Cookie c2 name is : ${cookie.c2.name} <br/> Cookie c2 value is : ${cookie.c2.value} <br/> pageContext :
<%@page isELIgnored="false" %> <% session.setAttribute("course","SCJP"); %> ${pageContext.request.method} <br/> ${pageContext.session.id} <br/> ${pageContext.request.Cookies[0]} <br/> ${course} <br/> ${request.method} <br/> ${session.id} <br/> handling errors :
<%@page isELIgnored="false" %> <%@page errorPage="error.jsp" %> <% out.println(10/0); %>error.jsp <%@page isErrorPage="false"%> The Raised Exception is : ${pageContext.exception.message} <br/> The Status code is : ${pageContext.errorData.statusCode} <br/> The Request URI is : ${pageContext.errorData.requestURI} <br/> The Servlet Name is : ${pageContext.errorData.servletName} <br/>All EL implicit objects are map object type except pageContext. EL Operators :EL contains it's own specific operators the following is list of all possible operators
property access operator :${leftVariable.rightVariable} // map -----key // bean ----property // left attribute stored in some scope
${person.name} // name must starts with letter or underscore or $ // after the first character we can include the numbers // can't be a java keyword ${initParam.age} //map ---- key ${person.dog} //bean ---- property ${person.1} //javax.el.ELExpeption:ErrorParsing collection access operator :${leftVariable.rightVariable} // Map -----key //quotes are mandatory // Bean ----property //quotes are mandatory // List ---- index //quotes are optional // Array ---- index //quotes are optionalWhen we use the . operator the thing on the left can be only a Map or Bean and thing on the right must follow java naming rules for the identifies but with collection access operator, the thing on the left can also be a List or Array that also meaning the thing on the right can be a number or any thing that resolves to a number or an identifier that doesn't java naming rules. Ex : ${musicMap[MusicTypes[0]]} (OR) ${musicMap[MusicTypes["0"]]}But you can't ${musicMap[MusicTypes["zero"]]} // It can't convert into int Map Example :${initParam['mail']} note : If we are not using code symbol then it is treated as attribute if the specified attribute is not available then we will get blank space. Bean in servlet code :package foo; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { foo.Person p=new foo.Person(); p.setName("Akshay"); foo.Dog d=new Dog(); d.setName("puppy"); p.setDog(d); request.setAttribute("person", p); RequestDispatcher rd=request.getRequestDispatcher("view.jsp"); rd.forward(request, response); } }view.jsp <%@ page isELIgnored="false"%> ${person['dog']['name']} ${person[dog][name]} //blankspace List Example :Servlet code :package foo; import java.io.IOException; import java.util.ArrayList; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { java.util.ArrayList list=new ArrayList(); list.add("Ashok"); list.add("Arun"); list.add("Akshay"); list.add("Saicharan"); request.setAttribute("x", list); request.setAttribute("index", "2"); RequestDispatcher rd=request.getRequestDispatcher("view.jsp"); rd.forward(request, response); } }view.jsp <%@ page isELIgnored="false"%> The first name is : ${x[0]} <br/> The second name is : ${x[1]} <br/> List Names are : ${x} Array Example :servlet code :package foo; import java.io.IOException; import java.util.HashMap; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { java.util.Map musicMap=new HashMap(); musicMap.put("melody", "song1"); musicMap.put("DJ", "song2"); musicMap.put("fastBeat", "song3"); musicMap.put("slowBeat", "song4"); request.setAttribute("musicMap", musicMap); String[] musicTypes={"melody","DJ","fastBeat","slowBeat"}; request.setAttribute("musicType", musicTypes); RequestDispatcher rd=request.getRequestDispatcher("view.jsp"); rd.forward(request, response); } }view.jsp <%@ page isELIgnored="false"%> ${ musicMap[musicType[1]] } ${ musicMap["DJ"] }note : first inner most brackets will be evaluated. Ex 2 : <%@ page isELIgnored="false"%> <% String[] s={"A","B","C","D"}; pageContext.setAttribute("s",s); %> ${s[0]} <br/> ${s[1]} <br/> ${s[100]} <br/> Example : Person.javapackage foo; public class Person { private String name; private Dog dog; public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } }Dog.java package foo; public class Dog { private String name; private Toy[] toys; public String getName() { return name; } public void setName(String name) { this.name = name; } public Toy[] getToys() { return toys; } public void setToys(Toy[] toys) { this.toys = toys; } }Toy.java package foo; public class Toy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }In Servlet code : package foo; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { foo.Person p=new Person(); p.setName("SAI"); foo.Dog d=new Dog(); d.setName("puppy"); foo.Toy t=new Toy(); t.setName("bear1"); foo.Toy t1=new Toy(); t1.setName("bear2"); foo.Toy t2=new Toy(); t2.setName("bear3"); p.setDog(d); d.setToys(new foo.Toy[]{t,t1,t2}); request.setAttribute("person", p); RequestDispatcher rd=request.getRequestDispatcher("view.jsp"); rd.forward(request, response); } }view.jsp <%@ page isELIgnored="false"%> ${person.name} 's dog ${person.dog.name} , toys are ${person.dog.toys[0].name} , ${person.dog.toys[1].name} , and ${person.dog.toys[2].name}SAI 's dog puppy , toys are bear1 , bear2 , and bear3 Note : Where ever property access operator is required there we can use collection access operator but where ever collection access operator is required may not be use property access operator. Arithmetic operators : (+, -, /, *, %)EL doesn't support operator overloading and + operator always meant for Arithmetic addition but not for String Concatenation. + operator :<%@ page isELIgnored="false"%> 2+3= ${2+3} "2"+3= ${"2"+3} "2"+'3'= ${"2"+'3'} abc+'3'= ${abc+'3'} "abc"+'3'= ${"abc"+'3'} // java.lang.NullPointerException:For input string: "abc" ""+3= ${""+'3'} // java.lang.NullPointerException:For input string: "" null+'3'= ${null+'3'}- operator : <%@ page isELIgnored="false"%> 2-3= ${2-3} "2"-3= ${"2"-3} "2"-'3'= ${"2"-'3'} abc-'3'= ${abc-'3'} "abc"-'3'= ${"abc"-'3'} // java.lang.NullPointerException:For input string: "abc" ""-3= ${""-'3'} // java.lang.NullPointerException:For input string: " " null-'3'= ${null-'3'}* operator, / operator : all rules are exactly similar to + operator except that division operator always follows floating point Arithmetic. syntax : ${a/b} or ${a div b} Ex : ${10/2} = 5.0 ${10/0} = Infinity ${0/0} = NaN % operator : All rules are exactly similar to + operator here both integral and floating Arithmetics are possible.syntax : ${a%b} or ${a mod b} Ex : ${10%3} // 1 ${10%0} //java.lang.ArithmeticException: / by zero ${10.0%0} //NaN ${""/'3'} //java.lang.NumberFormatException: empty StringNote : In Arithmetic operator null evaluates Zero, the presidency of Arithmetic operators *, /, %, +, -. In side Servlet code : package foo; import java.io.IOException; import java.util.ArrayList; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { java.util.ArrayList numList=new ArrayList(); numList.add("1"); numList.add("2"); numList.add("3"); numList.add("4"); request.setAttribute("numbers", numList); String[] s={"melody","DJ","fast","slow"}; request.setAttribute("musicList", s); RequestDispatcher rd=request.getRequestDispatcher("view.jsp"); rd.forward(request, response); } }view.jsp <%@ page isELIgnored="false"%> ${musicList[numbers[0]]} <br/> ${musicList[numbers[1]+2]} <br/> ${musicList[numbers[numbers[0]]+1]} <br/> ${musicList[numbers["2"]]} <br/> Relational operators :
<%@ page isELIgnored="false"%> Relational operators : ${3 < 4} //true ${3 > 4} //false ${3 >= 4} //false ${3 <= 4} //true ${"abc" == "abc"} //true ${2!=1} //true ${sai == sai} //true ${3 < sai} //false ${String < String} //falseIn Relational Operators , the unknown variable evaluates as a false. Logical operators :
<%@ page isELIgnored="false"%> ${true and true} //true ${false || false} //false ${!true} //false ${ashok && ashok} //false ${not ashok} //truenote : In logical operators unknown variable evaluates false. conditional operator : (?:)<%@ page isELIgnored="false"%> ${ (3 < 4)?"yes":"no" } //yes ${ (true == false)?"Right":"wrong" } //wrong ${ (2 < 3)?"correct":"wrong" } //correctIn the case of conditional operator unknown variable treats a variable stored in some scope. empty operator :syntax :${empty obj}returns true iff object doesn't exists/ an empty array/ object is an empty collection/ object as a empty String in all other cases it returns false. Ex : <%@ page isELIgnored="false"%> <%@page import="java.util.ArrayList"%> <%ArrayList l=new ArrayList(); %> ${empty test} //true ${empty "durga"} //false ${empty null} //true ${empty " "} //false ${empty l} //trueIn Servlet code : package foo; import java.io.IOException; import java.util.ArrayList; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ELServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int num=2; request.setAttribute("num", num); Integer i=new Integer(3); request.setAttribute("integer", i); java.util.ArrayList list=new ArrayList(); list.add("true"); list.add("false"); list.add("5"); list.add("6"); request.setAttribute("list", list); RequestDispatcher rd=request.getRequestDispatcher("jspDemo.jsp"); rd.forward(request, response); } }view.jsp <%@ page isELIgnored="false"%> <jsp:useBean id="myDog" class="foo.Dog"> <jsp:getProperty name="myDog" property="name" /> </jsp:useBean> ${myDog.name and true} //false ${requestScope["integer"] ne 4 and 6 le num or false} //false //EL executes left to right EL operator presidency :
EL reserved words :
EL Vs null :
EL Functions :
Writing a java class :
Writing a TLD file : (tag library descriptor file)TLD file is a xml file which provides mapping between java class (where functionality is available) and jsp (where functionality is required)We can configure EL function by using function tag in TLD file , it contains the following 4 steps :
Writing a taglib directive :We have to declare taglib directive in the jsp to provide location of the TLD file<%@taglib prefix="mime" uri="www.jobs4times.com" %> Writing EL function call :${mime.getBalance(435678)} demo.jsp <%@ page isELIgnored="false"%> <%@taglib prefix="mime" uri="DiceFunctions"%> Your 3 - Digit Lucky Number : ${mime:rollIt()} <br/> ${mime:rollIt()} <br/> ${mime:rollIt()} <br/>DiceRoller.java package foo; public class DiceRoller { public DiceRoller() { System.out.println("DiceRoller"); } public static int rollDice(){ return (int) (Math.random() *6+1); } }myTld.tld <?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" > <tlib-version>1.0</tlib-version> <uri>DiceFunctions</uri> <functions> <name>rollIt</name> <function-class>foo.DiceRoller</function-class> <function-signature>int rollDice()</function-signature> </functions> </taglib> Work Flow : (in EL function application)![]()
Write a program to invoke Math class sqrt() as a EL function call with name m1 public static double sqrt(double) //method signatureindex.jsp <%@ page isELIgnored="false"%> <%@taglib prefix="mime" uri="MathFunctions"%> The squre root of 4 is : ${mime.m1(4)} The squre root of 5 is : ${mime.m1(5)}mathFunction.tld <taglib version="2.1" > <tlib-version>1.0</tlib-version> <uri>MathFunctions</uri> <functions> <name>m1</name> <function-class>java.lang.Math</function-class> <function-signature>double sqrt(double)</function-signature> </functions> </taglib> |