JSP学习笔记(总结)

发布时间:2023年12月20日

简介

jsp生命周期:首次访问jsp,1 转成的servlet源代码,?2 编译,3 加载,4 执行jsp的init方法, 5 执行jsp的service方法, 6 处理完毕执行jsp的distroy方法。

1 基本标签

1.1 基本元素

(1) HTML元素

(2) CSS元素

(3) JS元素

注释:html,css,js代码会原样输出到前端浏览器

1.2 注释

(1) JSP注释:<%-- 注释 --%>? // 只在Jsp文件内可见

(2) Java注释:<% // 注释 |?/* 注释 */?|?/** 注释 */ %> // 与java代码的注释完全一样

(3) Html注释?:<!-- 注释 --> // 会出力到前端浏览器,可以通过右键网页“查看网页源代码”看见

2 JSP脚本

2.1 JSP声明

(1) 声明变量:<%!? int i = 0; ?%> //?相当于类的全局变量,与JSP文件中的位置无关。不能使用request,session等对象。重点:同servlet全局一样,多个session共用一个对象。

(2) 声明函数:<%! public void getTest(){ ... } %>

2.2 JSP脚本

(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元素

2.3 JSP表达式

(1) JSP表达式全局变量:<%=i %>?// 输出声明<%! int i = 0 %>定义的全局变量

(2) JSP表达式局部变量:<%=a %>?// 输出JSP脚本<% int a = 1;%>定义的局部变量

(3) JSP表达式内置对象:<%=request.getAttribute("key") %>?// 输出JSP内置对象的函数返回值

注释:<%= 与变量之间可以有空格

2.4 JSP表达式使用场景?

(1) HTML文本:<div> <%=i %> </div>

(2) HTML属性:<input type="text" value="<%=i %>" />

(3) JSP动作属性:<jsp:include page="<%=i %>"/> /

(4) 自定义标签属性:<c:out value="<%=i %>" />

注释:不可放到指令<%@的属性中。

3 指令

3.1 page指令

(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() %>取到值

注释:多个属性可以空格或换行分割?

3.2 include指令

(1) 静态包含:<%@ include file="xxx.jsp" %> // file以/开头代表应用根目录,不以/开头代表jsp同级目录文件,file不能传参数。子页面声明不能与主页面声明重名,因为相当于是同一个类文件

3.3?taglib指令

(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" %>

4 四大作用域

4.1 pageContext

(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等对象

4.2 request

(1) 获取页面域对象:request.getAttribute("key")

(2) 设置页面域对象:request.setAttribute("key", value)

(3) 删除页面域对象:request.removeAttribute("key", value)

注释:request对象当前请求生效适用于请求转发后的jsp或servlet,适用于页面跳转携带数据到新页面。同servelt的request一样使用。

4.3 session

(1) 获取会话域对象:session.getAttribute("key")

(2) 设置会话域对象:session.setAttribute("key", value)

(3) 删除会话域对象:session.removeAttribute("key", value)

注释:?session在整个会话阶段生效,关闭浏览器或会话超时失效,适用于保留用户登录信息。同servelt的session一样使用。指令<%@ page session="false" %>使页面session不可用,默认为true

4.4 application?

(1) 获取应用域对象:application.getAttribute("key")

(2) 设置应用域对象:application.setAttribute("key", value)

(3) 删除应用域对象:application.removeAttribute("key", value)

注释:?application在整个应用启动阶段生效,服务器停止后失效,适用于保存服务器共有信息。同ServletContext一样使用。

5 EL表达式

jsp2.0加入,用来代替 <% %> 和 <%= %>,若jsp不识别el表达式原文输出,是因为Servlet是3.0关闭了el表达式的识别。

5.1 开启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配置。

5.2 EL使用场景

(1) HTML文本:<div> ${name} </div>

(2) HTML属性:<input type="text" value="${name}" />

(3) JSP动作属性:<jsp:include page="${xxx}"/> // 不用于jsp指令<%@中

(4) 自定义标签属性:<c:out value="${xxx}" />

5.3 隐含变量

四个作用域对象,不指定域名则取最小作用域的值。优先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?// 获取请求头信息

5.4 取值

(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无法实现。

5.5 算术运算符

加 + : ${6 + (-2)}

减 - :${6 - 1},

乘 *:${2 * 3},

除 / :${4/2}??// = 2

余 % 或 mod:${20%6}? ${20 mod 6} // = 2

5.6 比较运算符

等于:${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

5.7 逻辑运算符

(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"}

5.8 判空

(1) 为空:${empty param0}?

(2) 非空:${!empty param0}

注释:可?判空字符串,空数组,空集合,空map,null

6 JSTL(核心标签)

6.1 下载与配置

使用核心标签需要先下载jar包?

(1) JAR下载地址:https://tomcat.apache.org/taglibs/standard/

(2) JSP配置: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

6.2 分歧判断

(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内容

6.3 循环

(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>

6.4 设置值

(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对象才能设置,作为改值处理

6.5 其它

(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:..>

7 JSP内置对象

内置对象可以在JSP脚本<% 内置对象 %>,JSP表达式<%= 内置对象?%>中直接使用?

7.1 pageContext

页面域对象:参照四大作用域。

7.2?request

请求域对象:同HttpServletRequest一样使用,参照四大作用域。

7.3 response

响应对象:同HttpServletResponse一样使用

7.4 session

会话域对象:同HttpSession一样使用,参照四大作用域。

指令<%@ page session="false" %>使页面session不可用,默认为true

7.5 application

应用域对象:同ServletContext一样使用,参照四大作用域。

7.6 out

输出流:可直接在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"); %>? // 输出字符类型到页面

7.7 config?

配置信息:

(1) 获取应用初始化参数:<% config.getServletContext().getInitParameter("应用参数名") %>

(2) 获取页面初始化参数:<% config.getInitParameter("页面参数名") %> //?需要配置web.xml

7.8 page

page相当于servlet的this,但是没有实际函数,可以通过pageContext对象访问内部信息。

7.9 exception

(1) 配置页面的异常处理页面:<%@ page errorPage="xx.jsp" %>

(2) 配置JSP为异常处理页面:<%@ page isErrorPage="true" %>

(3) 获取异常信息:exception.getMessage();

8 JSP动作

8.1 动态包含(include)

<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") %> // 获取请求域的值

8.2 请求转发(forward)

<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") %> // 获取请求域的值

8.3 useBean?

<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属性() 并将内容输出到页面

9 自定义标签

标签前缀=>Jsp的prefix=>uri=>xml的uri=>xml的location=>tld配置文件=>标签名=>类。

9.1 处理类

9.1.1 SimpleTag

(1) 实现SimpleTag接口:implements SimpleTag

(2) 实现接口方法:doTag,getParent,setJspBody,setJspContext,setParent

(3) 自定义标签属性:定义全局变量,添加get,set方法。

9.1.2 SimpleTagSupport

(1) 继承SimpleTagSupport:extends SimpleTagSupport

(2) 实现方法:doTag

(3) 自定义标签属性:定义全局变量,添加get,set方法。

9.1.3 TagSupport

(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方法。

9.2 标签库描述文件

9.2.1 创建标签库文件

(1) 标签库版本:tlib-version

(2) JSP版本:jsp-version

(3) 标签库名称:short-name

(4) URI:uri

9.2.2 自定义标签配置

(1) 无属性标签配置:

name:标签名字 // jsp引用时使用

tag-class:处理类?// 包名.类名

body-content:标签体 // <xx>标签体</xx> empty为空主体有内容出错,scriptless不包含jsp声明脚本表达式,可含html el jsp动作 自定义标签。tagdependent 不执行标签体,给处理类处理,一般不会用到。

(2) 有属性标签配置:

attribute:配置标签属性

name:标签属性名称

required:是否为必须属性 // true 必须, false 非必须(默认)

9.3 JSP引入自定义标签

(1) 文件路径引入:<%@ taglib uri="/WEB-INF/taglib/diytaglib.tld" prefix="自定义前缀" %>

(2) web.xml配置别名引入:<%@ taglib uri="/taglib-uri的别名" prefix="自定义前缀" %>

(3) JSP使用自定义标签:<前缀:标签名/> 或 <前缀:标签名></前缀:标签名>

?

?9.4 执行效果

文章来源:https://blog.csdn.net/m0_65939803/article/details/134937670
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。