美文网首页
Jsp(Java Srevlet Pages)、jstl标签

Jsp(Java Srevlet Pages)、jstl标签

作者: Binary_r | 来源:发表于2019-04-29 15:22 被阅读0次

    一、Jsp基础

    1、Jsp的作用
    Servlet

    缺点:不适合设置html响应体,需要大量的response.getWrite.print("<html>");
    优点:动态资源,可以编程

    Html

    缺点:静态网页,不能包含动态信息
    优点:不用为输出html标签发愁

    Jsp(Java Srevlet pages)

    优点:在原来html的基础上添加了java脚本,构成jsp页面

    2、jsp和servlet的分工

    JSP:作为请求发起页面或结束页面,例如显示表单、超链接、显示数据
    Servlet:作为请求中处理数据的环节

    3、Jsp组成
    jsp = html + Java脚本 + jsp标签(指令)

    jsp中无需创建即可使用的九大内置对象,例如:request、out对象

    3种java脚本

    <%....%>; java代码片段(常用)
    <%=....%>; java表达式,用于输出
    <%!....%>; 声明,用来创建类的成员变量和成员方法(基本不用)

    4、Jsp原理

    jsp是一种特殊的srvlet
    jsp -> java -> .class -> servlet -> 响应页面

    5、 Jsp的注释

    语法: <%-- jsp注释 --%>
    注意;
    1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。

    二、JSP的三大指令

    1、Page 告诉tomcat服务器如何翻译jsp文件(最复杂)

    <%@ page language="java" %>告诉服务器使用什么动态语言来翻译jsp文件

    pageEncoding="utf-8" 告诉服务器使用什么编码翻译jsp文件(成java文件)
    contentType="text/html; charset=utf-8"服务器发送浏览器的数据类型和内容编码
    注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题

    "import="java.util.*" --告诉服务器java文件使用什么包,导入包,多个包之间用逗号分割

    errorPage="error.jsp" 前页面如果抛出异常,那么要转发到另一个页面,就由errorPage来指定转发的页面。
    isErrorPage="false" 标识页面是否为处理错误的页面,该页面会设置状态码为500,且该页面可以使用九大内置对象中的exception

    buffer="8kb"指定缓冲区大小,默认我8kb
    isELIgnored="false"是否忽略El表达式,默认值为false,不忽略即支持

    2、include 静态包含,在当前页面用于包含其他页面

    语法: <%@include file="common/header.jsp"%>

    注意:

    1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
    2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、body)

    3、taglib 导入标签库

    两个属性:
    prefix:指定标签库在本页面中的前缀,有我们自己来起名称!
    url:指定标签库的位置

    三、九大内置对象

    request HttpServletRequest
    response HttpServletResponse
    config ServletConfig
    application ServletContext
    session HttpSession
    exception Throwable

    page Object(this)
    out JspWriter,jsp的输出流,用来向客户端响应

    pageContext PageContext(一个顶九个)

    1、PageContext(一个顶九个)

    Servlet中有三大域,Jsp中有四大域,PageContext是最后一个域对象

    ServletContext: 整个应用程序
    session: 整个会话中(一个会话只有一个用户)
    request: 一个请求链
    pageContext: 一个jsp页面,这个域是在当前页面和当前jsp页面的标签之间共享数据

    保存数据

    1)默认情况下,保存到page域
    pageContext.setAttribute("name");
    2)可以向四个域对象保存数据
    pageContext.setAttribute("name",域范围常量)

    获取数据

    1)默认情况下,从page域获取
    pageContext.getAttribute("name")
    2)可以从四个域中获取数据
    pageContext.getAttribute("name",域范围常量)
    域范围常量:
    PageContext.PAGE_SCOPE
    PageContext.REQUEST_SCOPE
    PageContext..SESSION_SCOPE
    PageContext.APPLICATION_SCOPE

    3)自动在四个域中搜索数据

    pageContext.findAttribute("name");
    顺序: page域 -> request域 -> session域- > context域(application域)

    可以获取其他八个内置对象
    public void method1(PageContext pageContext){
        //希望使用内置对象
        //从PageContext对象中获取其他8个内置对象
        JspWriter out =pageContext.getOut();
        HttpServletRequest rquest = pageContext.getRequest();
        ........
    }
    

    四、JSP标签

    1、JSP动作标签

    动作标签是由tomcat(服务器)来解释执行,与java一样在服务前端执行
    转发标签:<jsp:forward />
    参数标签:<jsp:pararm/>
    包含标签:<jsp:include/>
    原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。(先翻译再合并),动态包含

    2、jsp中与Javabean相关的标签

    <jsp:usebean>创建或查找bean(很少用)
    ***<jsp:usebean id="user1" class="cn.itcase.domain.User" scope="session">在session域中查找名为user1的bean,若不存在则创建一个
    <jsp:setProperty>设置属性值
    ***<jsp:setProperty property="username" name="user1" value="admin">设置bean为user1的username属性值为admin
    <jsp:getProperty>获取属性值
    ***<jsp:getProperty property="username" name="user1">获取bean为user1的username属性值

    五、EL表达式

    1、EL作用

    jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>。
    以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
    使用EL表达式替换掉jsp表达式
    EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
    语法: ${变量或表达式}

    2、EL语法

    1)输出基本数据类型变量
    从四个域获取${name}
    指定域获取${pageScope.name}
    域范围: pageScoep / requestScope / sessionScope / applicationScope
    2)输出对象的属性值Student
    3)输出集合对象 List 和 Map
    4)EL表达式计算
    替代jsp表达式,用于向浏览器输出域对象中的变量值和表达式计算的结果。

    语法:

    ${变量}
    输出普通字符串:${name}
    输出对象属性: ${student.name} 注意: .name 相当于 .getName()方法
    输出List集合: ${list[0].name } 注意: [0] 相当于 get(下标)方法
    输出map集合: ${map[key].name} 注意: [key]相当于get(key)方法

    3、javabean导航
    4、EL内置对象

    EL有11个内置对象,无需创建即可使用。其中10个是Map类型,还有一个是pageContext对象

    pageScope
    requestScope
    sessionScope
    applicationScope
    param: 对应参数,它是一个Map,key是参数名,value是参数值,适用于单值的参数

    paramValues:对应参数,它是一个Map,key是参数名,value是多个参数值,适用于多值的参数
    header:对应请求头,它是一个Map,key是参数名,value是参数值,适用于单值的参数
    headerValues:对应请求头,它是一个Map,key是参数名,value是多个参数值,适用于多值请求头
    initParam:获取<context-param>内的参数
    cookie:Map(String,Cookie)类型,其中key是cookie的name,value事cookie对象.
    pageContext:它是PageContext类型!
    ${pageContext.request.contextPath}获取到项目名

    5、EL自定义函数库

    六、JSTL标签库

    JSTL (全名:java standard tag libarary - java标准标签库 )

    核心标签库 (c标签库) 天天用

    国际化标签(fmt标签库)
    EL函数库(fn函数库)
    xml标签库(x标签库)过时
    sql标签库(sql标签库) 过时

    1、使用JSTL标签步骤
    1) 导入jstl支持的jar包(标签背后隐藏的java代码)
        注意:使用javaee5.0的项目自动导入jstl支持jar包
    2)使用taglib指令导入标签库 
        <%@taglib uri="tld文件的uri名称" prefix="简写" %>
    3)在jsp中使用标签     
    
    2、核心标签库的重点标签:
        保存数据:
                <c:set></c:set>   
        获取数据: 
                 <c:out value=""></c:out>
        单条件判断
                <c:if test=""></c:if>
        多条件判断
              <c:choose></c:choose>
              <c:when test=""></c:when>
              <c:otherwise></c:otherwise>
        循环数据
              <c:forEach></c:forEach>
              <c:forTokens items="" delims=""></c:forTokens>
              count:循环元素的个数
              index:循环元素的下标
              first:是否为第一个元素
              last:是否为最后一个元素
              current:是否为当前元素
        重定向
              <c:redirect></c:redirect>
        url value指定一个路径
              <c:url value='/UserServlet'/>  
          子标签 <c:param>用来给url后面添加参数(可以对参数进行url编码)
    

    3、自定义标签

    自定义标签开发步骤

    编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类

    /**
     * 标签处理器类
     * @author APPle
     * 1)继承SimpleTagSupport
     *
     */
    public class ShowIpTag extends SimpleTagSupport{
        private JspContext context;
        
        /**
         * 传入pageContext
         */
        @Override
        public void setJspContext(JspContext pc) {
            this.context = pc;
        }
    
        /**
         * 2)覆盖doTag方法
         */
        @Override
        public void doTag() throws JspException, IOException {
            //向浏览器输出客户的ip地址
            PageContext pageContext = (PageContext)context;
            
            HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
            
            String ip = request.getRemoteHost();
            
            JspWriter out = pageContext.getOut();
            
            out.write("使用自定义标签输出客户的IP地址:"+ip);
            
        }
    }
    

    2)在web项目的WEB-INF目录下建立itcast.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>1.1</tlib-version>
      <!-- 标签库前缀 -->
      <short-name>itcast</short-name>
      <!-- tld文件的唯一标记 -->
      <uri>http://gz.itcast.cn</uri>
    
      <!-- 一个标签的声明 -->
      <tag>
        <!-- 标签名称 -->
        <name>showIp</name>
        <!-- 标签处理器类的全名 -->
        <tag-class>gz.itcast.a_tag.ShowIpTag</tag-class>
        <!-- 输出标签体内容格式 -->
        <body-content>scriptless</body-content>
      </tag>
    
    </taglib>
    

    3) 在jsp页面的头部导入自定义标签库
    <%@taglib uri="http://gz.itcast.cn" prefix="itcast"%>

    4) 在jsp中使用自定义标签
    <itcast:showIp></itcast:showIp>

    自定义标签处理器类的生命周期
    SimpleTag接口: 
    void setJspContext(JspContext pc)  --设置pageContext对象,传入pageContext(一定调用) 
            通过getJspCotext()方法得到pageContext对象
    void setParent(JspTag parent)  --设置父标签对象,传入父标签对象,如果没有父标签,则不调用此方法。
            通过getParent()方法得到父标签对象。
    void setXXX(值)             --设置属性值。
    void setJspBody(JspFragment jspBody) --设置标签体内容。标签体内容封装到JspFragment对象中,然后传入JspFragment对象。
           通过getJspBody()方法得到标签体内容。如果没有标签体内容,则不会调用此方法
    void doTag()  --执行标签时调用的方法。(一定调用)
    
    自定义标签的作用

    1)控制标签体内容是否输出
    2)控制标签余下内容是否输出
    3)控制重复输出标签体内容
    4)改变标签体内容
    5)带属性的标签

    输出标签体内容格式

    JSP: 在传统标签中使用的。可以写和执行jsp的java代码。
    scriptless: 标签体不可以写jsp的java代码
    empty: 必须是空标签。
    tagdependent : 标签体内容可以写jsp的java代码,但不会执行。

    相关文章

      网友评论

          本文标题:Jsp(Java Srevlet Pages)、jstl标签

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