`

JSP/Servlet:Scripting Variable

    博客分类:
  • J2EE
阅读更多

Scripting,Variable是用于自订标签与JSP页面之间沟通的变量,您可能会需要取出标签运算之后的值,以便在接下来的JSP页面中进行运算,例如取出某个标签运算后的值,设定为另一个卷标运算的属性值。

有几种方式可以用于设定Scripting Variable,主要的概念都是在JSP页面转译为Servlet时,透过一个中介者让Container知道那些变量该转译为Scripting Variable,以便JSP页面与自订卷标可以共享这个变量,这个类别可以是一个类别、也可以是一个web.xml中的描述。

设定Scripting Variable的一个方法,就是将之设定给pageContext,然后再告诉Container,设定pageContext的方法如下:

pageContext.setAttribute("varname", vardata); 

 来看一个例子,首先我们撰写下面这个类别:

DecodeTag.java

package onlyfun.caterpillar;

import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 

public class DecodeTag extends TagSupport { 
private String code; 

public void setCode(String code) { 
this.code = code; 
} 

public int doStartTag() throws JspException { 
code = code + "-decoded"; 
pageContext.setAttribute("decoded", code); 
return SKIP_BODY; 
}
} 

这个类别仿真解碼的过程,decoded是用来作为Scripting Variable的变量名称,接下来必须告知容器这个信息,作法之一,就是透过TagExtraInfo类别与VariableInfo类别,直接来看如何撰写:

TagExtraDemo.java

package onlyfun.caterpillar;

import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 

public class TagExtraDemo extends TagExtraInfo { 
public VariableInfo[] getVariableInfo(TagData data) { 
VariableInfo info = new VariableInfo("decoded", 
"String", true, VariableInfo.AT_END); 
return new VariableInfo[] {info}; 
} 
} 

getVariableInfo()方法传回VariableInfo的数组值,数组值的内容就是Scripting Variable的相关信息,在VariableInfo中的建构中传入四个参数:Scripting Variable名称、Scripting Variable型态、之前有无宣告过、作用范围。

第三个参数若设定为true,表示之前有宣告过,直接使用宣告过的变量,如果为false,则会生成新的实例;第四个参数为Scripting Variable在JSP页面中可以作用的范围,分为三种:

  • VariableInfo.AT_BEGIN:作用范围从标签开始至JSP页面结束。
  • VariableInfo.AT_END:作用范围从标签结束至JSP页面结束。
  • VariableInfo.AT_NESTED:作用范围从卷标开始至卷标结束。

接下来在tld档中告诉容器有关于自订卷标及TagExtraInfo类别的信息: decode.tld

... 
<tag> 
<description>Decode</description> 
<name>decode</name> 
<tag-class>onlyfun.caterpillar.DecodeTag</tag-class> 
<tei-class>onlyfun.caterpillar.TagExtraDemo</tei-class> 
<body-content>empty</body-content> 
<attribute> 
<name>code</name> 
<required>true</required> 
<rtexprvalue>true</rtexprvalue> 
</attribute> 
</tag> 
... 

其中<tei-class>标签即用来告诉容器有关于TagExtraInfo类别的信息,容器将JSP页面转译为Servlet时就会用到这个信息,可以这么测试: test.jsp

<%@taglib prefix="caterpillar"
uri="http://caterpillar.onlyfun.net/"%> 
<html> 
<body> 
解碼前:${ param.code } <br>
<caterpillar:decode code="${ param.code }"/> 
解碼后:${ decoded } 
</body> 
</html> 

上面这个方法的好处是使用一个类别集中管理标签的Scripting Variable,缺点则是若要修改变量,则必须修改TagExtraInfo类别后重新编译等;另一个方法则只要在tld档案中直接设定即可,不用透过 TagExtraInfo类别,设定的例子如下: decode.tld

... 
<tag> 
<description>Decode</description> 
<name>decode</name> 
<tag-class>onlyfun.caterpillar.DecodeTag</tag-class> 
<body-content>empty</body-content> 
<attribute> 
<name>code</name> 
<required>true</required> 
<rtexprvalue>true</rtexprvalue> 
</attribute> 
<attribute> 
<name-given>decoded</name-given> 
<variable-class>String</variable-class> 
<declare>true</declare> 
<scope>AT_END</scope> 
</attribute> 
</tag> 
... 

这次不需要透过<tei-class>的指定了,所使用的是<name-given>、< variable-class>、<declare>与<scope>四个标签,其意义与VariableInfo建构时 的四个参数相同。

使用固定的变量名称,则使用自订标签的人员必须事先知道Scripting Variable的名称,才可以在JSP页面中呼叫使用它,也可以让使用自订标签的人员自行决定名称,方法是使用<name-from- attribute>,例如: decode.tld

... 
<tag> 
<description>Decode</description> 
<name>decode</name> 
<tag-class>onlyfun.caterpillar.DecodeTag</tag-class> 
<body-content>empty</body-content> 
<attribute> 
<name>code</name> 
<required>true</required> 
<rtexprvalue>true</rtexprvalue> 
</attribute> 
<attribute> 
<name>varname</name> 
<required>true</required> 
</attribute> 
<attribute>
<name-from-attribute>varname</name-from-attribute> 
<variable-class>String</variable-class> 
<declare>true</declare> 
<scope>AT_END</scope> 
</attribute> 
</tag> 
... 

然后自订标签处理类别必须作一些修改,使其能够接收varname属性: DecodeTag.java

package onlyfun.caterpillar;

import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 

public class DecodeTag extends TagSupport { 
private String varname; 
private String code; 

public void setVarname(String varname) { 
this.varname = varname; 
} 

public void setCode(String code) { 
this.code = code; 
} 

public int doStartTag() throws JspException? { 
code = code + "-decoded"; 
pageContext.setAttribute(varname, code); 
return SKIP_BODY; 
}
} 

接下来就可以在JSP页面中这么使用: test.jsp

<%@taglib prefix="caterpillar" 
uri="http://caterpillar.onlyfun.net/"%> 
<html> 
<body> 
解碼前:${ param.code } <br>
<caterpillar:decode varname="keyword" code="${ param.code }"/> 
解碼后:${ keyword } 
</body> 
</html> 

如果您透过继承SimpleTagSupport类别来实作自订标签,则在设定Scripting Variable时,可以简单的使用JspContext的setAttribute()方法来设定,而不需要额外的设定tld档案,例如: SimpleDecodeTag.java

package onlyfun.caterpillar;

import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 

public class SimpleDecodeTag extends SimpleTagSupport { 
private String code; 

public void setCode(String code) { 
this.code = code; 
} 

public void doTag() throws JspException { 
code = code + "-decoded"; 
getJspContext().setAttribute("decoded", _code); 
}
} 

您可以使用下面这个JSP网页进行测试: test.jsp

<%@taglib prefix="caterpillar" 
uri="http://caterpillar.onlyfun.net/"%> 
<html> 
<body> 
解碼前:${ param.code } <br>
<caterpillar:decode code="${ param.code }"/> 
解碼后:${ decoded } 
</body> 
</html> 
分享到:
评论

相关推荐

    JSP/Servlet

    Scripting Variable Tag File Tag File是從JSP 2.0開始新增的功能,主要的目的是讓撰寫JSP網頁的網頁設計人員即使在不懂Java語法的情況下,也可以使用JSP語法來自訂標籤。 簡介 Tag File &lt;jsp: doBody&gt;、&lt;jsp:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    jsp_API 文档

    1. **JSP元素**:JSP页面主要由指令(Directives)、脚本元素(Scripting Elements)和动作(Actions)组成。指令如`&lt;%@ page %&gt;`用于配置页面属性,`&lt;%@ include %&gt;`用于包含其他文件,`&lt;%@ taglib %&gt;`引入自定义...

    jsp-api帮助文档

    1. **JSP元素**:包括指令(directives)、脚本元素(scripting elements)和动作(actions)。指令如`&lt;%@ page %&gt;`, `&lt;%@ include %&gt;`, `&lt;%@ taglib %&gt;`,用于配置页面属性。脚本元素分为声明(declarations)、...

    jsp技术开发实例精粹.rar

    2. **JSP元素**:JSP主要包含指令(Directives)、脚本元素(Scripting Elements)和动作(Actions)。指令如`&lt;%@ page %&gt;`, `&lt;%@ include %&gt;`, `&lt;%@ taglib %&gt;`用于设置页面属性、引入其他文件和注册标签库。脚本...

    JSP高级编程.rar

    **JSP基本结构** 包括JSP指令(Directives)、脚本元素(Scripting Elements)、声明(Declarations)、表达式(Expressions)、动作(Actions)等。指令如`&lt;%@ page %&gt;`, `&lt;%@ include %&gt;`, `&lt;jsp:include&gt;`等,...

    JSP代码 在其他地方发现的

    3. **脚本元素(Scripting Elements)**:包括Java表达式(`&lt;%= %&gt;`, 如`&lt;%= someVariable %&gt;`),脚本块(`&lt;% ... %&gt;`,可以包含任何Java代码),和声明(`! ... %&gt;`,用于声明变量或方法)。 4. **内置对象...

    JSP从入门到精通源代码

    基本结构包括JSP指令(Directives)、脚本元素(Scripting Elements)和动作元素(Actions)。例如,`&lt;jsp:include&gt;`用于动态包含其他页面,`&lt;% %&gt;`用于编写Java表达式,`! %&gt;`定义Java变量或方法。 **2. JSP生命...

    JavaWeb-11 JSP&EL表达式

    JSP有三个主要组成部分:指令(Directives)、动作(Actions)和脚本元素(Scripting Elements)。其中,脚本元素包括声明(Declarations)、脚本(Scripts)和表达式(Expressions),它们用于在页面上插入动态内容...

    struts的标志库

    &lt;description&gt;The name of the scripting variable to be exposed.&lt;/description&gt; &lt;/attribute&gt; ... &lt;/tag&gt; ``` 这里,`tag-class`指定处理该标签的Java类,`body-content`定义标签可以包含的内容,`attribute`则...

Global site tag (gtag.js) - Google Analytics