一、JSP(Java Server Pages)
像HTML页面,但是不是HTML
1.1、什么是jsp
概念:JSP(全称JavaServer Pages)是由[Sun Microsystems]公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言, 为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
jsp将java代码和特定变动内容嵌入到静态页面中,实现以静态页面为模板,动态生成其中部分内容
JSP文件在运行时会被其编译器转换成更原始的Servlet代码。
jsp文件先被转换成===》java代码写的servlet 在被编译成====》class字节码
jsp里面可以写java目命令
注意:后续开发 不怎么用jsp
1.2、为什么用jsp(为了方便)
jsp其实就是一个特殊的servlet;
普通的servlet可以显示数据,但是获取其他css,js时编码太过麻烦 jsp可以方便的设置css和js
1.3、jsp执行过程
- 服务器收到客户请求,加载指定请求的jsp文件
- JSP引擎加载jsp文件,并转换成Servlet.java的代码
- JSP引擎将转换的代码编译成.class 字节码文件
- 服务器执行字节码文件
- 返回执行结果到客户端
注意: idea的项目是通过idea的内置功能将webapp于Tomcat连接的
在idea的目运行界面可以找到路劲
1.4、jsp的组成部分
基本指令配置jsp页面 导入资源
格式
<%@ 指令名称 属性名=属性值 %>
page 配置jsp页面
<%@ page import="java.util.ArrayList" %>
<%-- page import =“” 导入jar包--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 设置页面的字符集编码 和语言类型 --%>
taglib 导入标签库
include 页面包含的,导入资源的文件
注释
HTML注释: <!-- -->只能注释HTML代码
jsp注释 <% %>所有都可以注释
jsp九大内置对象(jsp页面中不需要创建,可以直接使用的对象)
变量名 真实类型 作用
pageContext PageContext 当前页面共享数据,还可以回去其他八个内置对象
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以回去其他八个内置对象 |
request | HTTPServletRequest | 一次请求访问的多个资源(转发) |
session | HTTPSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HTTPServletResponse | 响应对象 |
page | object | 当前页面(servlet)的对象 this |
out | JSPWriter | 输出对象,数据输出到页面上面 |
config | ServletConfig | Servlet的配置对象 |
Exception | Throwable | 异常对象 |
四大域对象 | ||
作用域(数据可以起作用的区域) | ||
PageContext(当前页面) | ||
Request(一次请求) | ||
session(一次会话) | ||
application(服务器启动期间) |
注意:
在jsp编写java代码必须写在<% 里面%>,表示可以运行java代码
案例:在jsp页面中显示所有学生数据
- 通过工具类获取数据库的数据
- 在在服务里面把数据通过req请求转发到jsp页面
- jsp页面设置表格 通过request.getAttribute获取数据
二、El表达式
2.1、什么是EL
Expression Language 表达式语言
2.2、有什么用(获取数据)
替换《%=变量名%》; 替换之前的表达式
EL表达式可以直接从四大域里面取出数据
EL的本质就是获取对象中get的值(get名字)
2.3、怎么用EL
直接在jsp写
${作用域.数据名称}
2.4、EL支持运算符
算术运算符:+ - * %
关系运算符:== != > <
逻辑运算符: and or not
${5>4}//true
<% int a=10;
int b=10;%>
${a==b} //true
2.5、EL的值的获取
值的获取从四大域对象获取 :
语法 ${作用域.键名}
变量名 ----------- 对应的域对象
pageScope === page=== 当前页面
requestScope === req=== 在当前req中起作用 一次请求A.jsp—>AServlet—>转发—>BServlet(一次请求)
sessionScope === session=== 在当前会话中起作用
applicationScope === application=== 在 ServletContext整个web应用 全局变量
举例
2.5.1、从list里面取值
2.5.2、从Map里面取值(根据key获取)
2.5.3、获取对象中的值
如果没有确定域
$ { 键名 }
当没有确定域对象,会按照域对象的范围从小到大挨去找
查找key的过程:【page】—>【request】—>【session】—>【application】;找到为止
EL隐式对象(11个)
作用域对象中,在指定的范围内起作用,本质上都是Map类型的集合,存储key-value, 通过key获取value值:
- 如果不写域对象名 找数据按照四大域
- 查找key的过程:【page】—>【request】—>【session】—>【application】;找到为止
- 如果是隐式对象是已经提前封装的数据 ,使用的时候可以直接获取
隐含对象 | 类型 | 说明 |
---|---|---|
pageContext | javax.servlet.ServletContext | 表示此JSP的PageContext |
pageScope | java.util.Map | 取得Page范围的属性名称所对应的值 |
requestScope | java.util.Map | 取得Request范围的属性名称所对应的值 |
sessionScope | java.util.Map | 取得Session范围的属性名称所对应的值 |
applicationScope | java.util.Map | 取得Application范围的属性名称所对应的值 |
param | java.util.Map | 如同ServletRequest.getParameter(String name)。回传String类型的值 |
paramValues | java.util.Map | 如同ServletRequest.getParameterValues(String name)。回传String[]类型的值 |
header | java.util.Map | 如同ServletRequest.getHeader(String name)。回传String类型的值 |
headerValues | java.util.Map | 如同ServletRequest.getHeaders(String name)。回传String[]类型的值 |
cookie | java.util.Map | 如同HttpServletRequest.getCookies() |
initParam | java.util.Map | 如同ServletContext.getInitParameter(String name)。回传String类型的值 |
PageContext:
Expression | 说明 |
---|---|
${pageContext.request.queryString} | 取得请求的参数字符串 |
${pageContext.request.requestURL} | 取得请求的URL,但不包括请求之参数字符串,即servlet的HTTP地址。 |
${pageContext.request.contextPath} | 服务的webapplication的名称 |
${pageContext.request.method} | 取得HTTP的方法(GET、POST) |
${pageContext.request.protocol} | 取得使用的协议(HTTP/1.1、HTTP/1.0) |
${pageContext.request.remoteUser} | 取得用户名称 |
${pageContext.request.remoteAddr} | 取得用户的IP地址 |
${pageContext.session.new} | 判断session是否为新的,所谓新的session,表示刚由server产生而client尚未使用 |
${pageContext.session.id} | 取得session的ID |
${pageContext.servletContext.serverInfo} | 取得主机端的服务信息 |
三、标签库JSTL (java Server Libray)
什么是jstl: 是一个jsp标签的集合,封装来jsp应用的通用核心功能。
作用: 为了替代《% %》
JSTL的功能
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
怎么使用
-
导入jar包
-
页面引入指令
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
if 对应java中的if判断
<h1>测试jstl标签库 if语句</h1>
<c:if test="${requestScope.obj.get(1) < 18}"> <%--通过判断test中表达式的值 true/false 来判断代码是否执行--%>
<h1> 你还未成年</h1>
</c:if>
**2.注意:这里没有else,如果想要else就再写一个< c:if>**
foreach标签
重复执行普通for循环类似怎么写
<%--for each 标签*/重复执行代码
/*
* begin : 开始值==== int i = 0 类似
* end: 结束值 相对于 i<5 for循环的条件
* var 临时变量 相对于for循环里面的i
* step:步进 相对于i++ --%>
<%--
for(int i=1;i<6;i++){
}
<c:forEach begin="初始值大小" end="结束值" step="步进大小" var="初始值">
${i}<br>
</c:forEach>
--%>
<c:forEach begin="1" end="20" step="1" var="i">
${i}<br>
</c:forEach>
结果
遍历容器怎么写
<%--
items 获取容器的对象
var 临时变量名称
varStatus 循环的状态对象
index 获取循环的对象的索引
count 循环的次数
--%>
<table border="1px">
<c:forEach items="${requestScope.list}" var="obj" varStatus="aa" >
<tr>
<td>${obj}
</td>
</tr>
</c:forEach>