1.1 JSP的本质
jsp部署到tomcat中,在启动tomcat的时候会把JSP页面翻译成一个.java文件,文件名是:JSP文件名_jsp.java。 JSP的本质是Servlet,只是形式不同,职责不同 servlet负责接收请求 处理数据 给出响应 jsp页面 主要负责将servlet响应回来的数据以页面的形式展示在浏览器中。
1.2 JSP的三种语法
1.2.1 JSP头部的page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
page指令可以修改JSP页面中的一些重要属性
- contentType:属性表示jsp返回的数据类型,
response.setContentType("text/html;charset=UTF-8");
- language:表示jsp翻译时使用什么语言,暂时只支持java
- PageEncoding:表示当前页面文件本身使用的字符集
- import和java代码中的import一样 导包
- autoflush 设置当out书缓冲流缓冲区满之后 是否自动刷新缓冲区 默认值是true
- buffer 设置out的缓冲区大小 默认8kb
- errorPage:表示当前页面是否是错误信息页面 默认是false 如果设置为true 就可以获取异常信息
- session 设置访问jsp页面 是否创建HttpSession对象 默认是true
1.2.2 JSP中的常用脚本
声明脚本: 形式:<%! %> 用途:1.声明类的属性 2.声明静态代码块 3.声明类的方法 表达式脚本: 形式:<%= %> 用途:在jsp页面输出数据
<h1>这是一个JSP页面</h1>
<%=20%><br/>
<%="中北大学"%>
<%=map%>
<%=request.getAttribute("username")%>
代码脚本: 形式:<% %> 用途:翻译之后的代码位于_jspService()方法内部,因此不能写方法
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%--
Created by IntelliJ IDEA.
User: adminstrator
Date: 2021-8-24
Time: 11:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" buffer="8kb" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% int age = 10;
if( age > 18 ){
%><h1>成年人</h1><%
}else{ %>
<h1>未成年人</h1><%
}%>
</body>
</html>
jsp的三种注释
<%----%> jsp的注释
1.3 JSP九大内置对象
内置对象 指的就是tomcat 在翻译jsp页面成为servlet源代码后,内部提供的九大对象
- request 请求对象
- response 响应对象
- pageContext jsp的上下文对象
- session 会话对象
- application ServletContext对象
- config ServletConfig对象
- out jsp的输出流对象
- page 指向当前jsp的对象
- exception 异常对象
对于内置对象,我们可以不用声明 直接使用
1.3.1 JSP的四大域对象
- pageContext 作用范围 当前jsp页面范围内有效
- request 一次请求内有效
- session 一次会话范围内有效(一次会话是指打开浏览器访问服务器,直到关闭浏览器)
- application ServletContext 整个web工程范围内都有效(只要web工程服务不停止,数据将一直存在)
四大域对象的作用域从小到大:pageContext – request – session – application
index.jsp
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%--
Created by IntelliJ IDEA.
User: adminstrator
Date: 2021-8-24
Time: 11:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" buffer="8kb" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 在四大域对象中存储数--%>
<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
<%--获取四大域对象中存储的数据--%>
pageContext域:<%=pageContext.getAttribute("key")%><br/><br/>
request域:<%=request.getAttribute("key")%><br/><br/>
session域:<%=session.getAttribute("key")%><br/><br/>
application域:<%=application.getAttribute("key")%><br/><br/>
<%--转发到另一个jsp页面--%>
<%
request.getRequestDispatcher("/main.jsp").forward(request,response);
%>
</body>
</html>
main.jsp
<%--
Created by IntelliJ IDEA.
User: adminstrator
Date: 2021-8-24
Time: 14:54
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>
<%--获取四大域对象中存储的数据--%>
pageContext域:<%=pageContext.getAttribute("key")%><br/><br/>
request域:<%=request.getAttribute("key")%><br/><br/>
session域:<%=session.getAttribute("key")%><br/><br/>
application域:<%=application.getAttribute("key")%><br/><br/>
</body>
</html>
1.3.2 JSP中的out和response.getWriter()的区别
本质上没有区别 response表示响应,给客户端输出内容 out也是给用户做输出使用的 在jsp中 统一使用out进行输出 out.writer()输出字符串 out.print()可以输出任意的类型
1.4 JSP的常用标签
1.4.1 动态包含
特点:
- page属性 指定要包含的jsp页面
- 动态包含会把包含的jsp也翻译为java代码
- 动态包含的底层代码使用JspRuntimeLibrary.include(request,response,“main.jsp”,out,false);
- jsp动态包含还可以传递参数
<jsp:include page="main.jsp">
<jsp:param name="username" value="admin"/>
<jsp:param name="password" value="87654321"/>
</jsp:include>
<%=request.getParameter("username")%>------
<%=request.getParameter("password")%>
1.4.2 静态包含
特点
- file属性 指定所要包含的jsp页面
- 静态包含不会把包含的jsp也翻译为java代码
- 静态包含就是把被包含的jsp页面的代码拷贝到了被包含的位置
<%@include file="main.jsp"%>
1.4.3 转发
<jsp:forward page="main.jsp"></jsp:forward>
page就是转发的路径
1.5 EL表达式
1.5.1 EL表达式的作用
代替jsp页面的表达式脚本在jsp页面进行数据的输出 区别:EL表达式在输出null值的时候 输出的是空串,而jsp表达式输出的是null字符串
<body>
<% request.setAttribute("key","value");%>
jsp表达式: <%=request.getAttribute("key")%><br/>
EL表达式: ${key}
</body>
1.5.2 EL表达式数据的搜索
EL表达式主要是在jsp页面输出数据,主要输出的是四大域对象中的数据。 当四大域对象中有同名的属性时,EL表达式会按作用域从小到大的顺序搜索,找到就输出 (若中途执行了removeAttribute方法,仍会按照初始的优先级执行,但由于已经被移除了,所以返回null)
1.5.3 EL表达式输出Bean的属性
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Person p = new Person();
p.setName("张三");
p.setHobbys(new String[]{"足球","篮球","羽毛球"});
List<String> cities = new ArrayList<>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
p.setCities(cities);
Map<String ,Object> map = new HashMap<>();
map.put("k1","v1");
map.put("k2",100);
map.put("k3",true);
p.setMap(map);
req.setAttribute("person",p);
req.getRequestDispatcher("/index.jsp").forward(req,resp);
}
<body>
输出person:${person}<br/>
输出person的name:${person.name}<br/>
输出person的hobbys:${person.hobbys[1]}<br/>
输出person的cities:${person.cities}<br/>
输出person的cities的某一个值:${person.cities[2]}<br/>
输出person的map:${person.map}<br/>
输出person的map的某一个key对应的值:${person.map.k2}<br/>
</body>
1.5.4 EL表达式运算
1.关系运算
<%-- 关系运算--%>
等于: ${5==5} || ${5 eq 5} <br/>
不等于: ${5!=5} || ${5 ne 5} <br/>
小于等于:${3 <= 5 } || ${3 le 5} <br/>
大于等于:${3 >= 5 } || ${3 ge 5} <br/>
2.逻辑运算 && 或 and ||或 or !或not 3.算数运算 + - * /或div %或mod 4.empty运算(not empty) 判断某一个数据是否为空,如果为空 则返回true 否则就返回false
null值,空串,数组长度为0,集合元素个数为0
request.setAttribute("emptyNull",null);
request.setAttribute("emptyStr","");
request.setAttribute("emptyArr",new Object[]{});
request.setAttribute("emptyList",new ArrayList());
request.setAttribute("emptyMap",new HashMap<String,String>());
5.三元运算
${ 1!=1?"java":"CSS"}
- “.”点运算符和[]中括号运算符
.点运算符可以输出bean对象的属性 [] 可以输出集合(数组)中某个元素的值 还可以输出map集合中key里面包含特殊字符的key的值
<% Map<String,Object> map = new HashMap<>();
map.put("a.a.a","aaaa");
map.put("b+b+b","bbbb");
map.put("c-c-c","cccc");
request.setAttribute("map",map); %>
${map['a.a.a']}<br/><br/>
${map['b+b+b']}<br/><br/>
${map['c-c-c']}<br/><br/>
1.6 EL表达式的11个隐含对象
EL表达式中有11个隐含对象,是EL表达式中自己定义的,可以直接使用
隐含对象 | 类型 | 说明 |
---|
PageContext | PageContextImpl | 它可以获取jsp 中的九大内置对象 | PageScope | Map | 它可以获取pageContext 域中的数据 | RequestScope | Map | 它可以获取Request 域中的数据 | sessionScope | Map | 它可以获取Session 域中的数据 | applicationScope | Map | 它可以获取ServletContext 域中的数据 | param | Map | 它可以获取请求参数的值 | paramValues | Map | 它也可以获取请求参数的值,获取多个值的时候使用。 | header | Map | 它可以获取请求头的信息 | headerValues | Map | 它可以获取请求头的信息,它可以获取多个值的情况 | cookie | Map | 它可以获取当前请求的Cookie 信息 | initParam | Map | 它可以获取在web.xml 中配置的上下文参数 |
1.6.1 获取四大特定域对象中的属性
<body>
<%
pageContext.setAttribute("kye","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("kye","application");
%>
${requestScope.key}<br/><br/>
${applicationScope.key}
</body>
1.6.2 pageContext对象的使用
<%-- pageContext对象的使用--%>
<%
pageContext.setAttribute("req",request);
%>
1.请求协议: ${req.scheme}<br/>
2. 服务器的Ip:${pageContext.request.serverName }<br/>
3. 服务器的端口:${pageContext.request.serverPort }<br/>
4. 获取工程路径:${pageContext.request.contextPath }<br/>
5 获取请求方法:${pageContext.request.method}<br/>
6 . 获取客户端的ip地址: ${pageContext.request.remoteHost}<br/>
7. 获取客户端的回话ID:${pageContext.session.id}<br/>
1.6.3 其他的隐含对象的使用
<%-- 其他隐含对象的使用
http://localhost:8080/index.jsp?username=admin&password=123456&hobby=java&hobby=html
--%>
<hr/>
输出请求参数username的值:${param.username}<br/>
输出请求参数password的值:${param.password}<br/>
<%-- 使用paramValues获取多值--%>
输出请求参数username的值:${paramValues.username[0]}<br/>
输出请求参数hobby1的值:${paramValues.hobby[0]}<br/>
输出请求参数hobby2的值:${paramValues.hobby[1]}<br/>
常见的请求头
<%-- 获取头信息--%>
输出请求头[Cookie]:${header['Cookie']}<br/>
输出请求头[User-Agent ]:${header['User-Agent']}<br/>
输出请求头[User-Agent ]:${headerValues['User-Agent'][0]}<br/>
</body>
获取上下文参数
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>tiger</param-value>
</context-param>
<%-- 获取上下文参数--%>
输出<context-param>参数username的值:${initParam.username}<br/>
输出<context-param>参数password的值:${initParam.password}
1.7 JSTL标签库
JSTL标签库全称是JSP standard Tag Library 标准标签库 是一个不断完善的开源的jsp标签库 EL表达式主要替换了jsp的表达式脚本,而标签库是为了替换代码脚本
1.7.1 JSTL的五大功能模块
<%--引入所需要的标签库--%>
<%--jstl的核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--xml标签库--%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%--格式化标签库--%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--函数标签库--%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%--SQL标签库--%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
1.7.2 核心库的使用
<%--使用c:set给域对象存储数据 作用就类似于域对象的。setArrtribute()--%>
<c:set scope="session" var="abc" value="abcValue"/>
${sessionScope.abc}
<%--c:if test属性是判断的条件 使用el表达式关系判断--%>
<%
request.setAttribute("age",20);
%>
<c:if test="${age >= 18}">
<h1>成年人</h1>
</c:if>
<c:if test="${age < 18}">
<h1>未成年人</h1>
</c:if>
<c:choose>
<c:when test="${age <=10}">
<h1>儿童</h1>
</c:when>
<c:when test="${age > 10 && age <18}">
<h1>青少年</h1>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${age < 30}">
<h1>青 年</h1>
</c:when>
<c:when test="${age >= 30 and age <50}">
<h1>中 年</h1>
</c:when>
<c:otherwise>
<h1>老 年</h1>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
<table border="1">
<%--
begin 表示开始的索引
end 结束索引
var 表示循环的变量
--%>
<c:forEach begin="1" end="10" var="i">
<tr>
<td>
第${i}行
</td>
</tr>
</c:forEach>
<%-- 使用循环遍历数组--%>
<%
request.setAttribute("attr",new String[]{"java","html","css","js"});
%>
<%--
item表示遍历的集合(数据源)
var 遍历得到的集合的每一项
--%>
<c:forEach items="${requestScope.attr}" var="arr">
${arr}
</c:forEach>
<%--遍历map--%>
<%
Map<String,Object> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
%>
<c:forEach items="${requestScope.map}" var="entry">
${entry.key}---${entry.value}
</c:forEach>
每一个jsp页面都应该是由servlet跳转过来的
1.7.3 格式化标签库
<!--通过类型来格式-->
<fmt:formatDate value="${stu.birthday}" type="date"></fmt:formatDate>
<!--自定义格式-->
<fmt:formatDate value="${stu.birthday}" pattern="yyyy-MM-dd"></fmt:formatDate>
value:显示的日期 type:date、time、both
<fmt:formatNumber value="${balance}" type="currency"/><br/>
<fmt:formatNumber value="${balance}" type="number"/><br/>
<fmt:formatNumber value="${balance}" pattern="###,###.##" />
type:number currency percent pattern:自定义格式 0/#代表一位数字
1.7.4 函数标签库
<c:set value=" hell oworld " var="str"></c:set>
<p>字符串的长度:${fn:length(str)}</p>
<p>字符串的子串:${fn:substring(str,3 ,5 )}</p>
<p>字符串的转化为大写:${fn:toUpperCase(str)}</p>
<p>字符串的去除空格:${fn:trim(str)}</p>
函数 | 描述 |
---|
fn:contains() | 测试输入的字符串是否包含指定的子串 | fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 | fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 | fn:escapeXml() | 跳过可以作为XML标记的字符 | fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 | fn:join() | 将数组中的元素合成一个字符串然后输出 | fn:length() | 返回字符串长度 | fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 | fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 | fn:startsWith() | 测试输入字符串是否以指定的前缀开始 | fn:substring() | 返回字符串的子集 | fn:substringAfter() | 返回字符串在指定子串之后的子集 | fn:substringBefore() | 返回字符串在指定子串之前的子集 | fn:toLowerCase() | 将字符串中的字符转为小写 | fn:toUpperCase() | 将字符串中的字符转为大写 | fn:trim() | 去除收尾空格 |
|