Tom小猫,让我看清你的五脏六腑(三)

    技术2022-05-11  19

    Servlet过滤器在Java Servlet2.3中定义,能够对Servlet容器的请求和响应对象进行检查和修改。所有的过滤器类都必须实现javax.servlet.Filter接口,其中有三个需要实现的方法:init(FilterConfig)-一个初始化方法,Servlet容器创建过滤器类后将调用这个方法,在此方法中可以读取web.xml文件中的Servlet过滤器的初始化参数。doFilter(ServletRequest,ServletResponse,FilterChain)-实际的过滤操作,FilterChain参数用于访问后面的过滤器。destroy()-用来释放某些Servlet过滤器占用的资源。

    下面是一个解决中文乱码问题很有用的一个过滤器:

    public class SetCharacterEncodingFilter implements Filter  {        public void destroy() {}      public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)       throws IOException, ServletException {    request.setCharacterEncoding("GB2312");    chain.doFilter(request, response);    }    public void init(FilterConfig filterConfig) throws ServletException {}}

    发布Servlet过滤器-在web.xml在文件中加入<filter>元素和<filter-mapping>元素

    下面的例子中Servlet过滤器会过滤所有的URL:

    <filter>  <filter-name>Set Character Encoding</filter-name>  <filter-class>SetCharacterEncodingFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern>  </filter-mapping>

    串连Servlet过滤器多个Servlet过滤器可以协同工作,Servlet容器将根据它们在web.xml中定义的先后顺序,依次调用它们的doFilter()方法。工作流程如下: Code1; // 表示调用chain.doFilter()前面的代码 chain.doFilter();  // 表示调用下一个过滤器的doFilter()方法 Code2; // 表示调用chain.doFilter()后面的代码

    自定义JSP标签库此技术在JSP 1.1版本中才出现,用来重用某些复杂的逻辑运算和事务,或定义JSP王爷的输出内容和格式。制作一个完整的自定义标签程序,包含3个步骤:1. 创建标签的处理类此类必须扩展javax.servlet.jsp.TagSupport类或者javax.servlet.jsp.BodyTagSupport类。以TagSupport类为例,先了解一下这个类的主要方法:doStartTag()-JSP容器遇到自定义标签的起始标志时调用该方法;doEndTag()-JSP容器遇到自定义标签的结束标志时调用该方法;setValue(String k,Object o)-在标签处理类中设置key/value;getValue(String k)-在标签处理类中根据key返回匹配的value;removeValue(String k)-在标签处理类中删除key/value;setPageContext(PageContext pc)-设置PageContext对象,该方法在调用doStartTag()和doStartTag()前调用;setParent(Tag t)-设置嵌套当前标签的上层标签的处理类,该方法在调用doStartTag()和doStartTag()前调用;getParent()-返回嵌套当前标签的上层标签的处理类。首先调用setPageContext(PageContext pc)和setParent(Tag t),设置TagSupport类的两个重要属性值。如果遇到起始标志,调用doStartTag(),此方法返回一个整数值,它有两个可选值:Tag.SKIP_BODY(标签之间的内容被忽略)和Tag.EVAL_BODY_INCLUDE(标签之间的内容正常执行)。例如:<prefix:mytag>test</prefix:mytag>,如果遇上Tag.SKIP_BODY,test字符串不会显示在页面上;如果遇上Tag.EVAL_BODY_INCLUDE,test字符串将会显示在页面上。如果遇到结束标志,调用doEndTag(),此方法也返回一个整数值,它有两个可选值:Tag.SKIP_PAGE(表示立刻停止执行JSP页面,网页上未处理的静态内容和JSP程序均别忽略,任何已有的输出内容立刻返回到客户端;)和Tag.EVAL_PAGE(表示按正常流程继续执行JSP页面)。如果自定义标签包含自定义的属性,例如:<prefix:mytag attribute1="value1">,那么处理类中应该将这个属性做为成员变量,并提供一组get和set方法:private int attribute1;public void setAttribute1(int value){ this.attriubte1 = value;}public int getAttribute1(){ return attribute1;}下面是一个用来验证用户登陆的标签处理类例子:

    public class ValidateLoginTag extends TagSupport {    private String name;    private String password;    private Log log = LogFactory.getLog(ValidateLoginTag.class);    public int doEndTag() throws JspException{       if(name.equals("pepsixp"&& password.equals("888888")){              return(EVAL_PAGE);          }        return (SKIP_PAGE);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

    2.创建TLD-Tag Library Descriptor(标签库描述文件)TLD文件中元素可以分为三类:<tablib>、<tag>、<attribute><tablib>-设定标签库的相关信息,包含的子元素有tlibversion、jspversion、shortname、uri、info、tag。<tag>-用来定义一个标签,包含的子元素有name、tagcalss、bodycontent、info、attribute。bodycontent的说明:有三个可选值empty、JSP、tagdependent,empty表示标签中没有body,JSP表示body中可以加入JSP程序代码,tagdependent表示body的内容有标签进行处理。<attribute>-用来定义标签的属性,包含的子元素有name、required、rtexprvalue。rtexprvalue的说明:表示是否可以使用<%=...%>类型的表达式,例如:<prefix:mytaglib attribute1="<%=name%>">下面是一个简单的TLD文件:

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib>      <tlibversion>1.2</tlibversion>      <jspversion>1.1</jspversion>      <shortname>MY Tag Library</shortname>      <uri>http://www.blogjava.net/pepsixp/</uri>      <info></info>      <tag>          <name>ifLogin</name>          <tagclass>com.akazam.struts.taglib.ValidateLoginTag</tagclass>          <bodycontent>empty</bodycontent>          <info></info>          <attribute>              <name>name</name>              <required>true</required>              <rtexprvalue>true</rtexprvalue>          </attribute>          <attribute>              <name>password</name>              <required>true</required>              <rtexprvalue>true</rtexprvalue>          </attribute>      </tag> </taglib>

    实际中的使用:<%@ taglib uri="/tags/test" prefix="test" %><test:ifLogin name="pepsixp" password="888888"/>3.在web应用中使用标签先要在web.xml文件加入声明引用标签所在的标签:

    <taglib>          <taglib-uri>/tags/test</taglib-uri>          <taglib-location>/WEB-INF/test.tld</taglib-location> </taglib>

     


    最新回复(0)