一. JSP指令
1. jsp指令概述
jsp指令的格式: <%@指令名 attr1=" “attr2=” "%>,一般都会把jsp指令放到jsp文件的最上方,但这不是必须的
一个jsp页面,可以有0----N个指令
jsp的三大指令:
page | 最复杂 |
include | 静态包括 |
taglib | 导入标签库 |
最为常用,页最为复杂的就是page指令
2. page指令
page指令是最为常用的指令,也是属性最多的属性
page指令没有必须属性,都是可选属性。例如<%@page %>,没有给出任何属性也是可以的
在jsp页面中,任何指令都可以重复出现
<%@page language=“java”%>
<%@page import=“java.util.*”%>
<%@page pageEcoding=“utf-8”%>
- page pageEcoding="utf-8:他指定当前jsp页main的编码,只要不说谎就不会出现编码错误,在服务器把jsp编译成.java时需要使用pageEcoding
- contentType:他表示添加一个响应头:Content-Type,dengtongyu response.setContentType(“text/html;chaeset=utf-8”);
上面两个属性如果只提供了一个另一个属性就会跟着提供的一样 默认为ISO - import:导包!可以出现多次
- errorPage和isErrorPage
- errorPage:当前页面如果抛出异常,那么要转发到那个页面,由errorPage来决定(属于转发)
- isErrorPage:当前页面是否为处理异常的页面 这个标识会影响发送来的状态码为500 当此属性为true,这个页面可以使用9大内置对象中的execption
- autoFlush 和buffer
- autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新,默认为true,如果为false,那么在缓冲区满时抛出异常
- buffer:指定缓冲区大小,默认为8kb
- isELIgnored:是否忽略el表达式,默认为false,不忽略,即支持
- 基本没用:
- language:只能是java
- info:信息
- isThreadSafe:当前的jsp是否支持并发访问
- session:当前页面是否支持 session,如果为false,那么当前页面就没有session这个内置对象
- extends:让jsp生成servlet去继承属性指定的类
在web.xml中配置处理错误信息界面
3.include
- 与requestDispatcher的include()方法的功能相似
<%@include%> 他是在jsp编译成java文件时完成的,他们共同生成一个java(就是一个servlet)文件,然后再生成class
requestDispatcher的include() 是一个方法,包含和被包含的是两个servlet 即两个.class他们只是把响应的内容在运行时合并在一起了 - <%@include file=“xxx.jsp”%>
这里不能写变量 因为 静态包含是在编译阶段才会合并 但是jsp页面编译的时候 识别不了这个变量是啥- 作用: 把页面分解了,使用包含的方式组合在一起这样一个页面中不变的部分,就会形成一个独立的jsp,而我们只需要处理变化的jsp即可
4.taglib
- 两个属性:
- perfix:指定标签库在本页面中的前缀,由我们自己来命名
- uri:指定标签库的位置
<%@taglib perfix=“pre” uri="/struts-tags"%> <pre: text>
5. jsp的九大内置对象
5.1 什么是jsp的九大内置对象
在jsp中无需创建就可以使用的9个独享,他们是:
out(JspWrite): | 等同于response.getWrite(),用来向客户端发送文本数据 |
config(ServletConfig) | 对应真身找那个的ServletConfig |
page(当前jsp的真身类型) | 当前jsp页面的this对象 page=jsp.this |
pageContext(PageContext) | 页面上下文对象,他是最后一个没讲的域对象 |
exception(Throwable) | 只有在错误页面中可以使用这个对象 |
request(HttpServletRequest) | 即HttpServletRequest类对象 |
response(HttpServletResponse) | 即HttpServletResponse类对象 |
application(ServletContext) | 即ServletContext类对象 |
session(HttpSession) | 即HttpSession类对象,不是每一个jsp页面中都可以使用,某个jsp页面中设置<%@page session=“false”%>,说明这个页面不能使用 |
5.2 PageContext
- 一个顶九个
- Servlet中有三个域,而jsp中有四大域,他就是最后一个域对象
ServletContext: | 整个应用程序 |
session: | 整个会话(一个会话只有一个用户) |
request | 一个请求链 |
pageContext: | 一个jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签之间的共享数据 |
- 域对象
代理其他域:pageContext.setAttribute(“xxx”,“XXX”,PageContext.SESSION_SCOPE);- 获取其他八个对象
- 获取其他八个对象
- 全域查找:pageContext.findAttriute(“XXX”);从大到小,依赖查找 优先级:page request session application
二. jsp标签
1. jsp动作标签:
这些jsp的动作标签,与html提供的标签有本质区别
- 动作标签是由tomcat(服务器)来揭示执行,与java代码一样,都是在服务器端执行
- html由浏览器来执行
- jsp:forward:转发他与requestDispatcher的forward方法是一样的,一个是在Servlet中使用,一个是在jsp中使用
- jsp:include:包含,他与requestDispatcher的include()是一样的 (动态包含 有两个java文件)
2. jsp中与javaBean相关的标签
- jsp:useBean 创建或查询bean
1 <jsp:useBean id=“user1” class=“com.tjk.cn,User” scope=“session”> 在session域中查找名为user1的bean,如果不存在,就创建 - jsp:setProperty
<jsp:setProperty property=“username” name=“user1” value=“admin”> 设置名为user1的这个javaBean的username属性值为admin - <jsp:getProperty >
<jsp:getProperty property=“username” name=“user1”/>获取名为user1的javaBean的名为username属性
3.EL表达式
3.1 含义
- EL是jsp的内置表达式语言
${xxx}: | 全局域查找对象 |
${requestScope.xxx}: | request域中查找xxx对象 |
${sessionScope.xxx}: | session域中查找xxx对象 |
${applicationScope.xxx}: | applocation域查找xxx对象 |
- EL替代<%=…%>也就是说EL只能做输出
- JavaBean导航:
- - EL可以输出的东西都在11个内置对象中!
上面四个
- 在11个内置对象中其中10个是Map!pageContext不是map,它就是PageContext类型,1项顶九项
- 参数相关内置对象
param | 对应参数,他是一个Map,其中key参数名,value是参数值,适用于单值得参数 |
–paramValues | 对应参数,他是一个Map,其中key表示头闽南古城,value是多个参数值,适用于多值的参数 |
- 请求头内置对象
header | 对应请求头,他是一个Map,其中key表示透明橙,value是单个头值,适用于单值请求头 |
headerValue | 对应请求头,他是一个Map,其中ksy表示头名称,value是单个头值,适用于单值请求头 |
- 获取context-param内的参数
initParam:获取context-param内的参数 (web.xml中的初始化参数) - cookie:Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象
eg: ${cookie.JSESSIONID.value} - pageContext:他是pageContext类型
${pageContext.request.contextPath}
3.2 EL函数库
- 首先需要导入jstl的jar包 1.2就可以
- 其次在jsp页面上添加url
<%@taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
这样就可以使用了 - EL函数库:
3.3 自定义EL函数
class方法:
public class MyFunction {
//用于EL的自定义函数库
public static String tjk() {
return ("说");
}
}
jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="a" uri="/WEB-INF/tld/Myfunction.tld"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${a:tjk() }
</body>
</html>
需要新建一个tld文件
注意:
name的名字和jsp调用的名字必须一致 必须一致
<?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>MF</short-name>
<uri>http:www.itcast.cn</uri>
<function><!-- 定义函数 -->
<name>tjk</name> <!-- 调用名称 -->
<function-class>com.tjk.function.fn.MyFunction</function-class> <!-- 类全名 -->
<function-signature>java.lang.String tjk()</function-signature>
</function>
</taglib>
运行结果:
说
三. jstl标签库
1.jstl标签库基础
jstl是apache对EL表达式的扩展(也就是说jstl依赖EL),jstl是标签语言
1.1 JSTL标签库
jstl一共包含四大标签库
- core:核心标签库
- fmt:格式化标签库
- sql:数据库标签库(过时)
- xml:xml标签库(过时)
1.2 使用taglib指令导入标签库
除了jsp动作标签外,使用其他第三方的标签库都需要
- 导包
- 在使用标签的jsp页面中使用taglib指令导入标签库
下面是jstl的core标签库
<%@taglib prefix=“C” uri=“http://java.sun.com/jstl/core” %>- prefix=“c”:指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库指定为C
- url=“http://java.sun,com/jstl/core”:指定标签库的url
1.3 core标签库常用标签
1.3.1 out和set
- out
value:可以是字符串常量,也可以是EL表达式
default:当要出书的内容为null时,会输出default指定的值
escapeXml:默认值为true 表示转义
<c:out value=“tjk” ></c:out> | 输出字符串常量 |
<c:out value="$(xxx)" ></c:out> | 与$(xxx)相同 |
<c:out value="$(xxx)" default=“XXX”></c:out> | 当$(xxx)不存在时,输出XXX字符串 |
<c:out value=“tjk” default=“111” escapeXml=“true”></c:out> | escapeXml默认值为true 表示不会转义 |
- set:
var:变量名
value:变量值
scope:域,默认为page,可选值 page,request session application
<c:set var=“aaa” value=“tjk” ></c:set> | 在pageContext中添加name为aaa value为tjk的数据 |
<c:set value=“tjk” var=“aaa” scope=“session”></c:set> | scope是规定范围的 |
1.3.2 remove
remove:删除域变量
var:变量名
scope:如果不给出scope,表示删除所有域中的该名称的变量,如果指定了域,那么久删除该域中的变量
1.3.4 url
value: 指定一个路径,他会在路径前面自动添加项目名
url 标签中间可以添加参数如下:
<c:url value="http://www.baidu.com" >
<c:param name="username" value="tjk"></c:param>
</c:url>
1.3.5 if标签
对应java中的if语句
<c:set var="a" value="tjk"></c:set>
<c:if test="${not empty a}">
<c:out value=xixi"></c:out>
</c:if>
1.3.6 chose:
它对应的java中的if /else if/else
等于的时候必须是等等
<c:set var="num" value="1000"></c:set>
<c:choose>
<c:when test="${num>1000}">大于呢</c:when>
<c:when test="${num==1000}">等于呢</c:when>
<c:when test="${num<1000}">小于呢</c:when>
<c:otherwise>去你的吧</c:otherwise>
</c:choose>
1.3.7 forEach遍历
属性:
- var 循环变量
- begin:设置循环变量从几开始
- end:循环变量到几结束
- step:设置步长 等同于java中的i++ i+2 step默认为1
- items:指定要循环谁,可以是一个数组或一个集合
<c:forEach var="i" begin="1" end="20" step="2">
${i }<br/>
</c:forEach>
循环状态变量:
varStatus
count:循环元素的个数
index:循环元素的下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素
<c:forEach var="i" begin="1" end="20" step="2" varStatus="varrr">
${varrr.count }
${i }<br/>
</c:forEach>
1.3.8 fmt库
fmt库是格式化库
<fmt:formatDate value="" pattern="">
value:指定一个Date类型的变量
pattern:用来指定输出的模板!例如:yyyy-MM-dd HH:mm:ss
<fmt:formatNumber value="" pattern="0.00"/>
保留小数点后2位,他是四舍五入的
<f:formatNumber value="" pattern="#.##"/>
保留小数点后两位,也是四舍五入 但是不会进行补位