Jsp(Java Srevlet Pages)、jstl标签

2019-04-29  本文已影响0人  Binary_r

一、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代码,但不会执行。

上一篇下一篇

猜你喜欢

热点阅读