美文网首页
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技术之标签

    Jsp标签 标签的作用 替换Jsp脚本 流程判断(if for循环) 跳转页面(转发、重定向) 内置标签 内置标签...

  • EL表达式与JSP标签(学习笔记)

      本文内容主要介绍EL表达式、JSP标准标签库(JSTL)、JSP自定义标签库。其中拿EL表达式和JSP技术做对...

  • JSP技术

    1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...

  • Spring(6)——框架显示层之Velocity技术

    Velocity教程 一、框架显示层技术 Jsp 优点:1、功能强大,可以写java代码2、支持jsp标签(jsp...

  • 一、JSP简介

    什么事JSP? JSP全称 Java server page。是一种动态网页开发技术。 使用jsp标签在HTML网...

  • JSP

    1.jsp = html + java(使用特殊标签tag引入)的动态资源的技术。 jsp就是servlet。虽然...

  • 五、Jsp 标签

    1 jsp标签1.1 jsp标签的作用jsp标签作用:替换jsp脚本。 核心标签库的重点标签:保存数据:

  • 5.Jsp标签

    1.Jsp标签 1.Jsp标签的作用 2. Jsp标签分类 3.Jsp内置标签 4.JSTL标签 5.JSTL使用...

  • JavaWeb之JSP

    八、JSP 目录:什么是JSP、JSP原理、JSP基础语法、JSP指令、9大内置对象、JSP标签 JSTL标签 E...

  • JSP基础学习笔记(3)--JavaBean

    JSP动作标签:

网友评论

      本文标题:Jsp技术之标签

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