javaweb学习总结———jsp自定义标签与el表达式结合使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  • 第一种方式(标签签到el表达式)实现从内存取数据,通过key获取value:
  • 一.编写一个实现Tag接口的Java类或者继承TagSupport 等...tag好多实现类,都可以继承实现(标签处理器类),此种方式可以获取到request对象,对于需要从内存中获取数据方便。
  • jsp中引用方式如下:
  • 1.写一个tld文件(此文件需要放在web功能的WEB-INF目录下),jsp中需引入,<%@ taglib uri="/WEB-INF/right-tags.tld" prefix="ui"%>,此文件是jsp与服务器连接的桥梁, prefix="ui" 为jsp所用前缀标识
  • right-tags.tld 文件内容
  • 2.2.3
  • s
  • /right-tags
  • 孤傲苍狼开发的自定义标签库
  • getName//
    
  • com.maystar.tag.TestTag
    
  • JSP
    
  • 
    
  • 
    
  •   value
    
  •   true
    
  •   true
    
  • 
    
  • 2.java处理器类:
  • public class TestTag extends TagSupport{
  • public static Logger logger = Logger.getLogger(TestTag.class.getName());
  • private static final long serialVersionUID = 1L;
  • //接收传递进来的PageContext对象
  • private static PageContext pageContext;
    
  • private String value;
    
  • public void setValue(String value) {
  •   this.value = value;
    
  • }
  • @Override
    
  • public int doStartTag() throws JspException {
    
  •     HttpServletRequest request =(HttpServletRequest) pageContext.getRequest();
    
  •   Map map = (Map)request.getSession().getServletContext().getAttribute("MAP_ROLE");
    
  •   String str1=Convert.trimNull(map.get(value));
    
  •     JspWriter out = pageContext.getOut();
    
  •     try {
    
  •         //这里输出的时候会抛出IOException异常
    
  •         out.write(str1);
    
  •     } catch (IOException e) {
    
  •         //捕获IOException异常后继续抛出
    
  •         throw new RuntimeException(e);
    
  •     }
    
  •     return 0;
    
  • }
    
  • @Override
    
  • public int doEndTag() throws JspException {
    
  •     System.out.println("调用doEndTag()方法");
    
  •     return 0;
    
  • }
    
  • @Override
    
  • public TagSupport getParent() {
    
  •     return null;
    
  • }
    
  • @Override
    
  • public void release() {
    
  •     System.out.println("调用release()方法");
    
  • }
    
  • @Override
    
  • public void setPageContext(PageContext pageContext) {
    
  •     System.out.println("setPageContext(PageContext pageContext)");
    
  •     this.pageContext = pageContext;
    
  • }
    
  • public void setParent(TagSupport arg0) {
    
  • }
    
  • }
  • 自定义标签的执行流程
  •   JSP引擎遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。
  • 1、public void setPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
    
  • 2、public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
    
  • 3、public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
    
  • 4、public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
    
  • 5、public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。
    
  • 第二种方式(el表达式嵌套标签)实例代码为取值得长度:
  • 一.编写一个普通标签处理器类,此种方式获取不到request对象,适用于前台需要转化编码方式或者时间类型,或者需要从缓存数据库中取数据等情形, jsp中引用方式如下:
    1. jsp页面中引入方式
  • <%@ taglib prefix="test" uri="/test-1.0"%>
  • 2.编写一个tlb文件内容如下,说明如下,这段tlb代码可以合并到第一种方法的tld文件里面,共用一个。
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  • version="2.0">
  • A tag library exercising function handlers.注意:该属性是可选择,属性,为了对该标签库的描述
  • 1.0注意:这里是必选值,否则,调用出错。
  • test注意,该属性是可选择属性,因为在jsp页面定义了前缀,这里在定义一个,简略名,不知是什么意思。
  • /test-1.0注意:这里定义的路径,表示,jsp找到该标签的唯一路径
  • 测试: 与 el 结合使用 如  ${test:getStringLength("XX")}
    
  • getStringLength 注意,这里,定义的是,标签对应的函数名
    
  • taglib.StringUtils注意:这里,给出了,该类,所在的路径,全路径
    
  • java.lang.Integer getStringLength(java.lang.String) 
    
  • 3.java类
  • public class StringUtils {
  • private static Logger logger = Logger.getLogger(StringUtils.class);
  • public static Integer getStringLength(String str){ 注意:这里的方法,必须都是静态的,并且,应该是public的
  • logger.info("输入值:" + str);
  • if(str == null){
  • return 0;
  • }
  • return str.length();
  • }
  • }
    1. web.xml中声明该标签,可以,声明,也可以不用,声明,因为,默认的,会去找/WEB-INF 下的,所有tld,标签库描述文件,然后自动加载
  • /test-1.0
  • test-1.0.tld
  • **

转载于:https://my.oschina.net/u/1054538/blog/741108

你可能感兴趣的:(javaweb学习总结———jsp自定义标签与el表达式结合使用)