jsp生命周期:首次访问jsp,1 转成的servlet源代码,?2 编译,3 加载,4 执行jsp的init方法, 5 执行jsp的service方法, 6 处理完毕执行jsp的distroy方法。
(1) HTML元素
(2) CSS元素
(3) JS元素
注释:html,css,js代码会原样输出到前端浏览器
(1) JSP注释:<%-- 注释 --%>? // 只在Jsp文件内可见
(2) Java注释:<% // 注释 |?/* 注释 */?|?/** 注释 */ %> // 与java代码的注释完全一样
(3) Html注释?:<!-- 注释 --> // 会出力到前端浏览器,可以通过右键网页“查看网页源代码”看见
(1) 声明变量:<%!? int i = 0; ?%> //?相当于类的全局变量,与JSP文件中的位置无关。不能使用request,session等对象。重点:同servlet全局一样,多个session共用一个对象。
(2) 声明函数:<%! public void getTest(){ ... } %>
(1) JSP脚本代码:
<% request.setAttribute("key","value"); %> // 内部就是java代码,分号结束
(2) JSP脚本判断:
<% if(...){ ...} else {...} %> // 内部就是java代码
<% if (...) { %> 页面内容1 <% } else { %> 页面内容2 <% } %> // java代码套html元素
(3) JSP脚本循环:
<% for (...) {...} %> // 内部就是java代码
<%?for?(...) { %> 页面内容1 <% } %> // java代码套html元素
(1) JSP表达式全局变量:<%=i %>?// 输出声明<%! int i = 0 %>定义的全局变量
(2) JSP表达式局部变量:<%=a %>?// 输出JSP脚本<% int a = 1;%>定义的局部变量
(3) JSP表达式内置对象:<%=request.getAttribute("key") %>?// 输出JSP内置对象的函数返回值
注释:<%= 与变量之间可以有空格
(1) HTML文本:<div> <%=i %> </div>
(2) HTML属性:<input type="text" value="<%=i %>" />
(3) JSP动作属性:<jsp:include page="<%=i %>"/> /
(4) 自定义标签属性:<c:out value="<%=i %>" />
注释:不可放到指令<%@的属性中。
(1) 编程语言:<%@ page language="java" %> // 默认就是java语言,无用代码
(2) 文本格式:<%@ page contentType="text/html; charset=UTF-8" %>?//?指定生成内容及字符集,相当于 response.setContentType(...);
(3) 编码格式:<%@ page pageEncoding="UTF-8" %> //不设定则默认用 contentType的编码
(4) 导入Java类:<%@ page import="java.util.*" %>?
(5) 开启Session:<%@ page session="true" %> // 指定是否启用session
(6) 忽视EL表达式:?<%@ page isELIgnored="true" %> // true关闭el,false开启el
(7) 线程安全:<%@ page isThreadSafe="true" %>?// 表示最终生成的servlet是否具有线程安全性。
(8) 错误跳转页面:<%@ page errorPage="xx.jsp" %> // 出异常跳转到指定页面
(9) 异常处理页面:<%@ page isErrorPage="false" %>?//?TRUE表示当前文件是一个错误提示页面。可使用exception.getMessage();
(10) 继承:<%@ page extends="xx.servlet" %> // 定制jsp的servlet,很少使用
(11) 缓存:<%@ page buffer="32kb" %> // 最小8kb存页面内容,直接发数据给客户端不用缓存。
(12) 自动刷新:<%@ page autoFlush="false" %> //?缓存满了是否自动发送给用户,默认true, 设置false满了出异常
(13) 页面信息:<%@ page info="xxx" %> //?可获通过<%= getServletInfo() %>取到值
注释:多个属性可以空格或换行分割?
(1) 静态包含:<%@ include file="xxx.jsp" %> // file以/开头代表应用根目录,不以/开头代表jsp同级目录文件,file不能传参数。子页面声明不能与主页面声明重名,因为相当于是同一个类文件
(1) 引入核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> // 等号与值之间不能有空格
格式化标签:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL标签:(与关系型数据库(Oracle,MySQL,SQL Server)进行交互的标签
函数标签?:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
自定义标签:<%@ taglib prefix="diy" uri="/diytaglib" %>
(1) 获取页面域对象:pageContext.getAttribute("key")
(2) 设置页面域对象:pageContext.setAttribute("key", value)
(3) 删除页面域对象:pageContext.removeAttribute("key", value)
(4) 动态包含:pageContext.include("xx.jsp") // 将资源包含到当前页面,可声明同名变量
(5) 请求转发:pageContext.forward("xx.jsp") // 等同于servlet的 请求转发,可携带请求域的数据。刷新缓存数据到页面或 执行到include自动刷新缓存后,不能使用该语句。
注释:pageContext对象只在当前jsp生效。还可以获取到request,response,servletContext等对象
(1) 获取页面域对象:request.getAttribute("key")
(2) 设置页面域对象:request.setAttribute("key", value)
(3) 删除页面域对象:request.removeAttribute("key", value)
注释:request对象当前请求生效适用于请求转发后的jsp或servlet,适用于页面跳转携带数据到新页面。同servelt的request一样使用。
(1) 获取会话域对象:session.getAttribute("key")
(2) 设置会话域对象:session.setAttribute("key", value)
(3) 删除会话域对象:session.removeAttribute("key", value)
注释:?session在整个会话阶段生效,关闭浏览器或会话超时失效,适用于保留用户登录信息。同servelt的session一样使用。指令<%@ page session="false" %>使页面session不可用,默认为true
(1) 获取应用域对象:application.getAttribute("key")
(2) 设置应用域对象:application.setAttribute("key", value)
(3) 删除应用域对象:application.removeAttribute("key", value)
注释:?application在整个应用启动阶段生效,服务器停止后失效,适用于保存服务器共有信息。同ServletContext一样使用。
jsp2.0加入,用来代替 <% %> 和 <%= %>,若jsp不识别el表达式原文输出,是因为Servlet是3.0关闭了el表达式的识别。
(1) web.xml:true关闭,false开启 // 测试切换配置未能变更效果,原因(先保存jsp后改web.xml,导致jsp没有变更,所以修改配置效果不变),解决对策(修改web.xml后,修改jsp并重新保存,效果变更了)
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
(2) JSP命令:?<%@ page isELIgnored="false" %> // true关闭,false开启
注释:配置优先级:jsp未设置用web.xml配置,jsp配置了则优先用jsp配置。
(1) HTML文本:<div> ${name} </div>
(2) HTML属性:<input type="text" value="${name}" />
(3) JSP动作属性:<jsp:include page="${xxx}"/> // 不用于jsp指令<%@中
(4) 自定义标签属性:<c:out value="${xxx}" />
四个作用域对象,不指定域名则取最小作用域的值。优先page>request>session>application
(1) 页面域:pageScope?// ${pageScope.key} 获取 页面域指定key对应的值
(2) 请求域:requestScope?// ${requestScope.key} 相当于 request.getAttribute("key")
(3) 会话域:sessionScope?// ${sessionScope.key} 相当于 session.getAttribute("key")
(4) 应用域:applicationScope?// ${applicationScope.key} 相当于 servletContext.getAttribute("key")
(5) cookie:cookie // ${ cookie.cookieKey.value } 获取cookie指定Key对应的值
(6) 页面对象:pageContext // 可取 request, response, servletContext等对象
(7) 应用上下文参数:initParam // ${ initParam.key } 获取servletContet 的指定key对应的值
(8) 请求参数:param // ${param.xx} 相当于request.getParameter("xx")
(9) 请求参数数组:paramValues // ${paramValues.xx[0]} 相当于req.getParameterValues("xx")[0]
(10) 请求头:header?// 获取请求头信息
(11) 请求头数组:headerValues?// 获取请求头信息
(1) 取String:${作用域key} // ${name} = request.getAttribute("name")
(2) 取List :${作用域key[下标]} // ${list[0]} = ((List)request.getAttribute("list")).get(0)
(3) 取Map:${作用域key.mapKey}?| ${作用域key["mapKey"]}?// ${maps.key2} | ${maps["key3"]}
(4) 取对象:${作用域key.对象属性}?| ${作用域key["对象属性"]}?// ${user.name}?${user["age"]}
注释:对象与map的key的单双引号效果一样。el表达式无属性访问,不抛出异常,返回空字符串。el可访问嵌套属性 ${a.b.c} // jsp:useBean无法实现。
加 + : ${6 + (-2)}
减 - :${6 - 1},
乘 *:${2 * 3},
除 / :${4/2}??// = 2
余 % 或 mod:${20%6}? ${20 mod 6} // = 2
等于:${3 == 5} ${ 3 eq 5}
不等于:${3 != 5} ${a ne b} // ne不能比较数字
大于:${ 3 > 5} ?${3 gt 5}
小于:${ 3 < 5} ?${ 3 lt 5}
大于等于:${3 >= 5} ${ 3 ge 5}
小于等于:${3 <= 5} ${ 3 le 5 }
注释:两个字符串值相等判断,返回true
(1) 与:&& , and? //?${ (9>=4)&&(3<2) }?${ (9>=4)and(3<2) }?
(2) 或:|| , or? //?${ (9>=4)||(3<2) }?${ (9>=4)or(3<2) }?
(3) 非:!? , not? // ${ ! (5>=6) }?${ not (5>=6) }? 非后面表达式必须加括号
(4)?三元运算:表达式 ? 满足值 : 不满足值? // ${ 5*5>2 ? 1 : 0}, ${2+5=3 ? "xx" : "yy"}
(1) 为空:${empty param0}?
(2) 非空:${!empty param0}
注释:可?判空字符串,空数组,空集合,空map,null
使用核心标签需要先下载jar包?
(1) JAR下载地址:https://tomcat.apache.org/taglibs/standard/
(2) JSP配置: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
(1) c:if :<c:if test="表达式" var="作用域key" scope="作用域"> // <c:if test="${!empty name1}" var="key" scope="request"> ${key} </c:if> 如果name1不为空 将表达式结果 以var定义的key存在request作用域中,输出if标签内的内容。作用域(page默认,request,session.application)
(2) c:choose:<c:choose> <c:when test="${el}">内容</c:when><c:otherwise>内容</c:otherwise> </c:choose>? // choose没有属性,when可定义多个满足则输出内容,都不满足输出otherwise内容
(1) 固定循环:<c:forEach begin="0" end="5" step="1" var="i">${i}</c:forEach> // 循环输出0到5,每次递增1
(2) list循环:
<c:forEach items="${存list的作用域key}" var="item" varStatus="con">
? ${item} // 取对象
? ${con.index} // 取下标
? ${con.count} // 取总数
? ${con.first} // 返回当前对象是否为第一个的boolean类型
? ${con.last} // 返回当前对象是否为最后一个对象
</c:forEach>
(3) map循环:
<c:forEach items="${存map的作用域key}" var="item" >
? ${item.key} // 取map的key
? ${item.value} // 取map的value
</c:forEach>
(4) 对象循环:
<c:forEach items="${存object的作用域key}" var="item" >
? ${item.name} // 取对象的name属性值
</c:forEach>
(1) 设置作用域:<c:set var="作用域key" value="值" [scope="作用域"] /> // 将值以指定的key存在作用域中,作为新规或修改处理
(2) 设置作用域:?<c:set var="作用域key" [scope="作用域"]>值</c:set>?// 将值以指定的key存在作用域中,作为新规或修改处理
(3) 设置作用域Map:<c:set target="${作用域key}" property="map的key" value="值" /> // 需要有作用域的map对象才能设置,作为改值处理
(3) 设置作用域Map:<c:set target="${作用域key}" property="map的key">值</c:set>// 需要有作用域的map对象才能设置,作为改值处理
(1) 删除:<c:remove var="作用域Key" scope="作用域" />?// 删除作用域下指定的key
(2) 输出:<c:out value="${作用域key}" /> // 输出指定的作用域的Key对应的值
(3) 异常处理:<c:catch> 用来处理产生错误的异常状况,并且将错误信息储存起来
(4) 导入:<c:import> // 导入一个绝对或相对url,到页面
(5) 分割内容:<c:forTokens> // 根据指定的分隔符来分隔内容并迭代输出
(6) 参数:<c:param> // 用来给包含或重定向的页面传递参数
(7) 重定向:<c:redirect > // 重定向至一个新的URL.<c:redirect url="xx"> <c:param name="xx" value="xx"></c:param> </c:..>
内置对象可以在JSP脚本<% 内置对象 %>,JSP表达式<%= 内置对象?%>中直接使用?
页面域对象:参照四大作用域。
请求域对象:同HttpServletRequest一样使用,参照四大作用域。
响应对象:同HttpServletResponse一样使用
会话域对象:同HttpSession一样使用,参照四大作用域。
指令<%@ page session="false" %>使页面session不可用,默认为true
应用域对象:同ServletContext一样使用,参照四大作用域。
输出流:可直接在JSP对应的位置输出内容
(1) append:<% out.append("xxx"); %> //?添加内容到输出流
(2) flush:<% out.flush(); %> //?将缓存数据刷到页面,page指令autoFlush可设置是否自动刷新
(3) clear:<% out.clear(); %> // 清空缓存区数据
(4) close:<% out.close(); %> // 关闭输出流,后续输出不继续执行。
(5) print:<% out.print(obj); out.println(obj); %>??// 输出各种类型数据到页面
(6) write:<% out.write("xxx"); %>? // 输出字符类型到页面
配置信息:
(1) 获取应用初始化参数:<% config.getServletContext().getInitParameter("应用参数名") %>
(2) 获取页面初始化参数:<% config.getInitParameter("页面参数名") %> //?需要配置web.xml
page相当于servlet的this,但是没有实际函数,可以通过pageContext对象访问内部信息。
(1) 配置页面的异常处理页面:<%@ page errorPage="xx.jsp" %>
(2) 配置JSP为异常处理页面:<%@ page isErrorPage="true" %>
(3) 获取异常信息:exception.getMessage();
<jsp:include>包含的子页面不能用主页面的变量和方法?
(1) 无参动态包含:
<jsp:include page="xx.jsp" flush="true" /> // 相当于两个类文件,jsp声明可同名。flush页面处理子页面前,刷新主页面缓冲数据,默认值false不刷新。
(2) 传参动态包含(主页面传参):
<% request.setAttribute("param1", "value1"); %>
<jsp:include page="子页面.jsp">
? <jsp:param name="param2" value="value2" />
? <jsp:param name="param3" value="value3" />
</jsp:include>
注释:<jsp:param>可以在<jsp:include><jsp:forward><jsp:params>块之间使用。?
(3) 传参动态包含(子页面接参):
<% request.getParameter("主页面param的name"); %> // 获取param参数,子页面用完清空
<% request.getAttribute("作用域key") %> // 获取请求域的值
<jsp:forward>跳转到目标JSP或SERVLET处理请求和响应。不输出主页面的内容,不再返回主JSP处理。
(1) 无参JSP请求转发:
<jsp:forward page="xx.jsp"/> // 直接跳转,不输出主页面内容
(2) 传参JSP请求转发(主页面传参):
<% request.setAttribute("param1", "value1"); %>
<jsp:forward page="xx.jsp"/>
? <jsp:param name="param2" value="value2" />
? <jsp:param name="param3" value="value3" />
</jsp:forward>
(3) 传参JSP请求转发(子页面接参):
<% request.getParameter("主页面param的name"); %> // 获取param参数,子页面用完清空
<% request.getAttribute("作用域key") %> // 获取请求域的值
<jsp:useBean>创建或者取得已有的一个JavaBean变量到JSP页。
(1) 创建useBean:
<jsp:useBean id="作用域key" class="包名.类名" scope="作用域" /> // 相当于request.setAttribute("key", 类) <jsp:useBean id="user" class="bean.User" scope="request" />?
id:相当于java变量名,可在jsp表达式,jsp脚本中使用(为必须项目)
class:指定创建bean的对象java类型
scope:page(默认),request,session(需指定page指令session不为false),application
(2) 创建useBean同时设置初始值:
<jsp:useBean id="作用域key" class="包名.类名" scope="作用域" >
? <jsp:setProperty name="作用域key" property="对象属性名" value="值" />
</jsp:useBean>
(3) 修改useBean(固定值):
<jsp:setProperty name="作用域key" property="对象属性变量名" value="值" /> // 相当于(request.getAttribute("key")).set属性("值");?value:可以是string 或?<%=表达式%>"
(4) 修改useBean(参数):
<jsp:setProperty name="作用域key" property="对象属性变量名" param="参数名" /> // 相当于(request.getAttribute("key")).set属性(request.getParameter(参数名));参数名与对象属性同名可省略param属性
(5) 修改useBean(全属性):
<jsp:setProperty name="作用域key" property="*" /> //?所有属性默认赋req.getParameter的值
(6) 获取useBean:
<jsp:getProperty name="作用域key" property="对象属性变量名" /> // 相当于 (request.getAttribute("key")).get属性() 并将内容输出到页面
标签前缀=>Jsp的prefix=>uri=>xml的uri=>xml的location=>tld配置文件=>标签名=>类。
(1) 实现SimpleTag接口:implements SimpleTag
(2) 实现接口方法:doTag,getParent,setJspBody,setJspContext,setParent
(3) 自定义标签属性:定义全局变量,添加get,set方法。
(1) 继承SimpleTagSupport:extends SimpleTagSupport
(2) 实现方法:doTag
(3) 自定义标签属性:定义全局变量,添加get,set方法。
(1) 继承TagSupport:extends TagSupport
(2) 实现方法:doStartTag,?doEndTag(可选)
注释:doStartTag返回值:tag.skip_body 不显示标签内的内容,tag.eval_body_include 显示。
注释:doEndTag 返回值:tag.skip_page 停止执行,tag.eval_page 正常继续执行
(3) 自定义标签属性:定义全局变量,添加get,set方法。
(1) 标签库版本:tlib-version
(2) JSP版本:jsp-version
(3) 标签库名称:short-name
(4) URI:uri
(1) 无属性标签配置:
name:标签名字 // jsp引用时使用
tag-class:处理类?// 包名.类名
body-content:标签体 // <xx>标签体</xx> empty为空主体有内容出错,scriptless不包含jsp声明脚本表达式,可含html el jsp动作 自定义标签。tagdependent 不执行标签体,给处理类处理,一般不会用到。
(2) 有属性标签配置:
attribute:配置标签属性
name:标签属性名称
required:是否为必须属性 // true 必须, false 非必须(默认)
(1) 文件路径引入:<%@ taglib uri="/WEB-INF/taglib/diytaglib.tld" prefix="自定义前缀" %>
(2) web.xml配置别名引入:<%@ taglib uri="/taglib-uri的别名" prefix="自定义前缀" %>
(3) JSP使用自定义标签:<前缀:标签名/> 或 <前缀:标签名></前缀:标签名>
?