1、JSP
1.1原理:
jsp文件可以同时书写Html和Java的代码,但它的本质还是Java
因为在该文件的内容是Html的,那么后台会将每一行代码用响应流拼接字符串,out.write{“html代码”}
如果写入的是Java的代码,需要用<%代码%>的方式,这样就不会被拼接成响应流字符串
1.2脚本:
Jsp内的脚本,在其中写Java代码。
有两种脚本
<%Java代码%> <%= Java代码%>
1.2.1<%Java代码%>
内容就写java代码,就这么简单!!!
1.2.2<%= Java代码%>
是简化输出的形式
<%= 内容 %> 等于 <% out.write(内容) %>
2、指令
JSP指令用于设置当前JSP页面的属性
2.1page
<!--page:设置当前jsp的属性-->
<%@page 属性="值" 属性="值" %>
errorPage : 当前jsp中如果有异常,跳转至该页面
import: 在当前jsp导入其他java包
session: true|false,默认是true,设置当前页面是否可以直接使用session对象,false,就是没有session对象,使用时编译报错
2.2taglib
<!--taglib: 引入jstl标签库-->
<%@ taglib uri="" prefix="前缀" %>
2.3include
<!--include:加入指定文件,达到文件复用-->
<%@ include file="路径">
3、内置对象
内置对象,就是jsp页面中可以直接使用的对象.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HahBXtjs-1662642427259)(D:/%E5%8D%83%E5%B3%B0%E4%B8%8A%E8%AF%BE/Every%20Day%20Stage2/day43/code/day43_jsp.assets/image-20220908144703453.png)]
这九个对象可以在转译后的xxx_jsp.java中找到这些对象
通过pageContext获得其他八个对象
4、四大域[熟悉]
内置对象中有四个可以当做域对象,存取数据,分别是
域 | 解释 | 值的范围 |
---|---|---|
pageContext | 页面域 | 只有当前页面能使用 |
request | 请求域 | 在一次请求转发中有效 |
session | 会话域 | 在一次会话中有效 |
application | 应用域 | 在整个web应用中有效 |
四大域都有相同的取值赋值方法:
- 域对象.setAttribute("key",value);
- 域对象.getAttribute("key");
1、——EL表达式
1.1概念
用于简化取值操作
可在jsp中任何位置调用,引号中也可以!
el{}中可以写 运算符、逻辑运算符、关系运算符、三目运算符
1.2作用
纯jsp取值:
<%=request.getAttribute(“username”) %>又臭又长!!!
而现在EL取值:${username}
1.3取域中的值[重点]
四大域中的值都可以取
${域.key}
${key},如果四大域中key值一样,按照page–>request–>session–>application的顺序依次取值,取到值即停止.
如果四大域中key值一样,也可以指定取出某个域中的值
${域对象.key} --> ${sessionScope.el}
-----------------------------------
<h2>存入四大域值,key=el</h2>
<%
application.setAttribute("el","appValue");
pageContext.setAttribute("el","pageValue");
request.setAttribute("el","reqValue");
session.setAttribute("el","seValue");
%>
<h3>el取值结果:${el}</h3>
<h3>指定取某个域的值: ${sessionScope.el}</h3>
1.4取值[重点]
(字符串、基本类型、对象、数组、集合)
//字符串
request.setAttribute("str","字符串");
${
str}
//基本类型
request.setAttribute("num",100);
${
num}
//对象
request.setAttribute("user",user);
//取对象
${
user}
//取对象的值,通过反射取方法,方法去掉get就是user.~
${
user.username}
//取数组
int[] array = {
11,22,33};
request.setAttribute("array",array);
${
array[0]}
//取集合
Map map = new HashMap();
map.put("aka","阿浩");
map.put("ak47","阿卡司机");
request.setAttribute("map",map);
${
map.get('aka')}
1.5运算符
+ - * / == != > < >= <= && || !
(num > 2 ? '100': 1)
1.6隐式对象
EL表达式内部,可以直接使用的对象.
隐式对象 | 解释 |
---|---|
pageContext | page域 |
pageScope | page域 |
requestScope | 请求域 |
sessionScope | 会话域 |
applicationScope | 应用域 |
cookie | 获得cookie |
2、JSTL
2.1现有问题
- EL主要是用于作用域获得数据,虽然可以运作判断,但是得到的都是一个结果,做展示
- EL不存在流程控制,比如判断
- EL对于集合只能做单点访问,不能实现遍历操作。比如循环
2.2JSTL的作用
可对EL获取到的数据进行逻辑操作。 与EL合作完成数据的展示。
2.3使用步骤
- 项目加入jstl和standard的jar包
- 在需要使用jstl标签的页面,中使用taglib引入库
- 在需要的地方写标签
2.4核心标签的使用
<!--判断标签-->
<c:if test="${num < 1}">
输出
</c:if>
<!--循环标签-->
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
var:变量i
begin:从哪里还是,包含本身
end:从哪里接收,包含本身
step:每次进几,可不写,默认为1
<!--增强循环标签-->
<c:forEach var="user" items="${list}">
<div>${user}</div>
</c:forEach>
var:每次循环集合中得到的对象,可理解成key
items:每次循环得到的对象,可理解为value
相当于用el接收键,获得键对应的值
begin:从哪里还是,包含本身
end:从哪里接收,包含本身
step:每次进几,可不写,默认为1
<c:forEach var=“user” items=" l i s t " > < d i v > {list}"> <div> list"><div>{user}
</c:forEach>
var:每次循环集合中得到的对象,可理解成key
items:每次循环得到的对象,可理解为value
相当于用el接收键,获得键对应的值