JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)

一、自定义标签,步骤
    * 确定需求
        * <my:date />  输出当前系统的时间  yyyy-MM-dd hh:mm:ss:SSS
    * 编写Java类
        新建包名:com.yxl.tag,新建类MyDateTag,实现SimpleTag接口
        * 只要与此接口有关的实现类,javax.servlet.jsp.tagext.JspTag
        * 需要实现具体的接口
            * javax.servlet.jsp.tagext.SimpleTag,简单标签,JSP2.0**,选择这个
            * javax.servlet.jsp.tagext.Tag,经典标签
        package com.yxl.tag;

        import java.io.IOException;
        import java.text.SimpleDateFormat;
        import java.util.Date;

        import javax.servlet.jsp.JspContext;
        import javax.servlet.jsp.JspException;
        import javax.servlet.jsp.PageContext;
        import javax.servlet.jsp.tagext.JspFragment;
        import javax.servlet.jsp.tagext.JspTag;
        import javax.servlet.jsp.tagext.SimpleTag;

        public class MyDateTag implements SimpleTag {

            public MyDateTag(){
                System.out.println("默认构造");
            }

            private PageContext pageContext;

            /**
             * 1、被调用的方法,tomcat调用
             */
            public void setJspContext(JspContext pc) {
        //        System.out.println(pc);
        //        System.out.println("setJspContext");
                this.pageContext = (PageContext) pc;

            }

            /**
             * 2、tomcat调用
             *  建议,在doTage方法中完成整个tag的功能
             *  需要再doTage方法之前,完成准备工作
             */
            public void doTag() throws JspException, IOException {
        //        System.out.println("doTag");
                //输出当前系统的时间  yyyy-MM-dd hh:mm:ss:SSS
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
                String date = format.format(new Date());
                //将获得的时间输出到浏览器
                this.pageContext.getOut().print(date);

            }

            @Override
            public JspTag getParent() {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public void setJspBody(JspFragment arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void setParent(JspTag arg0) {
                // TODO Auto-generated method stub

            }

        }

    * 编写tld文件
        在WEB-INF下新建文件夹tld,在tld文件夹下新建mytag.tld
        * tld文件是xml文档
        * 扩展名为*.tld
        * 位置:必须放置到WEB-INF目录下
        * 内容:
            <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>1.0</tlib-version>
                <!-- 建议引入当前便签库是,使用的简写   @taglib prefix="my" -->
                <short-name>my</short-name>
                <!-- 为当前标签库配置文件,起一个名称
                    * 内容:自定义,全球唯一
                 -->
                <uri>http://www.yxl.cn/jsp/mytag</uri>

                <!-- <my:date / >  注册标签 -->
                <tag>
                    <!-- 确定标签名称 -->
                    <name>date</name>
                    <!-- 确定实现类 -->
                    <tag-class>com.yxl.tag.MyDateTag</tag-class>
                    <!-- 格式化当前标签的body内容
                        * empty:当前标签没有标签体
                     -->
                    <body-content>empty</body-content>

                </tag>

            </taglib>
    * 在JSP页面引入
        * <%@ taglib uri="http://www.yxl.cn/jsp/mytag" prefix="my"%>
    * 测试
        * <my:date />

二、案例
    * 需求:<my:maxVal num1="12" num2="13" />
    package com.yxl.tag;

    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import javax.servlet.jsp.JspContext;
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.PageContext;
    import javax.servlet.jsp.tagext.JspFragment;
    import javax.servlet.jsp.tagext.JspTag;
    import javax.servlet.jsp.tagext.SimpleTag;

    public class MyMaxValueTag implements SimpleTag {

        public MyMaxValueTag() {
            System.out.println("默认构造");
        }

        private PageContext pageContext;
        private Integer num1;
        private Integer num2;

        // num1
        public void setNum1(Integer num) {
            this.num1 = num;
        }

        public void setNum2(Integer num) {
            this.num2 = num;
        }

        /**
         * 1、被调用的方法,tomcat调用
         */
        public void setJspContext(JspContext pc) {
            // System.out.println(pc);
            // System.out.println("setJspContext");
            this.pageContext = (PageContext) pc;

        }

        /**
         * 2、tomcat调用 建议,在doTage方法中完成整个tag的功能 需要再doTage方法之前,完成准备工作
         */
        public void doTag() throws JspException, IOException {
            System.out.println(this.num1);
            System.out.println(this.num2);
            // 判断两个数据的大小,然后输出
            if (this.num1 > this.num2) {
                this.pageContext.getOut().print(num1 + "大于" + num2);
            } else if (this.num1 < this.num2){

                this.pageContext.getOut().print(num1 + "小于" + num2);
            }
            else{
                this.pageContext.getOut().print(num1 + "等于" + num2);
            }

        }

        @Override
        public JspTag getParent() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void setJspBody(JspFragment arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void setParent(JspTag arg0) {
            // TODO Auto-generated method stub

        }

    }
    <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>1.0</tlib-version>
    <!-- 建议引入当前便签库是,使用的简写 @taglib prefix="my" -->
    <short-name>my</short-name>
    <!-- 为当前标签库配置文件,起一个名称 * 内容:自定义,全球唯一 -->
    <uri>http://www.yxl.cn/jsp/mytag</uri>

    <!-- <my:date / > 注册标签 -->
    <tag>
        <!-- 确定标签名称 -->
        <name>date</name>
        <!-- 确定实现类 -->
        <tag-class>com.yxl.tag.MyDateTag</tag-class>
        <!-- 格式化当前标签的body内容 * empty:当前标签没有标签体 -->
        <body-content>empty</body-content>

    </tag>

    <!-- <my:maxValue / > 注册标签 -->
    <tag>
        <!-- 确定标签名称 -->
        <name>maxValue</name>
        <!-- 确定实现类 -->
        <tag-class>com.yxl.tag.MyMaxValueTag</tag-class>
        <!-- 格式化当前标签的body内容 * empty:当前标签没有标签体 -->
        <body-content>empty</body-content>
        <!-- 确定当前标签使用了哪些属性 -->
        <attribute>
            <!-- 设置属性名称 -->
            <name>num1</name>
            <!-- 设置属性是否必须 * true/false * yes/no -->
            <required>true</required>
            <!-- rtexprvalue 运行时表达式的值 * runtime expression value -->
            <rtexprvalue>true</rtexprvalue>
            <!-- 确定标签类型 -->
            <type>java.lang.Integer</type>
        </attribute>

        <attribute>
            <!-- 设置属性名称 -->
            <name>num2</name>
            <!-- 设置属性是否必须 * true/false * yes/no -->
            <required>true</required>
            <!-- rtexprvalue 运行时表达式的值 * runtime expression value -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    </taglib>

    * 需求:<my:toUpperCase>xxYYdfsdDFwerd</my:toUpperCase>
    标签体
    package com.yxl.tag;

    import java.io.IOException;
    import java.io.StringWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import javax.servlet.jsp.JspContext;
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.PageContext;
    import javax.servlet.jsp.tagext.JspFragment;
    import javax.servlet.jsp.tagext.JspTag;
    import javax.servlet.jsp.tagext.SimpleTag;

    public class MyToUpperCaseTag implements SimpleTag {

        public MyToUpperCaseTag() {
            System.out.println("默认构造");
        }

        private PageContext pageContext;

        private JspFragment jspBody;

        /**
         * 1、被调用的方法,tomcat调用
         */
        public void setJspContext(JspContext pc) {

            this.pageContext = (PageContext) pc;

        }

         public void setJspBody(JspFragment jspBody){
                this.jspBody = jspBody;
         }

        /**
         * 2、tomcat调用 建议,在doTage方法中完成整个tag的功能 需要再doTage方法之前,完成准备工作
         */
        public void doTag() throws JspException, IOException {
            StringWriter stringWriter = new StringWriter();
            this.jspBody.invoke(stringWriter);
            String data = stringWriter.toString();
            this.pageContext.getOut().print(data.toUpperCase());

        }

        @Override
        public JspTag getParent() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void setParent(JspTag arg0) {
            // TODO Auto-generated method stub

        }

    }
    <!-- <my:toUpperCase / > 转换为大写 -->
    <tag>
        <!-- 确定标签名称 -->
        <name>toUpperCase</name>
        <!-- 确定实现类 -->
        <tag-class>com.yxl.tag.MyToUpperCaseTag</tag-class>

        <!-- 格式化当前标签的body内容 * empty:当前标签没有标签体 -->
        <!-- JSP:支持JSP所有的语法,在Tag中使用
        scriptless:对于JSP页面的脚本不支持
        tagdependent:标签体不做处理,原样输出 -->
        <body-content>scriptless</body-content>

    </tag>
    <my:toUpperCase>abcd</my:toUpperCase>
    * 需求:循环
    使用extends SimpleTagSupport这种方式实现标签类,SimpleTagSupport已经实现了SimpleTag接口
    三种循环遍历
    <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>1.0</tlib-version>
    <!-- 建议引入当前便签库是,使用的简写 @taglib prefix="my" -->
    <short-name>my</short-name>
    <!-- 为当前标签库配置文件,起一个名称 * 内容:自定义,全球唯一 -->
    <uri>http://www.yxl.cn/jsp/mytag</uri>

     <!--
    <my:myeach start="0" end="9" step="1" var="ss">
        ${ss} ** <br/>
    </my:myeach>
     -->

     <tag>
         <name>myeach</name>
         <tag-class>com.yxl.tag.MyEachTag</tag-class>
         <body-content>scriptless</body-content>

         <attribute>
             <name>start</name>
             <required>true</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>
         <attribute>
             <name>end</name>
             <required>true</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>
         <attribute>
             <name>step</name>
             <required>true</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>
         <attribute>
             <name>var</name>
             <required>true</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>
     </tag>

     <!--
     <my:myList items="${listObj}" var="yyyyy">
        ${yyyyy}  ## <br/>
    </my:myList>

      -->

      <tag>
          <name>myList</name>
          <tag-class>com.yxl.tag.MyListTag</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>true</rtexprvalue>
          </attribute>
      </tag>

       <tag>
          <name>forEach</name>
          <tag-class>com.yxl.tag.ForEachTag</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>true</rtexprvalue>
          </attribute>
      </tag>
    </taglib>
    package com.yxl.tag;

    import java.io.IOException;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.SimpleTagSupport;

    public class MyEachTag extends SimpleTagSupport{

        /*
         * <my:myeach start="0" end="9" step="1" var="ss">
            ${ss} ** <br/>
        </my:myeach>
         */

        private Integer start;
        private Integer end;
        private Integer step;
        private String var;

        public void setStart(Integer start) {
            this.start = start;
        }

        public void setEnd(Integer end) {
            this.end = end;
        }

        public void setStep(Integer step) {
            this.step = step;
        }

        public void setVar(String var) {
            this.var = var;
        }

        public void doTag() throws JspException, IOException {
            //完成功能:将获得的变量信息,输出到浏览器

            for(int i = start ; i <= end ; i +=step){
                //从父类中,获得pagecontext对象
                this.getJspContext().setAttribute(var, i);
                //将el表达式的结果发送到浏览器
                // * el表达式的位置
                // * 如何发送
                this.getJspBody().invoke(null);
                //this.getJspBody().invoke(this.getJspContext().getOut());
            }

        }

    }

    package com.yxl.tag;

    import java.io.IOException;
    import java.util.Iterator;
    import java.util.List;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.SimpleTagSupport;

    public class MyListTag extends SimpleTagSupport {

        /*
        <my:myList items="${listObj}" var="yyyyy">
            ${yyyyy}  ## <br/>
        </my:myList>
         */

        private List items;
        private String var;
        public void setItems(List items) {
            this.items = items;
        }

        public void setVar(String var) {
            this.var = var;
        }

        @Override
        public void doTag() throws JspException, IOException {
            //完成功能:将获得的list信息遍历输出到浏览器
            Iterator it = items.iterator();
            while(it.hasNext()){
                Object str = it.next();
                //将结果放置到作用域
                this.getJspContext().setAttribute(var, str);
                //将el表达式的结果数据到浏览器
                this.getJspBody().invoke(null);
            }
        }

    }

    package com.yxl.tag;

    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.SimpleTagSupport;

    public class ForEachTag extends SimpleTagSupport {

        /*
        <my:myList items="${listObj}" var="yyyyy">
            ${yyyyy}  ## <br/>
        </my:myList>
         */

        private Iterator<Object> items;
        private String var;
        public void setItems(Object items) {
            //list
            if(items instanceof List){
                this.items = ((List)items).iterator();
            }
            //map
            if(items instanceof Map){
                this.items = ((Map)items).entrySet().iterator();
            }
            //object[]
            if(items instanceof Object[]){
                this.items = Arrays.asList((Object[])items).iterator();
            }

        }

        public void setVar(String var) {
            this.var = var;
        }

        @Override
        public void doTag() throws JspException, IOException {
            //完成功能:将获得的list信息遍历输出到浏览器

            while(items.hasNext()){
                Object str = items.next();
                //将结果放置到作用域
                this.getJspContext().setAttribute(var, str);
                //将el表达式的结果数据到浏览器
                this.getJspBody().invoke(null);
            }
        }

    }

    <my:myeach start="0" end="9" step="1" var="eeee">
        ${eeee} ** <br/>
    </my:myeach>
    <%

        List<String> list = new ArrayList<String>();
        list.add("abc");
        list.add("123");
        list.add("wasd");

        pageContext.setAttribute("listObj",list);
    %>
    myList<br/>
    <my:myList items="${listObj}" var="yyyyy">
        ${yyyyy}  ## <br/>
    </my:myList>

    <my:forEach items="${listObj}" var="mm">
        ${mm} <br/>
    </my:forEach>

    <hr/>

    <%

        Map<String,String> map = new HashMap<String,String>();
        map.put("11111","11111");
        map.put("22222","222222");
        map.put("33333","33333");

        pageContext.setAttribute("mapObj",map);

    %>
    遍历Map<br/>

    <my:forEach items="${mapObj}" var="map">
        ${map.key} ---- ${map.value} <br/>
    </my:forEach>
三、自定义函数
    * 创建类,但方法必须是静态的
    package com.yxl.domain;

    public class Calculator {
        private String firstNum;
        private String operator;
        private String secondNum;
        private String result;
        public String getFirstNum() {
            return firstNum;
        }
        public void setFirstNum(String firstNum) {
            this.firstNum = firstNum;
        }
        public String getOperator() {
            return operator;
        }
        public void setOperator(String operator) {
            this.operator = operator;
        }
        public String getSecondNum() {
            return secondNum;
        }
        public void setSecondNum(String secondNum) {
            this.secondNum = secondNum;
        }
        public String getResult() {
            return result;
        }
        public void setResult(String result) {
            this.result = result;
        }
        public Calculator() {
        }

        //计算方法
        public static void calculator(Calculator cal){

            //通过运算符,将firstNum和secondNum处理的结果,存放到result

            double first = Double.valueOf(cal.firstNum);
            double second = Double.valueOf(cal.secondNum);
            char ope = cal.operator.charAt(0);

            switch (ope) {
                case ‘+‘:
                    cal.result = String.valueOf(first + second);
                    break;
                case ‘-‘:
                    cal.result = String.valueOf(first - second);
                    break;
                case ‘*‘:
                    cal.result = String.valueOf(first * second);

                    break;
                case ‘/‘:
                    cal.result = String.valueOf(first / second);
                    break;

                default:
                    throw new RuntimeException("非法操作符");
            }

        }
    }

    * 书写配置文件tld
        新建myFun.tld
        <?xml version="1.0" encoding="UTF-8" ?>
        <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 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">

            <tlib-version>1.0</tlib-version>
            <short-name>myfn</short-name>
            <uri>http://www.yxl.cn/mytag/functions</uri>
            <!-- 确定当前函数 myfn:calculator(cal) -->
            <function>
                <name>calculator</name>
                <function-class>com.yxl.domain.Calculator</function-class>
                <!-- 当前使用函数的声明 public static void calculator(Calculator cal) -->
                <function-signature>void calculator(com.yxl.domain.Calculator)</function-signature>
            </function>

        </taglib>
    * 引用
        * <%@ taglib uri="http://www.yxl.cn/mytag/functions" prefix="myFn" %>
    * 测试
        <jsp:useBean id="cal" class="com.yxl.domain.Calculator"></jsp:useBean>
        <jsp:setProperty property="firstNum" value="1" name="cal"/>
        <jsp:setProperty property="operator" value="+" name="cal"/>
        <jsp:setProperty property="secondNum" value="4" name="cal"/>
        ${myFn:calculator(cal)}
        ${cal.result}
四、总结
    * 共同点:
        * 需要引入
            * <%@ taglib uri="http://www.yxl.cn/mytag/myeach" prefix="my" %>
        * 都需要配置tld文件
    * 区别:
        * 自定义标签
            * 创建一个类,完成一个功能或一组功能。
            * 可以选择el表达式
        * 自定义函数
            * 创建一个静态方法,完成一个操作。
            * 必须与EL表达式结合使用
                ${fn:xxxx}
时间: 2024-10-05 04:25:10

JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)的相关文章

java_自定义标签,我的第一个自定义标签!

自定义标签,我的第一个自定义标签! 总共分两步 编写一个实现tag接口的java类,把jsp页面中的java代码移到这个类中,(标签处理器类) 编写标签库描述符(tld)文件,在tld文件中把标签处理器类描述成一个标签 一.案例, 输出客户端IP ViewIP.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&g

day12(jsp指令&内置对象&动作标签、JavaBean、EL表达式&函数库)

day12 JSP指令 JSP指令概述 JSP指令的格式:<%@指令名 attr1="" attr2="" %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的. JSP中有三大指令:page.include.taglib,最为常用,也最为复杂的就是page指令了. 2 page指令 page指令是最为常用的指定,也是属性最多的属性! page指令没有必须属性,都是可选属性.例如<%@page %>,没有给出任何属性也是可以的!

自定义的常用文件与目录操作函数库

自定义的常用文件与目录操作函数库,在win和linux平台做了跨平台的处理.(跨平台的处理可以作为参考比较.在win下目录的符号可以是\或者/,但是在linux下只能是/.) 下面给出的是源文件,实现接口函数的代码.每个接口函数都有很详细的功能说明. /* 判断文件或目录是否存在 * 在操作系统中,目录也是一个文件,如果要判断一个目录是否存在则应当使用DirectoryExists, * 要判断一个文件是否存在且是一个归档文件则应当使用IsArchive. * @如果文件或目录存在则返回true

深入分析JavaWeb Item25 -- 自定义标签开发案例和打包自定义标签库

一.开发标签库案例 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java package me.gacl.web.simpletag; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import jav

Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. JSTL标签库,是由一些Java类组成的. JSTL组成: JSTL –Core 核心标签库. 重点 JSTL – I18N - 国际化标签库.Internationalization- I18N JSTL – SQL – 数据库操作标签(有悖于MVC设计模式),现在都不用这个. JSTL - Fu

Jsp2.0自定义标签(第二天)——自定义循环标签

今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="myout" uri="/demo" %> <html> <h

JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)

1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% request.setCharacterEncoding("UTF-8"); %> <jsp:forward page="/index.jsp"> <jsp:param value="张三" name="userName&q

JavaWeb学习之动态页面技术(JSP/EL/JSTL)

JSP技术 1.jsp脚本和注释 jsp脚本: 1.<% java代码%>    内部的Java代码翻译到service方法的内部 2.<%=java 变量或表达式%>    会被翻译成service方法内部out.print() 3.<%! java 代码%>    会被翻译成servlet的成员(成员变量或者成员方法)的内容 jsp注释:不同的注释可见范围是不同的 1.Html注释:<!--注释内容-->     可见范围有jsp源码.翻译后的servl

超全面的JavaWeb笔记day13&lt;JSTL&amp;自定义标签&gt;

1.JSTL标签库(重点) core out set remove url if choose when otherwise forEach fmt formatDate formatNumber 2.自定义标签(理解) 步骤 标签处理类 tld文件 jsp中<%@taglib%> 处理类 实现SimpleTag接口 继承SimpleTagSupport类 有标签体的标签 不执行下面内容的标签 带有属性的标签 3.MVC设计模式(重点中的重点) M:模型 V:视图 C:控制器 4.Java三层

学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签. jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签 1.内置标签(动作标签): <jsp:forward />转发标签: 语法:<jsp:forward page="