如果在servlet中我们在request放入了很多的属性,然后需要在页面上展示这些属性,我们该怎么样做呢? 例如:
Person person = new Person(),person2 = new Person(); Dog dog = new Dog(); List<Person> personList = new ArrayList<Person>(); Person[] personArray = new Person[2]; person.setUsername("setOnservelt"); person.setPassword("123123"); person2.setUsername("setOnservelt"); person2.setPassword("123123"); dog.setDogName("大黄"); person2.setDog(dog); personList.add(person); personList.add(person2); personArray[0] = person; personArray[1] = person2; Map<String, Person> personMap = new HashMap<String, Person>(); personMap.put("person", person); personMap.put("person2", person2); Person personSession = new Person(); personSession.setUsername("inSession"); request.getSession().setAttribute("person", personSession); request.setAttribute("userName", "fromRequestAttribute"); request.setAttribute("person",person); request.setAttribute("person2",person2); request.setAttribute("personList", personList); request.setAttribute("personArray", personArray); request.setAttribute("personMap", personMap); request.setAttribute("com.prince", "wang"); request.getRequestDispatcher("/MyJsp.jsp").forward(request, response);
如果使用脚本的话,页面中的代码应该是:
<%Person person = (Person)request.getAttribute("person"); Person person2 = (Person)request.getAttribute("person2"); Person person3 = new Person(); person3.setUsername("setOnPage"); person3.setPassword(request.getParameter("password")); List personList = (List)request.getAttribute("personList"); Person[] personArray = (Person[])request.getAttribute("personArray"); Map personMap = (Map)request.getAttribute("personMap"); %> userName属性的值<%= request.getAttribute("userName")%><br> person的名称<%=person.getUsername() %><br> person2中狗的名字<%=person2.getDog().getDogName() %><br> personList中的第一个<br> <%=((Person)personList.get(0)).getUsername() %><br> personArray中的第一个<br> <%=personArray[0].getUsername() %><br> new一个新的person名称为<%=person3.getUsername() + ":" + person3.getPassword()%><br> map中person key对应的用户名为:<%=((Person)personMap.get("person")).getUsername() %>
action tag
为了代码的可读性和分工,我们想要去掉其中的脚本,第一个办法是使用action tag。 页面中的代码可以改变为:
<jsp:useBean id="person" type="com.prince.Person" scope="request"/> <jsp:getProperty name="person" property="username"/><br> <jsp:useBean id="person3" type="com.prince.Person" class="com.prince.Person" scope="request"> <jsp:setProperty name="person3" property="username" value="setOnPage"/> <jsp:setProperty name="person3" property="password" param="password"/> </jsp:useBean> <jsp:getProperty name="person3" property="username" />+<jsp:getProperty name="person3" property="password" />
userBean标签中,type表示一个类型,如果没有class属性的时候表示在指定域中查找同名的顺序,相当于执行Person person = (Person)request.getAttribute("person");如果有class属性,其表示要实例化的类,其中type可以使接口或者说是抽象类,如果找不到会新建一个对应的对象setProperty标签中,能够给bean中的属性设置值,value就表示一个具体的值,而param表示在request.getParameter()中获取这个值,另外还可以写成property="*",会自动在request.getParameter中查找所有的跟属性名相同的参数进行赋值。使用action只能够操作javabean,并且还不能操作复杂的对象,因此我们还需要更加强大的功能,比如EL表达式。 EL表达式
userName属性的值${userName }<br> person的名称${person.username }或者是${person["username"] }<br> person2中狗的名字${person2.dog.dogName }<br> personList中的第一个<br> ${personList[0].username }<br> personArray中的第一个<br> ${personArray[0].username }或者是${personArray["0"].username }<br> personMap中的personKey对应的用户名 ${personMap["person"].username }或者是${personMap.person.username } map中的特殊用法:${personMap[userName].username } []的嵌套使用:${personMap[personArray[0].username].username } 属性名中存在.的情况:${requestScope["com.prince"] } ${0< 1}
这里可以看出,主要有两种形式a.b,a[b].能够适用于使用get方法得到属性值的时候。或者是从map中得到bkey所对应的值[]则能够用更多的适应性,a为bean的时候b为属性(需要加双引号),a为map的时候b为key,a为list或者是数组的时候b为下标,并且可以使字符串表示的下标如果使用[]取得map的值的时候,没有给key值加""会把其作为一个属性,然后在域中查找属性的值来作为Key。另外[]符号还能够嵌套使用,跟上面的意思差不多,[]中的值都会先试着转化成从域中取值。如果属性名中有.则不能够使用.符号来获取值了,只能使用[]的方式另外EL表达式中还能够使用+,-,eq.....等等运算符。EL能够获取request,session等等域中的值,实际上范围比这个要大,能够取值的范围为: 其中包括了一些内置对象和属性:
属性为page,request,session,application四个域中的属性。内置对象是EL自己实现的包含了request中对应的对象值的一些map。包括了:pageScope,requestScope,sessionScope,applicationScope,param,paramValues,header,headerValues,cookie,initParam。还有最后一个pageContext,与JSP中的pageContext相同,是一个javabeanEL语言除了使用属性和bean以外还能够调用方法,要实现这个功能,我们需要按照如下操作: 定义一个类,包含一个返回值不为null的static类型的方法。
然后编写tld文件,放到WEB-INF目录下。内容格式如下:
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="" xmlns:xsi="1" xsi:schemaLocation="" version="2.0"> <tlib-version>1.2</tlib-version> <uri>myFunctions</uri> <function> <name>addOne</name> <function-class>com.prince.tag.AddOne</function-class> <function-signature>java.lang.String addOne(java.lang.String)</function-signature> </function> </taglib>
uri是在页面也用时所使用的索引。name同样为页面调用时需要的内容。需要指定类的路径和方法名,方法中参数和返回值需要使用类的全路径。然后放到WEB-INF目录下。在页面使用的时候 <%@ taglib prefix="myF" uri="myFunctions" %> ${myF:addOne("aaa") } 这样就能够调用自定义的方法了。
action tag除了操作属性以外还有一些其他的功能。 <jsp:include file=""> 同样是引入页面但是与<@include >是不相同的。在讲指定的时候已经讨论过一次了,这里再次进行记录。
指令的方式与把引入的页面直接写入到本页面的效果是相同的。使用<jsp:include >的时候会把请求发送到对应的JSP,然后得到返回结果之后继续进行操作。指令是在解释成servlet的时候进行的,而<jsp:include>是在运行的时候执行的,会编译成两个不同的servlet。因为<jsp:include>中的文件只能为jsp页面,它还能提供更多的功能,比如在<jsp:include 标签中使用<jsp:param name="name" value="">设置参数时,能够在include的jsp文件中,使用${param.name}获取到参数的值。<jsp:forword page="/MyJsp.jsp"> 会被翻译为request.getRequestDispatcher("/MyJsp.jsp").forward(request, response); forword执行的时候,会先把缓存进行清空,在使用forword前是不能够使用out.flush的,否则会出现错误。