JSP:java服务器页面(Java Server Page):JSP的本质就是Servlet
特点:
可以在JSP页面中写java代码和HTML代码,与Servlet一样可以提供一个生成动态页面的技术
在JSP中写页面jsp代码就像是写HTML代码,jsp在HTML中嵌套了Java代码
JSP与Servlet的相比:
・Servlet可以写HTML代码,显示数据,但是排版比较困难,
而JSP也可以提供给用户提供动态的数据,并且对数据进行排版比较方便。
JSP与HTML相比
・HTML只能为用户提供静态的数据,而JSP可以嵌套Java代码,所以可以为用户提供动态的数据
JSP的实现原理:
・客户端请求 -> 服务器判断请求的是HTML页面还是JSP页面 -> (是HTML页面就直接跳转到HTML页面)
如果是JSP页面就会生成Servlet的java文件,
然后进行编译为class文件 -> 将java代码转化为浏览器能够直接识别的HTML格式的JSP文件
JSP的组成元素:
1.注释元素
・客户端可见:
<!-- 注释内容 -->
<!-- 注释内容<%=表达式 %> -->
・客户端不可见:
<%-- 程序员专用注释 --%>
<% //单行注释 %>
<% /*多行注释*/ %>
2.模板元素:
JSP页面中的HTML代码
通过HTML代码可以定义界面的结构,骨架
3.脚本元素(核心元素)
・代码块:以<%开始,以%>结束
・表达式:以<%=开始,以%>结束
=后跟着的是符合Java语法的表达式或者是变量或常亮
・声明:以<%!开始,以%>结束
・使用声明元素可以声明变量和方法等,但是声明的变量是全局变量
・该方法声明的变量是全局变量,当多个用户同时访问该页面的时候,该全局变量都会被这些用户共享
4.指令元素:
page指令:<%@ page=... %>
include指令:将其他页面(jsp,html等),包含到当前页面中,注意不能包含Servlet
<%@ include file="包含页面" %>
taglib指令:<%@ taglib prefilx="标签库的前缀或昵称" url="标签库的路径" %>
5.动作元素:
1.包含标签:
<%@ include file="包含页面" %>:静态包含(在jsp编译的时候就会将top.jsp页面中的HTML全部编译到当前的jsp页面中)
<jsp:include page="包含页面(html,jspp等)的地址或者是动态地址" ></jsp:include>:动态包含(在执行到该语句的时候才会将top.jsp中的代码打印到当前页面中)
2.转发标签:
<jsp:forward page="Servlet地址"></jsp:forward>:page属性中可以接受jsp,html,Servlet的地址
3.参数标签:(一般是与前两个标签一起使用)
例:<jsp:include page="top.jsp">
<jsp:param value="1" name="flag"/>
</jsp:include>
将html页面转化为jsp页面
1.创建对应的jsp页面
2.将对应的html页面中的HTML代码拷贝到对应jsp页面中
3.在home.jsp和member.jsp页面中将top.jsp包含进去
JSP九大内置对象:
out:打印
page:表示的是当前的页面,可以保存数据的作用域,类型:Object
request:请求 1
response:响应
session:会话 2
application:应用程序 3
config:封装了一些配置信息
exception:当页面发生异常,就会生成这个而对象
pageContext:九大内置对象的顶层对象,可以通过该对象获取其他的8个对象
EL表达式
概念:
EL表达式不是一个编程语言,是一个用简单符号表示一个复杂行为的
主要作用是获取作用域中的额数据,并对其进行简单的操作
语法:
!语法格式:以$开始,用大括号{}将EL表达式内容包含起来
${requestScope.msg }:查询request中的数据
${sessionScope.msg }:查询session中的数据
${applicationScope.msg }:查询application中的数据
${msg }:查询pageContext中的数据(pageContext.findAttribute("msg"))
EL表达式的组成部分:
标识符:用来标识存储在作用域中的数据对象。EL有11个表刘标识符,对应于11个EL隐式对象
存取器:“.”和“[]”存取器
${user.username}和${user["username"]}
区别:
.只能静态获取相关的数据,也就是.货吗跟着的只能是具体的参数名称,不能是变量
[]获取数据,则中括号中的数据key值可以是变量,也就是可以动态的获取数据
注意:是变量的话就会根据变量名找值对应的数据
文字:文字表示固定的值:数字、字符、字符串、布尔型或空值
运算符:not empty(判断是否不为空,返回布尔值)
JSTL:(JSP标准标签库)
1.在工程中导入相关的jar包
2.在要使用jstl的jsp页面中导入相关库(core)
使用taglib指令导入jstl中的核心库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix:前缀或昵称一般随便命名,建议使用标签库的缩写c
uri:标签库的地址,要导入带有jsp路径的地址
3.
1.声明变量
<c:set var="a" value="10"></c:set>
var:用于声明变量制定变量的名称
value:用于给变量赋值
scope:制定变量保存的地址(作用域),默认保存page中
输出变量
<c:out value="${a }"></c:out>
value:输出变量的数据(可以接受EL表达式,也可以是常量)
2.判断语句
<c:if test="${a<18 }">内容</c:if>
test:属性表示判断的条件
3.循环语句(必须要用程序员专用注释)
<c:forEach var="i" begin="1" end="10" step="1">内容</c:forEach>
var:声明一个变量,指定变量的名称
begin:指定循环的开始下标
end:指定循环的结束下标
step:每次循环变量的递增 步长
4.增强型循环
<c:forEach var="user" items="${list }">
${user.getName() }----${user.getPwd() }<br/>
</c:forEach>
var:声明变量 并指定变量的名称
items:要循环的集合
指定
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
// http://localhost:8888/hdshop/
String basePath = request.getScheme()+"://"+request.getServerName()
+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 指定当前页面的根路径 -->
<base href="<%=basePath %>" />
分页查询:
// 1.初始化数据
List<UserBean> list = new ArrayList<>();
for (int i = 0; i <= 100; i++) {
list.add(new UserBean(i, "木婉清" + i, 10 + i));
}
// 2.初始化已知条件
//int currentPage = 8; // 当前页面
int pageSize = 10; // 每页显示的数据
// 从客户端获取当前页面currentPage的值
int currentPage = parseInt(request.getParameter("currentPage"), 1);
// 3.计算
int startIndex = (currentPage - 1) * pageSize; // 开始下标
int endIndex = currentPage * pageSize; // 结束下标
int totalCount = list.size(); // 总记录数
//解决最后一页数据显示不全,填不满最后一页,出现数组越界问题
endIndex = endIndex>totalCount?totalCount:endIndex;
int pageCount = (totalCount-1)/pageSize+1;
// 4.截取分页后的数据
List<UserBean> result = list.subList(startIndex, endIndex);
// 5.将截取的数据保存到作用域中
request.setAttribute("list", result);
request.setAttribute("pageCount", pageCount);
request.setAttribute("currentPage", currentPage);
// 6.跳转页面
request.getRequestDispatcher("/fenye.jsp").forward(request, response);
<!-- 分页栏目的功能 -->
<script>
/* 首页 */
function firstPage(){
location.href = "FenYeServlet?currentPage=1";
}
/* 上一页 */
function backPage(){
location.href = "FenYeServlet?currentPage=${currentPage eq 1?1:currentPage-1 }";
}
/* 下一页 */
function nextPage(){
location.href = "FenYeServlet?currentPage=${currentPage eq pageCount?pageCount:currentPage+1 }";
}
/* 尾页 */
function lastPage(){
location.href = "FenYeServlet?currentPage=${pageCount }";
}
</script>
特点:
可以在JSP页面中写java代码和HTML代码,与Servlet一样可以提供一个生成动态页面的技术
在JSP中写页面jsp代码就像是写HTML代码,jsp在HTML中嵌套了Java代码
JSP与Servlet的相比:
・Servlet可以写HTML代码,显示数据,但是排版比较困难,
而JSP也可以提供给用户提供动态的数据,并且对数据进行排版比较方便。
JSP与HTML相比
・HTML只能为用户提供静态的数据,而JSP可以嵌套Java代码,所以可以为用户提供动态的数据
JSP的实现原理:
・客户端请求 -> 服务器判断请求的是HTML页面还是JSP页面 -> (是HTML页面就直接跳转到HTML页面)
如果是JSP页面就会生成Servlet的java文件,
然后进行编译为class文件 -> 将java代码转化为浏览器能够直接识别的HTML格式的JSP文件
JSP的组成元素:
1.注释元素
・客户端可见:
<!-- 注释内容 -->
<!-- 注释内容<%=表达式 %> -->
・客户端不可见:
<%-- 程序员专用注释 --%>
<% //单行注释 %>
<% /*多行注释*/ %>
2.模板元素:
JSP页面中的HTML代码
通过HTML代码可以定义界面的结构,骨架
3.脚本元素(核心元素)
・代码块:以<%开始,以%>结束
・表达式:以<%=开始,以%>结束
=后跟着的是符合Java语法的表达式或者是变量或常亮
・声明:以<%!开始,以%>结束
・使用声明元素可以声明变量和方法等,但是声明的变量是全局变量
・该方法声明的变量是全局变量,当多个用户同时访问该页面的时候,该全局变量都会被这些用户共享
4.指令元素:
page指令:<%@ page=... %>
include指令:将其他页面(jsp,html等),包含到当前页面中,注意不能包含Servlet
<%@ include file="包含页面" %>
taglib指令:<%@ taglib prefilx="标签库的前缀或昵称" url="标签库的路径" %>
5.动作元素:
1.包含标签:
<%@ include file="包含页面" %>:静态包含(在jsp编译的时候就会将top.jsp页面中的HTML全部编译到当前的jsp页面中)
<jsp:include page="包含页面(html,jspp等)的地址或者是动态地址" ></jsp:include>:动态包含(在执行到该语句的时候才会将top.jsp中的代码打印到当前页面中)
2.转发标签:
<jsp:forward page="Servlet地址"></jsp:forward>:page属性中可以接受jsp,html,Servlet的地址
3.参数标签:(一般是与前两个标签一起使用)
例:<jsp:include page="top.jsp">
<jsp:param value="1" name="flag"/>
</jsp:include>
将html页面转化为jsp页面
1.创建对应的jsp页面
2.将对应的html页面中的HTML代码拷贝到对应jsp页面中
3.在home.jsp和member.jsp页面中将top.jsp包含进去
JSP九大内置对象:
out:打印
page:表示的是当前的页面,可以保存数据的作用域,类型:Object
request:请求 1
response:响应
session:会话 2
application:应用程序 3
config:封装了一些配置信息
exception:当页面发生异常,就会生成这个而对象
pageContext:九大内置对象的顶层对象,可以通过该对象获取其他的8个对象
EL表达式
概念:
EL表达式不是一个编程语言,是一个用简单符号表示一个复杂行为的
主要作用是获取作用域中的额数据,并对其进行简单的操作
语法:
!语法格式:以$开始,用大括号{}将EL表达式内容包含起来
${requestScope.msg }:查询request中的数据
${sessionScope.msg }:查询session中的数据
${applicationScope.msg }:查询application中的数据
${msg }:查询pageContext中的数据(pageContext.findAttribute("msg"))
EL表达式的组成部分:
标识符:用来标识存储在作用域中的数据对象。EL有11个表刘标识符,对应于11个EL隐式对象
存取器:“.”和“[]”存取器
${user.username}和${user["username"]}
区别:
.只能静态获取相关的数据,也就是.货吗跟着的只能是具体的参数名称,不能是变量
[]获取数据,则中括号中的数据key值可以是变量,也就是可以动态的获取数据
注意:是变量的话就会根据变量名找值对应的数据
文字:文字表示固定的值:数字、字符、字符串、布尔型或空值
运算符:not empty(判断是否不为空,返回布尔值)
JSTL:(JSP标准标签库)
1.在工程中导入相关的jar包
2.在要使用jstl的jsp页面中导入相关库(core)
使用taglib指令导入jstl中的核心库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix:前缀或昵称一般随便命名,建议使用标签库的缩写c
uri:标签库的地址,要导入带有jsp路径的地址
3.
1.声明变量
<c:set var="a" value="10"></c:set>
var:用于声明变量制定变量的名称
value:用于给变量赋值
scope:制定变量保存的地址(作用域),默认保存page中
输出变量
<c:out value="${a }"></c:out>
value:输出变量的数据(可以接受EL表达式,也可以是常量)
2.判断语句
<c:if test="${a<18 }">内容</c:if>
test:属性表示判断的条件
3.循环语句(必须要用程序员专用注释)
<c:forEach var="i" begin="1" end="10" step="1">内容</c:forEach>
var:声明一个变量,指定变量的名称
begin:指定循环的开始下标
end:指定循环的结束下标
step:每次循环变量的递增 步长
4.增强型循环
<c:forEach var="user" items="${list }">
${user.getName() }----${user.getPwd() }<br/>
</c:forEach>
var:声明变量 并指定变量的名称
items:要循环的集合
指定
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
// http://localhost:8888/hdshop/
String basePath = request.getScheme()+"://"+request.getServerName()
+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 指定当前页面的根路径 -->
<base href="<%=basePath %>" />
分页查询:
// 1.初始化数据
List<UserBean> list = new ArrayList<>();
for (int i = 0; i <= 100; i++) {
list.add(new UserBean(i, "木婉清" + i, 10 + i));
}
// 2.初始化已知条件
//int currentPage = 8; // 当前页面
int pageSize = 10; // 每页显示的数据
// 从客户端获取当前页面currentPage的值
int currentPage = parseInt(request.getParameter("currentPage"), 1);
// 3.计算
int startIndex = (currentPage - 1) * pageSize; // 开始下标
int endIndex = currentPage * pageSize; // 结束下标
int totalCount = list.size(); // 总记录数
//解决最后一页数据显示不全,填不满最后一页,出现数组越界问题
endIndex = endIndex>totalCount?totalCount:endIndex;
int pageCount = (totalCount-1)/pageSize+1;
// 4.截取分页后的数据
List<UserBean> result = list.subList(startIndex, endIndex);
// 5.将截取的数据保存到作用域中
request.setAttribute("list", result);
request.setAttribute("pageCount", pageCount);
request.setAttribute("currentPage", currentPage);
// 6.跳转页面
request.getRequestDispatcher("/fenye.jsp").forward(request, response);
<!-- 分页栏目的功能 -->
<script>
/* 首页 */
function firstPage(){
location.href = "FenYeServlet?currentPage=1";
}
/* 上一页 */
function backPage(){
location.href = "FenYeServlet?currentPage=${currentPage eq 1?1:currentPage-1 }";
}
/* 下一页 */
function nextPage(){
location.href = "FenYeServlet?currentPage=${currentPage eq pageCount?pageCount:currentPage+1 }";
}
/* 尾页 */
function lastPage(){
location.href = "FenYeServlet?currentPage=${pageCount }";
}
</script>