[Java 学习] JSP详解
前言
虽然JSP这项技术已经被大部分的公司淘汰了,但一些老项目中还是存在很多JSP的,假如某天你接手一个政府的老项目,可能你就会崩溃,因为人家可能老到连Servlet都没有纯JSP开发。所以懂还是要的,但是东西又比较多,就记下这篇笔记,以后忘了自己翻自己的,不香么?
一、JSP
1、 概念
Java Server Pages:Java服务器页面
本身一个服务器的技术,本质上是一个Servlet
大白话:就是 HTML + Java 代码
2、 脚本
2.1 <% 编写的内容其实是在service方法中 %>
2.2 <%! 写的是申明全局变量和方法,编写的内容其实是JSP翻译的Servlet的全局变量和方法%>
2.3 <%= 输出内容【就是一个表达式】%>
3、 include标签跟指令的区别
3.1 标签jsp:include
<jsp:include page="head.jsp"></jsp:include>
可以在一个JSP页面中包含其他JSP页面的内容
此方式:是通过方法调用其他JSP内容,是动态的包含,推荐使用
3.2 指令include
<%@ include file="head.jsp"%>
可以在一个JSP页面中包含其他JSP页面内容
此方式:是通过把其它JSP内容直接写到当前页面中,是静态包含,不推荐
4、其他标签
4.1 操作对象
<jsp:useBean id="user" class="com.qf.entity.User" />
等同于
<% User user = new com.qf.entity.User(); %>
<jsp:setProperty name="user" property="name" value="gavin" />
等同于
<% user.setName("gavin"); %>
<jsp:getProperty name="user" property="name" />
等同于
<% user.getName("name"); %>
4.2 转发带参数
<jsp:forward page="index.jsp">
<!-- http请求参数传递-->
<jsp:param name="sex" value="nan" />
</jsp:forward>
<% 转发到index.jsp页面,并且携带参数sex=nan %>
5、内置对象
由JSP自动创建的对象,可以直接使用,总共有9个
| 对象名 | 类型 | 说明 |
|---|---|---|
| request | javax.servlet.http.HttpServletRequest | |
| response | javax.servlet.http.HttpServletResponse | |
| session | javax.servlet.http.HttpSession | 由session=“true”开关 |
| application | javax.servlet.ServletContext | |
| config | javax.servlet.ServletConfig | |
| exception | java.lang.Throwable | 由isErrorPage=“false”开关 |
| out | javax.servlet.jsp.JspWriter | javax.servlet.jsp.JspWriter |
| pageContext | javax.servlet.jsp.PageContext | |
| page | java.lang.Object当前对象this | 当前servlet实例 |
5.1 pageContext内置对象【掌握】
| pageContext获取其他八大内置对象 |
|---|
![]() |
5.2 四大域对象【掌握】
JSP有四大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别
- pageContext (javax.servlet.jsp.PageContext) 当前JSP页面范围
- request (javax.servlet.http.HttpServletRequest) 一次请求有效
- session (javax.servlet.http.HttpSession) 一次会话有效(关闭浏览器失效)
- application (javax.servlet.ServletContext) 整个Web应用有效(服务器重启或关闭失效)
6、指令【掌握】
6.1 page指令
语法:<%@ page attribute1="value1" attribute2="value2" %>
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
| 属性 | 描述 |
|---|---|
| contentType | 指定当前JSP页面的MIME类型和字符编码格式 |
| errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
| isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
| import | 导入要使用的Java类 |
| language | 定义JSP页面所用的脚本语言,默认是Java |
| session | 指定JSP页面是否使用session。默认为true立即创建,false为使用时创建 |
| pageEncoding | 指定JSP页面的解码格式 |
6.1.1 page指令需要注意的几个属性
contentType="text/html;charset=UTF-8"
import : 导入Java类的全类名
language:java
6.2 taglib
语法:<%@ taglib uri="外部标签库路径" prefix="前缀" %>
引入JSP的标准标签库
<!-- jstl标签库: 需要导入jar包,在jstl-1.2.jar之后只需要一个jar包就可以了 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 格式化相关的,时间,字符串 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
6.2.1 taglib的属性
uri:标签库的地址
prefix:标签库的前缀,在使用该标签时,必须加前缀
二、EL表达式
1、概念
EL使JSP写起来更简单、简洁。主要用于获取域对象中的数据
2、原生获取域数据中数据和EL获取域中对象的数据的差别
<%--
Created by IntelliJ IDEA.
User: ghy
Date: 2021/1/11
Time: 16:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
session.setAttribute("age", 12);
request.setAttribute("name", "lucy");
application.setAttribute("gender", "男");
pageContext.setAttribute("birth", "1999-12-12");
%>
<hr>
<%= request.getAttribute("name")%>
<br>
<%= session.getAttribute("age")%>
<br>
<%= application.getAttribute("gender")%>
<br>
<%= pageContext.getAttribute("birth")%>
<br>
<%= request.getAttribute("aa")%> <%-- null --%>
<br>
<hr>
${requestScope.name} -- ${name}
<br>
${sessionScope.age} -- ${age}
<br>
${applicationScope.gender} -- ${gender}
<br>
${pageScope.birth} -- ${birth}
<br>
${requestScope.aa} -- ${aa}
<br>
<br>
<br><br><br>
<%
session.setAttribute("bb", 12);
request.setAttribute("bb", "lucy");
application.setAttribute("bb", "男");
pageContext.setAttribute("bb", "1999-12-12");
%>
${requestScope.bb} -- lucy
<br>
${bb} -- 作用域的范围从小到大开始检索,如果查到了,就返回并中断
</body>
</html>
3、EL取值的语法
${ EL表达式 }
4、常规运算
$
算术运算、逻辑运算、三目运算都可以
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: ghy
Date: 2021/1/11
Time: 16:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("age", 12);
request.setAttribute("gender", "1");
%>
${age > 10} --- 运算过程写{}中间 <br>
-- 错误的写法 ${age} > 10
<hr>
${age > 10 and gender == '123'}
<!--
逻辑运算
&& and
|| or
! not
-->
<br><br>
not: ${!(age > 10)} -- ${not (age > 10)}
<br><br>
or : ${age > 10 || gender == '123'}
<br><br>
<!-- 算术运算 -->
${age * 2} -- 计算得到的结果:24
<br><br>
${gender == '1' ? '男' : '女'}
<br><br>
<br><br>
<%
List<String> list = new ArrayList<>();
List<String> list2 = null;
request.setAttribute("list", list);
request.setAttribute("list2", list2);
request.setAttribute("desc", "");
request.setAttribute("desc1", null);
%>
<br><br>
<%-- empty判断当前对象是否为空: null值
如果是字符串,还会额外判断是否为空串:""
如果是集合或数组,还会判断集合中是否有元素
如果是null或者""或者[],均返回true
--%>
list: ${empty list} -- ${not empty list}
<br><br>
list2: ${empty list2} -- ${not empty list2}
<br><br>
字符串: ${empty desc}
<br><br>
字符串: ${empty desc1}
<br><br>
${age gt 12} -- >
<br>
${age ge 12} -- >=
<br><br>
lt : <
le : <=
eq : ==
<br><br>
<%
Map<String,String> maps = new HashMap<>();
maps.put("CN","中国");
maps.put("FK","法国");
maps.put("US","美国");
request.setAttribute("maps",maps);
List names = Arrays.asList("lucy","jack");
request.setAttribute("names", names);
%>
获取map中的数据:${requestScope.maps['CN']}
<br>
获取list中的数据: ${names[0]}
</body>
</html>
5、隐式对象
5.1 pageContext
<!-- 获取当前应用的虚拟路径 -->
虚拟路径:<br>
方式一: <%= request.getContextPath() %><br>
方式二: ${pageContext.request.contextPath}
5.2 其他
<%
Cookie cookie = new Cookie("username", "lucy");
response.addCookie(cookie);
response.sendRedirect(request.getContextPath() + "/pages/cookie-demo.jsp");
%>
<%--
${cookie.username} : 获取key为username的cookie对象
${cookie.username.name} : 获取key为username的cookie对象的键值
${cookie.username.value} : 获取key为username的cookie对象的value值
--%>
${cookie.username} - ${cookie.username.name} - ${cookie.username.value}
三、JSTL标签
C标签
就是配合EL表达式,完成替代JSP页面上的Java代码
将来在写JSP页面时,就应该让JSP页面只完成视图工作【展示】,不处理业务
1、JSTL使用步骤
- 导入jar包【jstl-1.2.jar】
- 在JSP页面使用taglib指令引入
- 直接使用
| 导入jar包【jstl-1.2.jar】 |
|---|
![]() |
| 在JSP页面使用taglib指令引入 |
|---|
![]() |
- 使用
<%@ page import="com.java2007.pojo.Person" %>
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: ghy
Date: 2021/1/11
Time: 17:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
List<Person> list = new ArrayList<>();
list.add(new Person(10, "小张","1"));
list.add(new Person(20, "xiaoming","0"));
list.add(new Person(30, "xiaowang","1"));
request.setAttribute("list", list);
%>
<table border="1" cellspacing="0" cellpadding="10">
<tr>
<td>序号</td>
<td>ID</td>
<td>NAME</td>
<td>性别</td>
</tr>
<c:forEach items="${list}" var="person" varStatus="vs">
<tr>
<td>${vs.index + 1}</td>
<td>${person.id}</td>
<td>${person.name}</td>
<td>${person.gender == "1" ? '男' : '女'}</td>
</tr>
</c:forEach>
</table>
<ul>
<c:forEach begin="1" end="10" var="num" step="1">
<li>${num}</li>
</c:forEach>
</ul>
<c:if test="${10 > 2}" >
true
</c:if>
<c:if test="${10 <= 2}">
false
</c:if>
<%
request.setAttribute("age",10);
%>
<c:choose>
<c:when test="${age > 8}">8</c:when>
<c:when test="${age == 9}">9</c:when>
<c:when test="${age == 10}">10</c:when>
<c:otherwise>100</c:otherwise>
</c:choose>
</body>
</html>
笔记来源:千锋教育-ghy




浙公网安备 33010602011771号