jsp指令,九大隐式对象,四大域对象;EL表达式,JSTL标签库

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中最为核心的类

四大域对象

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中不会存在空指针异常问题)

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的隐式对象

获取当前应用的虚拟路径
 
 
<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 指令引入标签库
 
 
c:if 有一个test属性,支持布尔运算,如果test返回true,标签的主题内容显示到页面上,否则不显示
<c:if test="${1==1}">
    这是主题内容
</c:if>
c:choose 只是作为父标签使用。 when otherwise 配合一起实现 java 中的 switch 的功能
 
varStatus指定一个变量名,该变量名引用了一个对象。
该对象保存了当前元素的一些属性:是不是第一条、是不是最后一条、索引(从0开始)、计数
(从1开始)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值