目录
一、概念
Java Server Page:能够书写Java代码的服务页面
只限定于Java语言,能够和后台服务器端程序进行交互 :主要展示视图层,服务端程序,获取数据
二、jsp的引入
1、jsp
域对象不仅有ServletContext,常用的HttpServletRequest域对象,在一次请求中有效
能够处理后台的业务数据 (能够书写代码/提供很多标签库去使用)
2、基本使用
1)创建RequestServletDemo继承HttpServlet
public class RequestServletDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//通过request 作为域对象,给里面存储一些数据
request.setAttribute("name","高圆圆");
System.out.println("存储成功...");
//需要请求转发到01_jsp的引入.jsp页面中
request.getRequestDispatcher("/01_jsp的引入.jsp").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
2)创建xml
<servlet>
<servlet-name>RequestServletDemo</servlet-name>
<servlet-class>com.qf.request_04.RequestServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestServletDemo</servlet-name>
<url-pattern>/requestDemo</url-pattern>
</servlet-mapping>
3)创建jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsp的引入</title>
</head>
<body>
<%--
jsp能够书写java代码
jsp的脚本
--%>
<%
//jsp脚本
String name = (String) request.getAttribute("name");
//jsp的内置对象 Writer----out给浏览器书写内容
out.write("name:"+name);
//System.out.println("name:"+name);
int i = 10 ;
%>
<%--jsp的输出表达式--%>
(1) <%=i%>
(2) ${requestScope.name}
<%--jsp的el表达式 去替代jsp的输出表达式--%>
(3) <h3>name</h3>${name} --- 使用方式三
</body>
</html>
三、Jsp的执行两个阶段
举例:
1)hello.jsp---->通过web容器 "翻译" 成 hello_jsp.java文件
会将当前jsp页面中所有内容通过JspWriter:输出对象给浏览器中拼接内容
class hello_jsp ---->规定了jsp的生命周期 :_jspInit() _jspService(请求对象,响应对象)
_jspDestory()
2)第二个阶段:需要将hello_jsp.java----hello_jsp.class ---字节码文件对象 (web容器通过
反射机制(内省机制)获取当前类对象,调用_jspservice:程序入口方法)
Jsp本质就是 Servlet
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase{}
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {}
四、jsp的三大指令
<%@Page
import:导入java的一些核心类或者接口
contentType="text/html;charset=UTF-8" 设置jsp的内容格式以及编码
language="java":只支持Java语言
buffer:jsp默认的缓冲区大小(jsp中可以不断向浏览器输出:写数据过去):默认8kb(一般不用设置)
errorPage:当jsp发生异常,跳转到错误页面上
session:是否启用HttpSession域对象, (不用去设置,默认就是自动启动)
isErrorPage:当前页面是否为错误页面 默认false
%>
<%@include jsp静态导入%>
file属性:导入资源文件静态导入:原理
不会将被导入的jsp文件单独进行翻译和编译,而只是将当前被导入jsp文件的内容加载进来,节省内存!<%@taglib 导入jsp的核心标签库jstl%>
1、%@Page%
<%@ page contentType="text/html;charset=UTF-8"
import="java.util.*"
language="java"
buffer="8kb"
errorPage="error.jsp" ---- 当程序错误时跳转到error.jsp包,需创建
session="false"
isErrorPage="false"
%>
<%--
import:导入java的一些核心类或者接口
contentType="text/html;charset=UTF-8" 设置jsp的内容格式以及编码
language="java":只支持Java语言
buffer:jsp默认的缓冲区大小(jsp中可以不断向浏览器输出:写数据过去):默认8kb(一般不用设置)
errorPage:当jsp发生异常,跳转到错误页面上
session:是否启用HttpSession域对象, (不用去设置,默认就是自动启动)
isErrorPage:当前页面是否为错误页面 默认false
--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--jsp的脚本--%>
<%
//定义变量
int i = 100 ;
System.out.println("i:"+i);//控制台打印
//向浏览器写入内容
out.write("i:"+i);
int b = 10 / 0 ;
%>
<%--jsp的输出表达式--%>
i的值是:
<%=i%>
</body>
</html>
2、%@include% ---- 静态导入
原理:
不会将被导入的jsp文件单独进行翻译和编译,而只是将当前被导入jsp文件的内容加载进来,节省内存!
表达式:
${pageContext.request.contextPaht}:获取的当前上下文路径
基本操作
1)创建inlude.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Jsp的静态导入</title>
</head>
<body>
<div>
<%@include file="header.jsp"%> ---- 嵌套header.jsp
<%--轮播图--%>
<img src="${pageContext.request.contextPath}/img/1.jpg"/>
</div>
</body>
</html>
2)创建header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>头部页面</title>
</head>
<body>
<div style="background-color: olivedrab;">
<a href="#">我的商品</a>
<a href="#">手机数码</a>
<a href="#">鞋靴箱包</a>
<a href="#">笔记本专区</a>
</div>
</body>
</html>
3、%@taglib%
一、tablib指令需要导入两个jar包
1)jstl(jsp的标签库)---jar包
2)statndard.jar
一般:核心标签库使用最多
二、导入jstl核心库
prefix:前缀名称 c
uri:统一资源定位:关联核心库的地址
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
三、核心标签库
1、c:if 标签 jsp提供一个判断功能
test属性:从域对象中获取数据,判断数据结果为true成立,否则不成立!
test属性:内置的关键字, empty 从域对象中获取内容 判断对象是否为空
<c:if test="${empty list}">
list对象为空
</c:if>
2、c:choose标签
c:choose标签就类似于Java语法中if...esle if...else...
c:choose:进入到选择语句
c:when:具体的分支判断语句
test属性:从域对象中获取数据,判断结是否成立,true:则执行when语句.否则不执行
c:otherwise:当上面的c:when标签结果不成立,执行c:otherwise的语句
<%
int i = 10 ;
//将i的存储在域对象中
request.setAttribute("i",i);
%>
<c:choose>
<%-- 具体判断语句--%>
<c:when test="${i==1}">
<h4>星期一</h4>
</c:when>
<c:when test="${i==2}">
<h4>星期二</h4>
</c:when>
<c:when test="${i==3}">
<h4>星期三</h4>
</c:when>
<c:when test="${i==4}">
<h4>星期四</h4>
</c:when>
<c:when test="${i==5}">
<h4>星期五</h4>
</c:when>
<c:when test="${i==6}">
<h4>星期六</h4>
</c:when>
<c:when test="${i==7}">
<h4>星期日</h4>
</c:when>
<%--如果上面都不匹配--%>
<c:otherwise>
<h4>非法数据</h4>
</c:otherwise>
</c:choose>
3、c:foreach标签
1)低级用法:
c:foreach标签类似于Java中的普通for循环
属性:
var:循环中的变量名称
beigin:初始索引
end:结束索引
step:偏移量(步长语句)
varStatus:属性值,循环中的变量状态
遍历:
属性值.内置属性名称:count:序号(1开始)
index:索引(0开始)
<c:forEach begin="0" end="10" var="i" step="1" varStatus="status">
${status.index} - ${i} <br/>–%>
${status.count} - ${i} <br/>
</c:forEach>
2)高级用法
从后台获取List列表数据,通过c-forech进行遍历
属性:
c:foreach
var:循环中的变量
items:从后台域对象中获取数据 ${绑定的属性名称}
varStauts:循环中的变量状态
<%
//创建List集合对象
List<String> list = new ArrayList<>() ;
//List<User> username password
list.add("张三") ;
list.add("李四") ;
list.add("王五") ;
//将list集合存储域对象中
request.setAttribute("list",list);
%>
<c:forEach var="i" items="${list}" varStatus="status">
${status.count} - ${i}<br/>
</c:forEach>