美文网首页
Jsp技术之标签

Jsp技术之标签

作者: Mon7ey | 来源:发表于2017-11-23 15:34 被阅读30次

    Jsp标签

    标签的作用
    1. 替换Jsp脚本
    2. 流程判断(if for循环)
    3. 跳转页面(转发、重定向)
    内置标签
    • 内置标签(动作标签) : 不需要在Jsp页面导入标签

    • 转发标签 : <jsp:forward />

    • 参数标签 : <jsp:pararm />
      // 动态包含 包含和被包含的页面先各自翻译成java源文件,然后在运行时合并在一起

    • 包含标签 : <jsp:include />

    • 创建对象 : <jsp:useBean>

      // 等价于 Student stu = new Student();
      <jsp:useBean id="stu" class="完整包名.类名" />
      
    • 对象赋值 : <jsp:setProperty>

      // 等价于 stu.setName("jacky")
      <jsp:setProperty property="name" name="stu" value="jacky" />
      
    • 获取对象值 : <jsp:getProperty>

      // 等价于 stu.getName()
      <jsp:getProperty property="name" name="stu" />
      
    JSTL标签

    Jstl标签(外置标签) : 需要在jsp页面中导入标签

        JSTL(全名 : Java standard tag libarary --- java标准标签库)
        
        **核心标签库(C标签库)**
        **国际化标签库(fnt标签库)**
        **EL标签库(fn标签库)**
        XML标签库(x标签库)
        SQL标签库(sql标签库)
    
    1. 导入jstl支持的jar包(标签背后隐藏的java代码)
      注意:使用javaee5.0的项目自动导入jstl支持jar包
    2. 使用taglib指令导入标签库
      <%@taglib uri="tld文件的uri名称" prefix="简写" %>
    3. 在jsp中使用标签
    核心标签库重点标签

    保存数据:<c:set></c:set>

        // 使用例句
        <c:set var="name" value="zhangsan" scope="request"></c:set>
    

    获取数据:<c:out value=""></c:out>

        // out标签 : 从域中获取 
        // default : 当value的值为null时,显示默认值
        // escapeXml : 是否对获取的值进行转义
        <c:out value="${name }" default="默认值" escapeXml="false"></c:out>
    

    单条件判断 : <c:if test=""></c:if>

        // if标签 : 但条件判断  判断结果显示为boolean类型 
        <c:if test="true">成立则输出此内容</c:if>
    

    多条件判断 : <c:choose></c:choose>; <c:when test=""></c:when>;<c:otherwise></c:otherwise>

    <c:set var="score" value="86"></c:set>
    <c:choose><%-- choose : 选择 --%>
        <c:when test="${score >= 90 && score < 100 }">
            优秀
        </c:when>
        <c:when test="${score >= 80 && score < 90 }">
            良好
        </c:when>
        <c:when test="${score >= 70 && score < 80 }">
            一般
        </c:when>
        <c:when test="${score >= 60 && score < 70 }">
            及格
        </c:when>
        <c:otherwise>
            不及格
        </c:otherwise>
    </c:choose>
    

    循环数据 : <c:forEach></c:forEach>;<c:forTokens items="" delims=""></c:forTokens>

    // 模拟数据
    List<Student> list = new ArrayList();
    list.add(new Student("zhangsan", 11));
    list.add(new Student("lisi", 12));
    list.add(new Student("wangwu", 13));
    pageContext.setAttribute("list", list);
    
    Map<String,Student> map = new HashMap<String,Student>();
    map.put("1", new Student("mark",20));
    map.put("2", new Student("eli",20));
    map.put("3", new Student("lucy",20));
    pageContext.setAttribute("map", map);
    
    // forToken 模拟数据
    String str = "java-php-net-平面";
    pageContext.setAttribute("str", str);
    

    // begin : 起始元素的位置. 可以不写,默认从0开始遍历
    // end : 结束元素的位置. 可以不写,默认到最后一个元素
    // step : 步长 等价于" i++ ", 可以不写,默认步长为"1"
    // items : 需要遍历的数据(集合)
    // var : 每个元素的名称
    // varStatus : 当前正在遍历元素的状态对象
    <c:forEach begin="0" end="2" step="1" items="${list}" var="student" varStatus="varSta">
        序号 : ${varSta.count } - 姓名 : ${student.name } - 年龄 : ${student.age } <br />
    </c:forEach>
    

    // items : 需要遍历的特殊字符串
    // delims : 字符串的分隔符
    // var : 分割后的每个变量的内容
    <c:forTokens items="${str}"  delims=" -" var="s">
        ${s}
    </c:forTokens>
    

    重定向 : <c:redirect></c:redirect>

    // 可以重定向到任何位置 
    <c:redirect url="https://www.baidu.com"></c:redirect>
    

    自定义标签

    自定义标签的简单使用
    1. 编写一个普通的Java类,继承 SimpletagSupport类,叫做"标签处理器"类
     public class TagShowIp extends SimpleTagSupport{
    
        @Override
        public void doTag() throws JspException, IOException {
            // 向浏览器输出客户的Ip地址
            PageContext pageContext = (PageContext)getJspContext();
            HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
            
            // 获取Ip地址
            String ip = request.getRemoteHost();
            
            // 输出Ip地址
            JspWriter out = pageContext.getOut();
            out.write("使用自定义标签输出客户的Ip地址 : " + ip);
        }
    }
    
    1. 在web项目的WEB-INF目录下建立xxx.tld文件,这个tld文件叫做"标签库的声明文件",(可参考核心标签库tld文件的写法)
    <?xml version="1.0" encoding="UTF-8" ?>
    <taglib xmlns="http://java.sun.com/xml/ns/javaee"     
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
    
        // tlib-version : 代表标签库的版本
        <tlib-version>1.1</tlib-version>
        // short-name : 代表标签库的前缀. 要和Jsp中声明prefix中的值一样
        <short-name>jsptag</short-name>
        // uri : tld文件的唯一标记
        <uri>http://jsptag.se7en.com</uri>
    
        // 标签的声明
        <tag>
            // name : 标签的名称
            <name>choose</name>
            // tag-class : 标签处理器类的全名
            <tag-class>com.se7en.jsptag.TagShowIp</tag-class>
            // body-content : 代表输出的标签体内容的格式
            <body-content>scriptless</body-content>
        </tag>
    </taglib>
    
    1. 在jsp页面的头部导入自定义的标签库

       <%@taglib uri="http://jsptag.se7en.com" prefix="jsptag" %>
      
    2. 在jsp页面中使用自定义标签

       <jsptag:showIp></jsptag:showIp>
      
    自定义标签处理器类的生命周期

    SimpleTag接口:

    // 设置pageContext对象,传入pageContext(一定调用)
    // 通过getJspCotext()方法得到pageContext对象
    void setJspContext(JspContext pc);
    
    // 设置父标签对象,传入父标签对象,如果没有父标签,则不调用此方法。
    // 通过getParent()方法得到父标签对象。
    void setParent(JspTag parent)  
    
    // 设置属性值。
    void setXXX(值)             
    
    // 设置标签体内容。标签体内容封装到JspFragment对象中,然后传入JspFragment对象。
    // 通过getJspBody()方法得到标签体内容。如果没有标签体内容,则不会调用此方法
    void setJspBody(JspFragment jspBody) 
    
    // 执行标签时调用的方法。(一定调用)
    void doTag()                    
    
    案例-自定义带属性标签

    标签处理类代码

    public class LoginTag extends SimpleTagSupport {
    
        private String userName;
        private String password;
        
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public void doTag() throws JspException, IOException {
    
            JspContext ctx = getJspContext();
            
            // 设置输出内容的类型和编码
            HttpServletResponse response = (HttpServletResponse) ((PageContext) ctx).getResponse();
            response.setContentType("text/html;charset=utf-8");
            
            String html = "";
            html += "<center>";
            html += "   <h3>用户登录页面</h3>";
            html += "</center>";
            html += "";
            html += "<table border='1' align='center' width='400px'>";
            html += "   <tr>";
            html += "       <th>用户名:</th>";
            html += "       <td><input type='text' name='" + userName + "' /></td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <th>密码:</th>";
            html += "       <td><input type='password' name='" + password + "' /></td>";
            html += "   </tr>";
            html += "   <tr>";
            html += "       <td colspan='2' align='center'><input type='submit' name='登录' />&nbsp;<input";
            html += "           type='reset' value='重置' /></td>";
            html += "   </tr>";
            html += "</table>";
    
            JspWriter out = ctx.getOut();
            out.write(html);
        }
    }
    

    自定义标签声明

    <tag>
        <name>login</name>
        <tag-class>com.se7en.jsptag.LoginTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>userName</name>
            <required>true</required>    // 指定属性是否是必须的或者可选的,如果设置为false为可选。
            <rtexprvalue>false</rtexprvalue>    // 声明在运行表达式时,标签属性是否有效。
        </attribute>
        <attribute>
            <name>password</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
    </tag>
    

    注意标签处理器类中的属性值和自定义标签声明文件中的值一定要完全相同(包括大小写)

    案例-高仿c:if标签

    标签处理类代码

    public class IfTag extends SimpleTagSupport{
        
        private boolean test;
    
        public void setTest(boolean test) {
            this.test = test;
        }
        
        @Override
        public void doTag() throws JspException, IOException {
            
            if (test) {
                this.getJspBody().invoke(null);
            }
        }
        
    
    }
    

    自定义标签声明

      <tag>
        <name>if</name>
        <tag-class>com.se7en.jsptag.IfTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      </tag>
    
    案例-高仿c:choose标签组

    标签处理类代码

    chooseTag

    public class ChooseTag extends SimpleTagSupport {
    
        // 临时变量
        private boolean flag;
    
        public boolean getFlag() {
            return flag;
        }
    
        public void setFlag(boolean flag) {
            this.flag = flag;
        }
    
        @Override
        public void doTag() throws JspException, IOException {
            // 输出标签体内容
            this.getJspBody().invoke(null);
        }
    
    }
    

    WhenTag

    public class WhenTag extends SimpleTagSupport {
    
        private boolean test;
    
        public void setTest(boolean test) {
            this.test = test;
        }
    
        @Override
        public void doTag() throws JspException, IOException {
    
            ChooseTag parent = (ChooseTag) this.getParent();
            parent.setFlag(test);
    
            if (test) {
                this.getJspBody().invoke(null);
            }
    
        }
    }
    

    Otherwise

    public class OtherwiseTag extends SimpleTagSupport {
    
        @Override
        public void doTag() throws JspException, IOException {
            
            // 获取when标签中的test值
            ChooseTag parent = (ChooseTag) this.getParent();
            boolean test = parent.getFlag();
    
            if (!test) {
                this.getJspBody().invoke(null);
            }
        }
    
    }
    

    自定义标签声明

       <tag>
        <name>choose</name>
        <tag-class>com.se7en.jsptag.ChooseTag</tag-class>
        <body-content>scriptless</body-content>
      </tag>
      
      <tag>
        <name>when</name>
        <tag-class>com.se7en.jsptag.WhenTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      </tag>
      
      <tag>
        <name>otherwise</name>
        <tag-class>com.se7en.jsptag.OtherwiseTag</tag-class>
        <body-content>scriptless</body-content>
      </tag>
    
    案例-高仿c:forEach标签

    标签处理类代码

    public class ForEach extends SimpleTagSupport {
    
        // 集合 list map
        private Object items;
    
        private String var;
    
        public void setItems(Object items) {
            this.items = items;
        }
    
        public void setVar(String var) {
            this.var = var;
        }
    
        @Override
        public void doTag() throws JspException, IOException {
    
            PageContext ctx = (PageContext) this.getJspContext();
    
            Collection colls = null;
            if (items instanceof List) {
                colls = (List) items;
            }
    
            if (items instanceof Map) {
                Map map = (Map) items;
                colls = map.entrySet();
            }
    
            for (Object obj : colls) {
                // 需要将数据存入域对象中才能在Jsp页面中使用El表达式取出数据
                ctx.setAttribute(var, obj);
                this.getJspBody().invoke(null);
            }
    
        }
    }
    

    自定义标签声明

      <tag>
        <name>forEach</name>
        <tag-class>com.se7en.jsptag.ForEach</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>var</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
      </tag>
    

    相关文章

      网友评论

          本文标题:Jsp技术之标签

          本文链接:https://www.haomeiwen.com/subject/oamzvxtx.html