JSP的七个常用动作解析

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表示被执行文件的目录。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值