JavaServerPages: Java服务器页面 ,是一个一种动态网页技术,既可以定义HTML页面,又可以定义Java代码;简化了Servlet中Responce :: getWriter().write(),便于书写展示页面。
JSP运行时自动创建了一个继承自HttpServlet的类,本质上是一个Servlet类。
//
<!-- -->
<%-- --%>
<% %>
局部代码块
定义的java代码在service()方法中 ,service方法中可以定义什么,该脚本中就可以定义什么
<%! %>
全局代码块
定义的java代码在转换后的java类的成员位置 ,用于定义成员方法、成员变量(由于多线程安全问题不建议定义)、静态代码块…
<%= %>
脚本调用方式
out.print(代码 );
定义的java代码在service()方法的输出语句中 ,会输出到页面上,输出语句中可以定义什么,该脚本中就可以定义什么(可以放有返回值的方法)
用于配置JSP页面,或导入资源文件,不同属性空格隔开
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
contentType : 等效于Response :: serContentType(); 设置响应体的MIME类型与字符集
<%@ page contentType="text/html,charset=GBK"%>
language :JSP页面要被转义成的语言,现在只支持Java
session : JSP页面中是否有session对象,默认为true
import :导包
<%@ page import="java.util.*"%>
errorPage : 指定当前页面出现异常后跳转的页面
<%@ page errorPage="error.jap"%>
isErrorPage : 赋值为[true] 标记标记当前JSP页面为错误页面,可以使用 exception 内置对象
isELIgnored :赋值为[true]时忽略整个JSP页面的EL表达式
导入页面的资源文件,如多个页面同时使用某一页面时
静态导入
<%@include file="相对位置"%>
被导入的页面不会被转换为新的Servlet文件,而是与当前页面直接合并;
运行效率高,但两个页面会耦合到一起,不利于维护;还会有命名重复的问题
动态导入
<jsp:include file="相对位置"></jsp:include>
被导入的页面被转换为新的Servlet文件,与当前页面解耦
导入资源,如标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix:自定义的前缀名,使用标签库时用<前缀名:>
实现JSP页面的请求转发
<jsp:forword page="相对位置"> <jsp:param name="key" value="value"> </jsp:param> </jap:forword>
注: forward标签中间除了parame标签外不能添加任何字符;
转发到的页面中通过Object << Request :: getParameter(String name)
方法获取属性键值对
在JSP页面中不需要创建,可以直接使用的对象,JSP页面转换为Servlet后已经被声明并初始化,在JSP中使用时调用的是变量名。不能在全局代码块中使用。
pageContext类 ,(域对象)【在当前页面共享数据】。表示页面上下文的对象,它封装了当前页面的运行信息,也封装了其他8个内置对象,可以通过pageContext :: getXxx()
方法获取。
生命周期与当前页面同步,随着页面的关闭而消亡。
HttpServletRequest 类 ,(域对象)【在一次请求访问的多个资源间共享数据】(请求转发)。由tomcat创建,一个请求对应一个request对象。
ServletContext 类 ,(域对象)【所有用户间共享数据】。一个web项目只有一个application对象。
生命周期与服务器同步,伴随着服务器的关闭而消亡。
HttpSession 类 ,(域对象)【在一次会话的多个请求间共享数据】。一次会话对应一个session对象。
HttpServletResponse 类 ,响应请求数据,将处理结果返回给浏览器、重定向
Object 类 ,代表当前Servlet类的对象,相当于this
JspWriter 类 ,带有缓冲区的字符输出流对象。可以将数据输出到页面上,效率高于Response ::getWriter().write()
在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据
response.getWriter()数据输出永远在out.write()之前
ServletConfig 类 ,Servlet的配置对象,可以用来获取web.xml中的配置数据
Throwable 类 ,异常对象,存储当前运行的异常信息。必须在page指令中标记当前页面为异常页面才会有
相对于当前资源的路径。使用后,目标路径不能随便更改;使用[…/]方式退出目录时,如果位置比较深操作麻烦
在请求路径前加上[/]表示当前服务器的根路径,使用时需添加[/虚拟项目名/资源目录]
/Login/a/login_check
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName() +":"+request.getServerPort()+path+"/"; %> ----------------------------- <head> <base href="<%=basePath>"> </head>
添加资源路径时,从当前项目的web目录下添加即可
/Login/a/login_check >> a/login_check
ExpressionLanguage 表达式语言 ,用于简化JSP页面中获取作用域和请求数据的代码编写。使用EL表达式后JSP页面不用再导包或进行类型强制转换,使层次结构清晰。
JSP默认支持EL表达式语言。
语法:${expression}
忽略JSP页面的表达式:
\${expression}
,来忽略一条特定的EL表达式,相当于将[$]字符进行了转义算数运算符:
+ 、-、 *、 /、div、 %、mod
【+】只表示数值运算相加,不表示字符串拼接
&{1+“1”} == 2
比较运算符:
> 、<、 >=、 <=、 ==、 !=
逻辑运算符:
&&、and、 ||、or、 !、not
空运算符:
empty :用于判断字符串、集合、数组对象是否为null或者长度是否为0,返回Boolean类型
- ${empty list}:判断list集合是否为null或者长度为0
- ${not empty str}:判断字符串str是否不为null 并且 长度>0
EL表达式只能从域对象中获取值,没有获取到值时返回空字符串。
${域名称.键名}
:从指定的域对象中获取键的值
${键名}
:由作用域最小的域对象开始,依次查找键的值
域对象由小到大的域名称:
获取对象的属性: ${域名称.键名.属性名}
获取List集合的值: ${域名称.键名[索引]}
获取Map集合的值: ${域名称.键名.key名称}
或: ${域名称.键名["key名称"]}
获取用户请求数据: ${parame.键名}
未获取到值时返回null
获取请求头数据: Map<String,String> << ${header}
请求头的所有键值对映射
Map<String,String[ ]> << ${headerValues["accept-language"]}
请求头某一键对应的多个值
String << ${header["host"]}
请求头某一键的值
获取Cookie数据:
String << ${cookie.JSESSIONID. name}
String << ${cookie.JSESSIONID. value}
EL共有11个隐式对象, pageContext 获取jsp其他八个内置对象
${pageContext.request.contextPath}:动态获取虚拟目录
JavaServerPagesTagLibrary JSP标准标签库 ,由Apache开源组织提供,用于扩展EL表达式。
JSTL是标签语言,但不是JSP内置的,使用时需要导包并指定标签库。
将内容输出到页面上
<c:out value="PrintByJSTL" default="Default"></c:out >
value:要输出的内容;default:默认输出的内容
向四个域对象中赋值
<c: set var="key" value="value" scope="request"></c: set>
var:属性的键名;value:属性的值;scope:指定域对象,不赋值时默认为pageContext
删除域对象中的值
<c:remove var="key" scpoe="request"></c:remove>
var:属性的键名;scope:指定删除的域对象,不赋值时默认将所有域对象中属性名为"key"的值删除
if语句,if标签没有else,可以定义多个if标签达到目的
<c:if test="${a>5}" var="falg" scope="request">执行</c:if>
test:填写逻辑表达式;var:条件表达式的结果存储变量名;scope:条件表达式的结果变量的作用域
switch语句,多重判断
<c:choose> <c:when test="${age>10}"> 11 </c:when> <c:when test="${age>20}"> 21 </c:when> <c:otherwise> 1 </c:otherwise> </c:choose>
for 语句
循环重复操作
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s"> ${i} ${s.index} ${s.count}<br> </c:forEach>
遍历容器内容
<c:forEach items="${requestScope.list}" var="str" varStatus="s"> ${str} ${s.index} ${s.count}<br> </c:forEach>