1、定义
JSP动作通过XML语法格式的标记来在请求处理阶段控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面以及为Java插件生成HTML代码等(百科摘录)。
2、在JSP2.0规范中,大概定义了20种标准动作元素,本文主要讲解七种常用的七种。即include、forward、useBean、getProperty、setProperty、param、plugin。
1)<jsp:include>动作
a)主要用来在请求处理阶段动态地包含一个静态或者动态的文件。
b)容器会检查被包含页面是否发生更改,如果发生更改,则会(只会)重新编译被包含文件。
c)语法:<jsp:include page=”{relativeURL |<%=expression%>}” flush=”true” />。
d)可以向被包含页面传到参数:
<jsp:include page=”{relativeURL |<%=expression%>}” flush=”true”> <jsp:param name=”paramName” value=”paramValue”/> </jsp:include>
2)<jsp:forward>动作
a)用于将请求转发到Web应用的其他组件(如Servlet、Jsp或HTML文件等)处理。
b)使用语法:<jsp:forward page=”{relativeURL |<%=expression%>}” />。
d)可以向请求转发的页面页面传到参数:
<jsp:forward page=”{relativeURL |<%=expression%>}” flush=”true”> <jsp:param name=”paramName” value=”paramValue”/> </jsp:forward>
3)<jsp:useBean>动作
a)使用useBean动作声明并初始化一个bean对象,并指定其名称和作用范围。
b)创建对象时,容器会先在指定的属性范围查找当前指定id标识的bean对象是否存在,如果存在则直接使用,否则使用new创建一个新的bean对象(可以参考该动作生成的对应servlet代码)。
c)语法:<jsp:useBean id=”” class=”” scope=”page | request |session | application” />,其中id属性表示bean对象的标识符,class属性表示bean对象的类类型,scope表示bean对象作用范围(默认为page)。
d)可以使用UseBean动作消除Jsp代码中的脚本代码(如变量声明、scriptlet及表达式)。
方式一:使用脚本代码:
<html><body> <% foo.Person p =(foo.Person) request.getAttribute("person"); p.setName("zhansan"); %> Persion is:<%=p.getName() %> <body><html>
方式二:使用useBean标准动作(配合getPropeterty动作):
<html><body> <jsp:useBean id="person" class="foo.Person" scope="request"/> Persion is:<jsp:getPropeterty name="person" property="name"/> <body><html>
4)<jsp:getProperty>动作
a)用于获取标识bean的属性值。
b)语法:<jsp:sgetProperty name=”” property=”” />,其中name属性表示bean的标识符(<jsp:useBean>动作的id属性),property属性表示bean的属性名称(对应getter,而不是实例变量)。
5)<jsp:setProperty>动作(重难点)
a)用于设置标识Bean中的属性值。
b)语法:<jsp:setProperty name=”” property=”” value|param=”” />,其中name属性表示bean的标识符(<jsp:useBean>动作的id属性),property属性表示bean的属性名称(对应setter,而不是实例变量),value属性表示直接设置值,param属性表示获取请求参数值来设置属性值(不能与value共用)。
c)如果请求参数名与性质名(setter属性名)不同,此时如果想把性质的值设置为请求参数的值,则必须使用param属性。如:<jsp:setProperty name=”” property=”性质名” param="请求参数名"/>。
d)值得一提的是,如果表单请求参数名与Bean中性质名(setter属性名)相同,则就无需在<jsp:setProperty >中指定请求参数名,即可以直接使用:<jsp:setProperty name=”” property=”” />。
e)更近一步,如果表单请求参数名与Bean中性质名(setter属性名)都相同,则可以使用通配符“*”来一次性设置所有的属性值为请求参数值,即:<jsp:setProperty name=”” property=”*” />。
f)使用方式一:放在<jsp:useBean>动作外:
<html><body> <jsp:useBean id="person" class="foo.Person" scope="request"/> <jsp:setProperty name="person" property="name" value="zhangsan"/> <jsp:getProperty name="person" property="name"/> <body><html>
生成的Servlet代码(部分):
//声明一个对象引用 foo.Person person = null; synchronized (request) { person = (foo.Person) _jspx_page_context.getAttribute("person", PageContext.REQUEST_SCOPE); if (person == null){ //如果指定属性范围内的对象不存在,则创建一个新对象 person = new foo.Person(); //将对象保存到指定的属性范围 _jspx_page_context.setAttribute("person", person, PageContext.REQUEST_SCOPE); } } //设置属性值(其实最终调用的就是setName()方法) org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("person"), "name", "zhangsan", null, null, false); //获取并输出属性值(其实最终调用的就是getName()方法) out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((foo.Person)_jspx_page_context.findAttribute("person")).getName())));
可以看出,使用此方式,会直接将person的属性值设置为新值,而不管该person对象是否已经存在。如果已经存在,则会覆盖已有对象的属性值,不存在则设置为新对象的属性值。
g)使用方式二:放在<jsp:useBean>动作内
<html><body> <jsp:useBean id="person" class="foo.Person" scope="request"> <jsp:setPropeterty name="person" property="name" value="zhangsan"/> </jsp:useBean> <jsp:getPropeterty name="person" property="name" /> <body><html>
生成的Servlet代码(部分):
//声明一个对象引用 foo.Person person = null; synchronized (request) { person = (foo.Person) _jspx_page_context.getAttribute("person", PageContext.REQUEST_SCOPE); if (person == null){ //如果指定属性范围内的对象不存在,则创建一个新对象 person = new foo.Person(); //将对象保存到指定的属性范围 _jspx_page_context.setAttribute("person", person, PageContext.REQUEST_SCOPE); //设置属性值(其实最终调用的就是setName()方法) org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("person"), "name", "zhangsan", null, null, false); } } //获取并输出属性值(其实最终调用的就是getName()方法) out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((foo.Person)_jspx_page_context.findAttribute("person")).getName())));
可以看出,使用此种方式,如果person对象已经存在,则不会重新覆盖(设置)对象的属性值,只有新建一个对象时,才会设置对象的属性值。
6)<jsp:param>动作
a)用于传递参数值,必须与include、forward或plugin动作配合使用。
b)语法:<jsp:param name=”paramName” value=”paramValue” />
7)<jsp:plugin> 动作
a)用于下载服务器端的JavaBean或Applet到客户端执行,这种显示需要在浏览器上安装Java插件。
b)语法:<jsp:plugin type=”bean | applet" code="className" codebase="classDiretoryName">,其中type属性表示被执行的java程序的类型,code属性表示被执行的文件名,该属性值必须以“.class”扩展名结尾,codebase表示被执行文件的目录。