黑暗浪子 发表于 2013-1-23 02:27:04

Struts2讲义26

 
5.7  Struts2自定义标签实现图形验证功能

本节中将介绍如何自定义开发者自己的Struts2标签来实现登录时图形验证功能。
技术要点

本节先以JSP视图技术作为模板文件使用的视图技术。介绍如何实现图形验证功能。最后结合component标签来说明该标签重要属性。
JSP模板文件如何实现图形验证功能。
component标签调用模板文件。
演示代码

JSP模板文件:
<!--------------文件名:image.jsp----------------><%@ taglib uri="Self" prefix="s" %>………<s:self></s:self>………  
自定义标签Self类文件代码:
<!---------文件名:SelfDefinationTag.java----------->public class SelfDefinationTag extends TagSupport {         ………         public int doStartTag() throws JspException {                            JspWriter out = pageContext.getOut();                  try{                           out.println("<img src=\"..\\validateImage\"/>");                  }catch (IOException ioe1){                           ioe1.printStackTrace();                  }                                              return EVAL_BODY_INCLUDE;         }…………  
自定义标签Self模板定义文件(TLD文件):
<!----------文件名:self.tld-------><taglib>         <tlib-version>1.0</tlib-version>         <jsp-version>1.2</jsp-version>         <short-name>map</short-name>         <tag>                   <name>self</name>                   <tag-class>servlet.SelfDefinationTag</tag-class>                   <body-content>JSP</body-content>         </tag></taglib>  
自定义标签Self在web.xml文件中的部署定义:
<!----------文件名:web.xml-------><servlet>                   <servlet-name>validateImage</servlet-name>                   <servlet-class>servlet.ValidateImage</servlet-class>         </servlet>         <servlet-mapping>                   <servlet-name>validateImage</servlet-name>                   <url-pattern>/validateImage</url-pattern></servlet-mapping>…………<taglib>                   <taglib-uri>Self</taglib-uri>                   <taglib-location>/WEB-INF/tlds/self.tld</taglib-location></taglib>  
使用component标签调用模板文件的JSP:
<!------------文件名:SelfDefinationTag.jsp---------------><%@taglib prefix="s" uri="/struts-tags"%><html>         <head>                   <title>使用JSP模板自定义标签</title>         </head>         <body>                   <h3 align="left">                            使用JSP模板实现图形验证标签                   </h3>                   <p>                            <s:component template="/components/image.jsp" />                   </p>                   <h3 align="left">                            指定特定主题实现图形验证标签                   </h3>                   <p>                            <s:component theme="ajax" template="/components/image.jsp" />                   </p>                   <h3 align="left">                            指定特定模板目录实现图形验证标签                   </h3>                   <p>                            <s:component theme="ajax" templateDir="MyTemplate"                                     template="/components/image.jsp" />                   </p>         </body></html>  
自定义图形验证标签页面效果图5.31。
http://dl.iteye.com/upload/attachment/156235/f8d7b3ec-d8ea-3b54-8c9f-af442352ec29.jpg
 
图5.31  自定义图形验证标签范例图
代码解释

(1)在本示例中,随机生成动态数字的图形不是本节重点讲述的要点。因此有关生成动态数字图的servlet,读者可以参看示例代码。这里笔者通过实现Struts2的TagSupport接口定义了一个标签处理类。重写了doStartTag()方法。在该代码中读者也可知道这个自定义的标签只是插入了一段HTML图像代码,其中的validateImage就是笔者写的生成动态数字图的servlet类。在配置文件web.xml中也有该servlet的映射定义。
然后在示例项目的WEB_INF目录下新建了“tlds”目录,在该目录下新建了self.tld文件。定义了self标签。并且也在配置文件web.xml中声明了该标签。
之后又新建了image.jsp文件。引入了self标签的声明。该文件就作为实现图形验证标签的JSP模板文件。在代码中使用self标签定义。
(2)因为Struts2中的component标签是用来方便开发者定义自己开发的标签。因此笔者定义了一个新的JSP文件,在该文件中使用component标签来调用image.jsp这个模板文件。
在示例项目的WebRoot根目录下,笔者新建了几个文件夹,用以来特殊说明component标签是如何使用这些主题和模板。目录结构如图5.32
http://dl.iteye.com/upload/attachment/156233/f06d55a3-6db0-3fda-9449-b4d85fbcfab9.jpg
 
图5.32  主题和模板结构图
如代码所示,该标签有三个属性比较重要,而且它们都可以不显式申明。并且由图5.32可知,笔者在这些目录下都存放了image.jsp这个模板文件。因此component标签中template属性就是指定该模板文件所在路径。细心读者可以发现template属性中的模板文件路径不是全路径,前面缺少了模板根目录和主题文件夹名字的定义。这是因为component标签另外两个属性是分别来定义模板根目录和主题文件夹名字的。这两个属性是templateDir属性和theme属性。
其中theme属性就是定义之前所记述的主题。上一小节也提到它可以默认是“xhtml”主题。因此如果它没有显式声明,则表明主题为“xhtml”。则系统调用的模板文件是“xhtml”文件夹下的JSP模板。
同理,templateDir属性是定义模板文件所在的根目录名。如果它不显式声明,则默认为“template”。因此假设templateDir属性和theme属性都不显式声明,则系统调用的模板文件就是/template/xhtml下的模板文件。
注意:component标签内也可以使用param标签。这个标签可以作为很多标签的子标签。前面也有所提及,请读者仔细品味。
(3)本示例调用JSP模板文件的JSP代码中。第一个小例子同时不显式声明templateDir属性和theme属性,则调用的image.jsp文件是/template/xhtml/components/下的那个模板文件。第二个小例子中显式声明theme属性为“ajax”,则它调用的是/template/ajax/components/下的模板文件。第三个例子中theme属性为“ajax”,templateDir属性为“MyTemplate”,则它调用的是/MyTemplate/ajax/components/下的模板文件。
(4)component标签调用的模板文件可以不是JSP文件,它还可以是vm和ftl文件。这两个文件分别是velocity和FreeMarker默认的模板文件后缀名。因此template属性中也可以指定这两种文件类型的模板文件。同理,也可以使用这两种类型文件来调用模板文件,不必要光使用JSP来调用这两种和JSP总共三种文件类型的模板文件。在下一章笔者将具体介绍如何在Struts2框架中使用velocity和FreeMarker这两种视图技术。
页: [1]
查看完整版本: Struts2讲义26