参考资料:韩顺平笔记和黑马程序员,主要以黑马程序员为主,若有错误请批评指正
一、JSP
(1)JSP 基本介绍
1. JSP 全称是 Java Server Pages,Java 的服务器页面
2. JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML
● 相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码, 为用户提供动态数据
● 相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产 生动态 数据的同时,也很容易对数据进行排版。
3. jsp 技术基于 Servlet, 你可以理解成 JSP 就是对 Servlet 的包装.
4. 会使用 JSP 的程序员, 再使用 thymeleaf 是非常容易的事情, 几乎是无缝接轨.
(2)JSP指令
1.page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
2.包含指令
作用:可以包含其他页面
<%@ include file="jsp_YuFa.jsp" %>
3.taglib指令
作用:可以引入外部标签库
(3)JSP 三种常用脚本
jsp的代码也是在<body></body>内写!!
1.声明脚本 <%!声明 java 代码 %>
作用:可以声明该jsp需要属性、方法、静态代码块和内部类
<%!
//这里可以声明该jsp需要属性、方法、静态代码块和内部类
//属性
private String name="milo";
private int age;
private static String company;
//方法
public String getNmae(){
return name;
}
%>
2.表达式脚本 <%=表达式%>
作用:在 jsp 页面上输出数据
<%
String name="milo";
%>
用户名:<%=name%>
工作:<%="java工程师"%>
年龄:<%=request.getParameter("age")%>
3.代码脚本 <%代码%>
作用:可以在 jsp 页面中,编写我们需要的功能(使用 java ),也就是说<% %>包的是java代码
通过代码来解释:
创建一个java程序 Monster类
package qzj;
public class Monster {
private Integer id;
private String name;
private String skill;
public Monster(Integer id, String name, String skill) {
this.id = id;
this.name = name;
this.skill = skill;
}
public Monster() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
创建一个jsp:
<%@ page import="java.util.ArrayList" %>
<%
// 创建ArrayList两个对象
ArrayList<Monster> monsterlist = new ArrayList<>();
monsterlist.add(new Monster(1,"milo","sock"));
monsterlist.add(new Monster(2,"lucy","pite"));
%>
<table bgcolor="#4169e1" border="1px" width="300px">
<tr>
<th>id</th>
<th>name</th>
<th>skill</th>
</tr>
<%
for (int i = 0; i < monsterlist.size(); i++) {
//先取出monster对象
Monster monster = monsterlist.get(i);
%>
<tr>
<td><%=monster.getId()%></td>
<td><%=monster.getName()%></td>
<td><%=monster.getSkill()%></td>
</tr>
<%
}
%>
注意:
1.<%! 声明的是成员变量 %>
2.<% 声明的是局部变量 %>
3.声明方法要使用前者
(4)内置对象
1. out向客户端输出数据,out.println(""); | 6. pageContext jsp页面的上下文,是一个域对象,可以setAttribue(),作用范围只是本页面 |
2. request客户端的http请求 | 7. exception异常对象, getMessage() |
3. response响应对象 | 8. page代表jsp这个实例本身 |
4. session会话对象 | 9. config对应ServletConfig |
5. application对应ServletContext |
(5)四大域对象(黑马视频课没有代码演示,之后回顾韩顺平视频课会补充)
1. pageContext (域对象,存放的数据只能在当前页面使用)
2. request (域对象,存放的数据在一次 request 请求有效)
3. session(域对象,存放的数据在一次会话有效)
4. application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大)
(6)请求转发标签
<jsp:forward page=" xxx.jsp"></jsp:forward> 是请求转发标签, 它的功能就是请求转发 。 page 属性设置请求转发的路径
二、EL表达式
介绍一下pageContext.setAttribute("a",b)
:是Java的JSP或Servlet API中的一个方法调用,用于将一个对象b绑定到一个名为"a"的属性上,并将其存储在pageContext
对象中。
(1)快速入门
通过代码来演示3种方式获取数据:
EL 表达式基本语法: ${key1}, 你可以理解就是一个语法糖,比jsp代码更简洁
(2)EL表达式获取不同类型的数据
1.获取基本数据类型
<%pageContext.setAttribute("num",10);%>
基本数据类型:${num} <br>
2.获取自定义对象类型
Student类是我自己自定义的一个类
<%
Student stu = new Student("球球",23);
pageContext.setAttribute("stu",stu);
%>
自定义对象:${stu}<br><br>
学生姓名:${stu.name}<br>
学生年龄:${stu.age}<br>
3.获取数组类型
<%
String[] arr={"hello","word"};
pageContext.setAttribute("arr",arr);
%>
获取数组:${arr} <br>
获取具体数组元素:${arr[0]} <br>
获取具体数组元素:${arr[1]}<br>
8索引元素:${arr[8]}<br>
0索引拼接1索引元素:${arr[0]}+${arr[1]}<br>
4.获取list集合类型
<%
List list=new ArrayList<>();
list.add(10);
list.add("milo");
pageContext.setAttribute("list",list);
%>
获取list集合:${list}<br>
获取list0集合:${list[0]}<br>
5.获取map集合类型
<%
Map<String,Student> map=new HashMap<>();
map.put("hm01",new Student("amy",10));
map.put("hm02",new Student("kimi",30));
pageContext.setAttribute("map",map);
%>
获取map集合:${map}<br>
第一个学生对象:${map.hm01}<br>
第二个学生对象:${map.hm02}<br>
第一个学生对象的姓名:${map.hm01.name}<br>
第一个学生对象的年龄:${map.hm01.age}<br>
6.获取空值数据
<%pageContext.setAttribute("a",null);%>
空值的数据:${a}<br>
7.EL表达式运算
<%--empty 如果为空,返回 true,否则返回 false--%>
<%
String str1=null;
String str2="";
int[] arr={};
%>
${empty str1}<br>
${empty str2}<br>
${empty arr}<br>
<%--三元运算符 获取性别的数据,在对应的按钮上勾选--%>
<%
pageContext.setAttribute("gender","women");
%>
<input type="radio" name="gender" value="men" ${gender=="men"?"checked":""}>男
<input type="radio" name="gender" value="women" ${gender=="women"?"checked":""}>女
(3)EL细节
<%--获取四大域对象数据--%>
<%
pageContext.setAttribute("use1","kiki");
request.setAttribute("use2","lulu");
session.setAttribute("use3","mimi");
application.setAttribute("use4","lala");
%>
${use1}
${use2}
${use3}
${use4}<br>
<%--隐式对象--%>
<%--1.获取虚拟目录名称--%>
<%=request.getContextPath()%> <br>
${pageContext.request.contextPath}<br>
(4)EL隐式对象
懒得打字惹看代码吧:
<%--pageContext对象 可以获取其他三个域对象和jsp中八个隐式对象--%>
${pageContext.request.contextPath}<br>
<%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%>
<%
request.setAttribute("use","milo");
%>
${use}<br>
${requestScope.use}<br>
<%--header headerValues 获取请求头数据---%>
${header["connection"]}<br>
${headerValues["connection"][0]}<br>
<%--param paramValues 获取请求参效数据---%>
${param.usename}<br>
${paramValues.hobby[0]}<br>
${paramValues.hobby[1]}<br>
<%--initParam 获取全局配置的参数---%>
${initParam["pname"]}<br>
<%--cookie 获取cookie信息---%>
${cookie}<br> <%--{Idea-2cfcf34f=jakarta.servlet.http.Cookie@171fed44, JSESSIONID=jakarta.servlet.http.Cookie@24a43aee}--%>
${cookie.JSESSIONID}<br> <%--jakarta.servlet.http.Cookie@24a43aee}--%>
${cookie.JSESSIONID.name}<br> <%--JSESSIONID--%>
${cookie.JSESSIONID.value}<br> <%--E07D133B96FBFEBDB32E268963E55760--%>
三、JSTL笔记
(1)JSTL 标签库介绍
1. JSTL 标签库 是指 JSP Standard Tag Library JSP 标准标签库
2. EL 表达式是为了替换 jsp 中的表达式脚本,JSTL 是为了替换代码脚本。这样 jsp 页面 变得更佳简洁
jstl是由5个标签库组成
使用jstl要导入这两个包
(2)JSTL的流程控制
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>流程控制</title>
</head>
<body>
<%--向域对象添加数据--%>
${pageContext.setAttribute("score","B")}
<%--判断--%>
<c:if test="${score eq 'A'}">优秀</c:if>
<%--对数据进行多条件判断--%>
<c:choose>
<c:when test="${score eq 'A'}">优秀</c:when>
<c:when test="${score eq 'B'}">良好</c:when>
<c:when test="${score eq 'C'}">及格</c:when>
<c:when test="${score eq 'D'}">差</c:when>
<c:otherwise>成绩非法</c:otherwise>
</c:choose>
</body>
</html>
代码解释:
1.<%@taglib uri="" prefix=" "%>
是一个jsp指令,用于声明和引用一个自定义标签库(或标准标签库(standard tag library)。
2.
<c:if test="${score eq 'A'}">优秀</c:if>
这段代码的意思是:
<c:if>
:开始一个条件判断。test="${score eq 'A'}"
:设置测试条件。这里使用了 EL 表达式。${score eq 'A'}
检查变量score
的值是否等于字符串'A'
。eq
是 EL 中的等于操作符。score
是一个变量,它可能是在作用域中设置的一个属性。'A'
是一个字符串字面量。如果测试条件为真(即score
的值等于'A'
),则显示文本优秀
。
3. <c:choose>
类似于 Java 中的 switch
语句。
(3)JSTL的循环
记得导包和标签库
<%@ page import="java.util.ArrayList" %> //因为我使用了ArrayList <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--向域对象添加数据--%>
<%
ArrayList<String> list=new ArrayList<>();
list.add("aa");
list.add("dd");
list.add("bb");
list.add("cc");
pageContext.setAttribute("list",list);
%>
<%--遍历集合--%>
<c:forEach items="${list}" var="str">
${str} <br>
</c:forEach>
代码解释:
-
items="${list}"
:items
属性指定了要遍历的集合或数组。${list}
是一个EL 表达式,它引用了一个名为list
的变量。包含要遍历的元素。 -
var="str"
:var
属性用于声明一个变量,该变量将代表当前正在迭代的元素。在这个例子中,每个从list
中取出的元素都会被赋值给变量str
。 -
${str}
:输出遍历的元素