//jsp文件就是一个Servlet,用于做页面展示的Servlet,只是该类的编译与运行都是由服务器执行,而它所有的功能,指令,动作,EL等,都是对java功能的包装,让在jsp中实现java功能时更方便,也简化了命令,比如在网页上要输出东西,得先out=response.getWriter(),获得输出对象,然后再输出,现在一个EL表达式${}就解决了,但其底层依旧是java代码
一、执行原理
//以.jsp结尾的文件就是一个java文件,是一个servlet。比如:index.jsp文件被访问后,会被服务器内置的一个jsp翻译引擎翻译为index_jsp.java文件,然后在编译生成index_jsp.class文件,并执行
//而index_jsp.java这个类继承HttpJsBase类,而HttpjsBase类又继承HttpServlet,
//所以访问.jsp文件就是执行翻译之后的service()方法
//修改JSP文件之后,不需要重新部署,也不需要重启服务器,只需刷新一下浏览器页面即可(暂时没设置成功)
//JSP就是专注于做页面展示的Servlet
二、JSP语法
-
//注释
<%--
......
--%>
//注释是不会被翻译到java源文件中的
-
//小脚本
<%
java语句;
......
%>
//小脚本中的语句是被翻译到Servlet的service()方法中执行的的;java语句必须以“;”结尾
//当有多个小脚本语句时,也是由上而下依次执行
-
//声明语法
<%!
实例变量;
静态变量;
方法;
静态代码块;
构造方法;
......
%>
//声明块中的java程序会被翻译到service()方法之外,该Servlet类之中
-
//表达式语法
<%
String username="zs"
%>
?
<%
out.print("登录成功,欢迎" + username + "回来")
%>
?
<br>
?
登录成功,欢迎<%=username%>回来 //表达式语法
//两种输出结果是等价的,后一种就是表达式语法,还可以用在标签中也行,比如:<%int i=2%>,在标题标签中:<h<%=i%>>大标题</h<%=i%>>
三、指令
//指令的作用是指导JSP的翻译引擎如何翻译JSP代码
//指令语法格式
<%
page指令常用属性
-
//contentType
<%
//contentType指定的是响应时使用的编码,即对应response.setConteType()方法的参数值! Tomcat都会把响应正文转换成UTF-8编译,然后发送给我客户端,并且会在响应头中设置Content-Type头信息为text/html;charset=utf-8,这样浏览器就知道使用服务器发送过来的正文使用了什么编码。
-
//pageEncoding
<%
//无论是page指令的pageEncoding还是contentType,它们的默认值都是ISO-8859-1,我们知道ISO-8859-1是无法显示中文的,所以JSP页面中存在中文的话,一定要设置这两个属性。
//处理乱码的方案:
-
把JSP页面的编码设置为UTF-8;
-
把contentType和pageEncoding都设置为UTF-8。
-
//import
<%
//导入包的
-
//session
<%
//当session="true"时,程序会获取当前session对象,获取不到就新建一个session对象(默认)
//当session="false"时,表示当前jsp不能直接使用内置对象session,程序会获取当前session对象,获取不到返回null
-
//errorPage
<%
//当当前JSP页面出错后,跳转到指定页面
-
//isErrorPage
<%
//出错之后,在跳转的页面添加isErrorPage="true“,表示该页面可以直接使用内置对象exception,使用其打印异常信息
-
//isELIgnored
<%
//是否忽略EL表达式
includ指令
//file属性
index1.jsp
<%
//使index1_jsp包含index2_jsp,这两个jsp文件合在一起,底层只生成一个java源文件和一个class字节码文件,即在同一个service()方法中,它们的局部变量也是共享的,将这种关系称为静态联编
taglib指令
//导入其他标签库
四、动作
//动作语法格式
<jsp:动作名 属性名=属性值 属性名=属性值 ......></jsp:动作名>
forward动作
index1.jsp
<jsp: forward page="/index2.jsp" %>
//就是Servlet中的forward方法,在jsp文件中分表达,一次请求
include动作
a.jsp
<jsp: forward page="/b.jsp" %>
//a.jsp包含b.jsp,底层会生成2个java源文件,两个字节码文件;即生成2个Servlet,有两个独立的service()方法,他们的局部变量是不共享的,这种关系称为动态联编;当两个jsp文件有重名变量时,只能使用这种方式,其余都可以使用静态联编
//在网页上输入a.jsp,网页显示b.jsp的内容之后,网址依然是a.jsp,还是一次请求。相当于a中的service方法去调用b中的service方法
bean动作
五、JSP中的内置对象
内置对象 | 类型 |
---|---|
pageContext | javax.servlet.jsp.PageContext |
request | javax.servlet.http.HttpServletRequest |
response | javax.servlet.http.HttpServletResponse |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServletContext |
config | javax.servlet.ServletConfig |
out | javax.servlet.jsp.JspWriter |
page | java.lang.Object |
exception | java.lang.Throwable |
四个范围对象
pageContext: 只在一个页面中保存属性。 跳转之后无效。
request: 只在一次请求中有效,服务器跳转之后有效。 客户端跳无效
session: z在一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效
application: 在整个服务器上保存,所有用户都可使用。 重启服务器后无效
//注意:如果设置过多的application属性范围会影响服务器性能。
通过page对象可访问其他对象
pageContext.getRequest()
pageContext.getSession()
pageContext.getServletContext()
pageContext.getServletConfig()
六、EL表达式
//El表达式只能从四大域中获取数据,所以其他数据要想在EL表达式中获得,必须先通过setAttribute()方法存进四大域中
//语法
${表达式}
获取数据
//EL获取数据时不会报空指针,下标越界等异常,即使出现了也不会报,只是不显示表示的结果而已
//从四大域中获取数据
session.setAttribute("u",200)
pageContext.setAttribute("u",100)
u=${u} //100
?
u=${sessionScope.u} //200 在指定域中获取数据
//EL表达式查找数据的顺序是:由从小到大的顺序依次从四大域中查找,找到了就不会接着再找了。(application是最后找的)
//通过以下4个内置对象在指定的域空间中找查找:
pageScope,requestScope, sessionScope, applicationScope
//从符合javabean规范的类中获取数据
<%
//从数组中获取数据
<%
Student[] students=new Student[2];
students[0]=new Student("ls",21);
students[1]=new Student("ww",28);
pageContext.setAttribute("ss",students);
%>
students[1].name=${ss[1].name} //students[1].name=ww
//从List集合中获取数据
<%
//从Map集合中获取数据
<%
运算符
操作符 | 描述 |
---|---|
. | 访问一个Bean属性或者一个映射条目 |
[] | 访问一个数组或者链表的元素 |
+ | 加(注意:这里的加号不能进行字符串的拼接) |
- | 减或负 (EL不支持++和--) |
* | 乘 |
/ or div | 除 |
% or mod | 取模 |
== or eq | 测试是否相等 |
!= or ne | 测试是否不等 |
< or lt | 测试是否小于 |
> or gt | 测试是否大于 |
<= or le | 测试是否小于等于 |
>= or ge | 测试是否大于等于 |
&& or and | 测试逻辑与 |
|| or or | 测试逻辑或 |
! or not | 测试取反 |
? : | 三元运算符 |
//empty运算符:用法:${empty 变量} 结果为布尔值
//若变量未定义,返回值为true
//若变量为String类型,且其值为空串,返回值为true
//若变量为引用类型,其值为null,返回值为true
//若变量为集合类型,且其不包含任何元素,返回值为true
EL中的内置对象
-
//pageContext
${pageContext.request}
//此pageContext与jsp中的内置对象pageContext是同一个,但request,response,session,application等都不是EL的内置对象,只能通过pageContext对象以以上方式获得
-
//获取当前项目发布到服务器的名称(即myweb)
${pageContext.request.contextPath}
//通过pageContext获取request对象
-
//获取表单中value值
${param.name} //获取属性名为name的value值,value值只有一个时
${paramValues.h} //获得属性名为h的value值得一维数组
//以上两个内置对象底层分别调用了:request.getParameter()和request.getParameterValues()方法
-
//获取Context范围的初始化属性值
${initParam.name} //获取属性名为name的的属性值
//底层调用java中的:servletContext.getInitParameter()
七、JSTL标准标签库
核心标签库
导入核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
1.set标签
//作用1:将变量存到指定域中
<%
//var:变量名; varlue:变量值; scope:域属性,取值有page(默认),request,session,application
//作用2:为javaBean规范的类属性赋值
<%
//value:属性值; property:指定对象的指定属性;target:指定目标对象
//作用3:给Map赋值
<%
//property:key值;target:指定目标集合
2.remove标签
//删除指定域中的属性
<%
//若不指定某个域,则删除所有域中的同名属性
3.catch标签
//捕捉标签体重中的异常,并将其赋给其属性
<%
//若标签体替换成{% 3/0 %},就没有异常,因为3/0=Infinity(无穷大),有值的,所以不会报异常
4.out标签
//default属性
<%
//只有使用没定义的变量,才会显示default的值,若value=“”(空串),他也不会显示default的值
//escapeXml属性
<%
//escapeXml="false" : 是否忽视xml标签,默认值为true
5.if标签
<%
//判断语句返回true,执行标签体中的内容;返回false,结束该if
6.choose标签
<%
//判断语句1返回true,执行标签体1,执行之后结束choose;若判断语句1返回false,则执行判断语句2,......,若所有判断语句都返回false,则执行otherwise中的的标签体
7.forEach标签
//基本用法
<%
//begin,end:起始下标和终点下标都是闭环;step:间隔范围
//高级用法
<%
//ss.count:输出序号;ss.first:判断是否为集合的第一个元素,是返回true,反之false;
//ss.index:输出下标,从0开始;ss.last:判断是否为集合的最后一个元素,是返回true,反之false;
1.formatDate标签
<%
//在后面加var属性之后,内容会被保存在变量中,无法直接输出,必须以${变量名}的方式输出
2.pareseDate标签
3.formatNumber标签
4.parseNumber标签