3.6 动作
第三种句法元素是动作(Action),它们被编译成执行某个操作的Java代码,例如访问某个Java对象,或者调用某个方法。本节讨论必须能被所有JSP容器支持的标准动作。除标准动作之外,还可以创建定制的标签,用来执行某些操作。定制标签将在第6章中讨论。
下面列举部分标准动作。doBody和invoke这两个标准动作将在第7章中讨论。
3.6.1 useBean
这个动作将创建一个与某个Java对象相关的脚本变量。它是将表现逻辑与业务逻辑分隔开来的最容易的方法之一。但是有了像定制标签和Expression Language这类技术之后,现在已经很少使用useBean了。
举个例子。代码清单3-9中的useBeanTest.jsp页面创建了一个java.util.Date实例,并将它与脚本变量today关联起来,之后将它用在一个表达式中。
运行这个页面之后,将会在浏览器中输出当前的日期和时间。
3.6.2 setProperty和getProperty
setProperty 动作是在一个Java对象中保存一个属性,getProperty则是获取一个Java对象的属性。举个例子,代码清单3-11中的getSetPropertyTest.jsp页面保存和输出Employee类实例的firstName属性,具体如代码清单3-10所示。
3.6.3 include
include动作用于动态地包含另一个资源,它可以包含另一个JSP页面、一个Servlet或者一个静态的HTML页面。例如,代码清单3-12中的jspIncludeTest.jsp页面就是利用include 动作来包含menu.jsp页面的。
理解include指令和include 动作之间的区别是很重要的。使用include指令时,这种包含是发生在页面转换的时候,例如JSP容器将页面转换成一个生成的Servlet的时候。使用include 动作时,这种包含则是发生在请求的时候。因此,可以利用include 动作传递参数,而不是利用include指令。
第二个区别在于,使用include指令时,被包含资源的文件扩展名并不重要。而使用include 动作时,文件扩展名则必须为jsp,以便它能够作为一个JSP页面进行处理。例如,在include 动作中用jspf作为扩展名时,将会使得这个JSP segment被当作静态文件进行处理。
3.6.4 forward
forward 动作是将当前页面跳转到另一个不同的资源。例如,下面的forward 动作就是将当前页面跳转到login.jsp页面。
3.6.5 错误处理
在JSP中错误处理支持得很好。你可以利用try语句处理Java代码,也可以指定一个页面,让它在应用程序遇到未捕捉的异常时显示出来。那么,一旦发生异常,用户将会看到一张经过精心设计的页面,解释目前发生了什么状况,而不是用一条错误消息打发用户,让他们皱眉不已。
利用page指令的isErrorPage属性,就可以把一个JSP页面变成一个错误处理页面,该属性值必须为true。代码清单3-13展示了这样一个错误处理程序。
要防止未捕捉异常的其他页面则必须使用page指令的errorPage属性,将路径引向属性值指定的错误处理页面。例如,代码清单3-14中的buggy.jsp页面就是利用了代码清单3-13的错误处理程序。
如果运行这个buggy.jsp页面,它就会抛出一个异常。但你不会看到Servlet/JSP容器产生的错误消息,而是会看到errorHandler.jsp页面显示的内容。