把脚本移出JSP

如果在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的,否则会出现错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值