1、jsp的执行原理
问题一:JSP中的java代码是如何运行的?
会被服务器直接放到service方法中运行
问题二:out是什么?
是一个字符输出流,功能和Servlet中PrintWriter一致,该out是service方法中定义好的变量名
问题
3
:除了
out
,还有什么东西可以直接用?
只要是
service
方法中定义的变量,在
jsp
中都可以直接使 用(JSP
的隐式对象)
要想明确以上问题,首先必须知道
JSP
的执行过程。
1
、
Tomcat
服务器会将
JSP
页面
翻译
成一个
java
源代码类。(在
Tomcat
的
work
工作目录中)
2
、
Tomcat
服务器会利用
JDK
将这个类进行编译成
class
文件。
3
、
Tomcat
加载这个
class
文件并运行,输出结果。
结论:
JSP
实质上就是一个
Servlet
小程序。
2、jsp页面中的java代码
1、脚本:<%java脚本%>
2、表达式:<%=表达式%>,输出变量的值到页面上,相当于:out.print();
3、声明:<%! public void m1(){} %>,定义成员(类的)内容
4、注释:<%--这是注释--%>,告诉服务器,不要翻译注释中的内容,与html的区别是,在<!--<%%>-->中代码会执行,但是显示时会被注释
jsp小练习
查看java代码:output第一行地址,打开,work->一直继续,打开java源文件
jsp指令
JSP
的指令语法:
<%@
指令名称 属性
1="
值
1"
属性
2="
值
2" ...%>
作用:指令给服务器翻译
JSP
时使用的。因此书写位置可以在
JSP
中的任意位置,一般放在页面的头部。
JSP
中有三大指令:分别是
page
、
include
、
taglib
指令。
1、page:明确告诉服务器该如何翻译此页面,绝大部分属性都使用默认值。
contentType:
告诉服务器(
JSP
引擎)当前页面的
MIME
数据类型及编码。相当于response.setContentType("text/html;charset=GBK");
session:
默认值是
true
。是否获取
HttpSession
对象,即当前页面是否支持会话。
import
:导入当前页面用到的
java
包或类。
isELIgnored
:默认值是
false
。如果为
true
,表示忽略
EL
表达式,即将
EL
表达式当作普通文本对待。
2、include:包含其他页面,<%@include file="header.jsp"%>
3、taglib:引入外部的标签库
jsp九大隐式对象:
在jsp中的java脚本中可以直接使用的变量名称(表示一个对象),就是jsp九大隐式对象。
pageContext,类型:pageContext,是jsp的API中最为核心的类
四大域对象
![](https://i-blog.csdnimg.cn/blog_migrate/a27799e1e0e9e5f065786c633c94875c.png)
jsp中pageContext功能如下:nb
1、它是页面范围域对象。
void setAttribute(String name,Object value)增加,修改:key相同,改value
void removeAttribute(String name)删除
Object getAttribute(String name)获取
2、它能够操作其他三大域对象中的数据
void setAttribute(String name,Object value,int Scope)
void removeAttribute(String name,int Scope)
Object getAttribute(String name,int Scope)
int Scope
:javaeeAPI,返回指定范围中的对象,如果不存在,返回null
PageContext.APPLIICATION_SCOPE(
应用
)
;
PageContext.SESSION_SCOPE(
会话
)
;
PageContext.REQUEST_SCOPE(
请求
)
;
PageContext.PAGE_SCOPE(
页面
)
3、它能够从页面,请求,会话,应用范围(从小到大)中按照顺序进行查找数据(EL表达式的内部原理)
object findAttiibute(String name)
4、能够获取jsp的其他8个隐式对象的引用
pageContext.getXXX方法,比如HttpServletRequest pageContext.getRequest()
EL表达式
简介:
EL
表达式就是为了替换
JSP
中的
java
表达式(
<%=%>
),作用就是将表达式的结果输出到页面
上。语法:${EL表达式}
特别注意:
EL
只能从四大域范围中获取数据,且从最小范围到最大范围依次进行搜索。如果没有找到, 则什么都不会显示
(EL中不会存在空指针异常问题)
。
![](https://i-blog.csdnimg.cn/blog_migrate/a804d72e1f70d6638eb8f69fa5283a8f.png)
EL获取域对象中的数据
前提:数据要先放入四大域对象中
使用点运算符获取对象的属性取值:${stu1.sid}==${stu1.name} ,有局限性eg:User-Agent,必须使用中括号,因为-是非法字符
使用中括号运算符:${stu1["sid"]}=${stu1['name']}
将数据放入四大域对象中,才能用el获取:pageContext.setAttribute("s2",stu2);
<br/>-----------------EL获取数据---------------<br/>
<%
pageContext.setAttribute("stu1",new Student(1,"lili"));
%>
${stu1}<br/>
使用点运算符获取对象的属性取值<br/>
${stu1.sid}==${stu1.name}<br/>
使用中括号运算符<br/>
${stu1["sid"]}=${stu1['name']}
<hr/>
<%
Address addr = new Address("山东省","济南市");
Student stu2 = new Student(2,"lisa");
stu2.setAddress(addr);//给stu2设置地址
pageContext.setAttribute("s2",stu2);//将stu2放到四大域对象的页面范围
%>
${s2.address.provice}
<hr/>
<%
String[] strs = {"a","b","c"};
pageContext.setAttribute("sarr",strs);
%>
${sarr[0]},${sarr[1]},${sarr[2]}<br/>
<hr/>
<%
Map<String,Student> map=new HashMap<>();
map.put("s1",new Student(1,"草莓"));
map.put("s2",new Student(2,"橘子"));
pageContext.setAttribute("m",map);
%>
${m.s1.sid}==${m.s1.name}<br/>
EL执行简单运算
EL中不支持字符串拼接运算。${user==null?"请先登录":"登陆成功,欢迎:"}${user.name}
因为没有user的话后面那个&{}不会执行
算数运算:+ - * / %
逻辑运算:
>(gt) <(lt) >=(ge) <=(le) ==(eq) !=(ne)
布尔运算:
!(not) &&(and) ||(or)
三元运算:
${
布尔结果类型
?
为
true
时执行
:
为
false
时执行
}
empty
运算符:如果一个对象是
空字符串,
null
,没有元素的集合
都是空,即都会返回
true
。
<br/>-----------------EL执行简单运算---------------<br/>
${1+2}<br/>
${1<9}==${1 lt 9}<br/>
${1<9&&2<9}==${1 lt 9 and 2 lt 9}<br/>
<%
pageContext.setAttribute("user",new Student(5,"苹果"));
%>
${user==null?"请先登录":"登陆成功,欢迎:"}${user.name}<br/>
<hr/>
<%
pageContext.setAttribute("s18","");
List l = new ArrayList();
l.add("香蕉");
pageContext.setAttribute("l",l);
%>
${empty user18}<br/>
${empty s18}<br/>
${empty l}<br/>
EL的隐式对象
![](https://i-blog.csdnimg.cn/blog_migrate/ecd40be564128bd429ca86a999bc80a5.png)
获取当前应用的虚拟路径
![](https://i-blog.csdnimg.cn/blog_migrate/b0fe3d68b319faa927de658267bb675f.png)
<br/>-----------------EL内置对象---------------<br/>
${pageContext.request.contextPath}<br/>
<%
pageContext.setAttribute("p","pp");
request.setAttribute("p","rp");
session.setAttribute("p","sp");
application.setAttribute("p","ap");
%>
${p}<br/>
page:${pageScope.p}<br/>
request:${requestScope.p}只能从请求范围取<br/>
session:${sessionScope.p}<br/>
application:${applicationScope.p}<br/>
JSTL标签库
作用:替换
JSP
中的
java
代码脚本,完成一档的代码逻辑处理。
JSTL
是
JSP Standard Tag Libary
,是由
apache
实现的。要使用
JSTL
先导入
jar
包。
JSTL
由
5
部分组成:
1
、
core
核心部分
(
if标签、foreach标签、choose when otherwise(default)了解=switch、case
)
2
、
fmt
格式化部分
(
formatDate标签
)
3
、
functions
字符串函数
4
、
sql
数据库访问
5
、
xml
操作部分
step1
、导入
jar
包并加入到
classpath
环境变量中
step2
、在
JSP
页面中使用
taglib
指令引入标签库
![](https://i-blog.csdnimg.cn/blog_migrate/be84dd77c29a8d8605fceaf56fe163c5.png)
c:if 有一个test属性,支持布尔运算,如果test返回true,标签的主题内容显示到页面上,否则不显示
<c:if test="${1==1}">
这是主题内容
</c:if>
c:choose
只是作为父标签使用。
when
和
otherwise
配合一起实现
java
中的
switch 的功能
varStatus指定一个变量名,该变量名引用了一个对象。
该对象保存了当前元素的一些属性:是不是第一条、是不是最后一条、索引(从0开始)、计数
(从1开始)