Jsp(Java Srevlet Pages)、jstl标签
一、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代码,但不会执行。