如果在servlet中我们在request放入了很多的属性,然后需要在页面上展示这些属性,我们该怎么样做呢?
例如:
如果使用脚本的话,页面中的代码应该是:
action tag
为了代码的可读性和分工,我们想要去掉其中的脚本,第一个办法是使用action tag。
页面中的代码可以改变为:
- userBean标签中,type表示一个类型,如果没有class属性的时候表示在指定域中查找同名的顺序,相当于执行Person person = (Person)request.getAttribute("person");
- 如果有class属性,其表示要实例化的类,其中type可以使接口或者说是抽象类,如果找不到会新建一个对应的对象
- setProperty标签中,能够给bean中的属性设置值,value就表示一个具体的值,而param表示在request.getParameter()中获取这个值,
- 另外还可以写成property="*",会自动在request.getParameter中查找所有的跟属性名相同的参数进行赋值。
使用action只能够操作javabean,并且还不能操作复杂的对象,因此我们还需要更加强大的功能,比如EL表达式。
EL表达式
- 这里可以看出,主要有两种形式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相同,是一个javabean
EL语言除了使用属性和bean以外还能够调用方法,要实现这个功能,我们需要按照如下操作:
定义一个类,包含一个返回值不为null的static类型的方法。
然后编写tld文件,放到WEB-INF目录下。内容格式如下:
- 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的,否则会出现错误。