第一章 JSP
1.概述
1.1 JSP是什么
java Server Pages,中文Java服务器页面
本质 : 简化的Servlet设计,动态网页技术标准,技能书写Servlet代码又能书写HTML代码
1.2 在JSP中书写代码
需求 :
-
在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
-
将这个字符串展示在浏览器上;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
1. 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
2. 将这个字符串展示在浏览器上;
--%>
<%
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format1 = format.format(date);
System.out.println("format1"= + format1);
response.getWriter().println(format1);
LocalDateTime now = LocalDateTime.now();
response.getWriter().println(now);
LocalDate now1 = LocalDate.now();
response.getWriter().println(now1);
LocalTime now2 = LocalTime.now();
response.getWriter().println(now2);
%>
</body>
</html>
2.JSP的运行原理
IntilliJ IDEA借助tomcat发布web项目的机制是动态发布(为每一个web项目创建一个单独的发布文件)。我们可以通过tomcat其中日志中的CATALINA_BASE路径找到我们当前这个JSP页面在tomcat中的位置 :
找到这个目录后,会看到以下3个文件夹:
打开tomcat目录:
打开demo01_jsp.java文件后,发现我们在JSP页面上写的代码都在_jspService方法中
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write('\r');
out.write('\n');
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format1 = format.format(date);
System.out.println("format1 = " + format1);
response.getWriter().println(format1);
LocalDateTime now = LocalDateTime.now();
response.getWriter().println(now);
LocalDate now1 = LocalDate.now();
response.getWriter().println(now1);
LocalTime now2 = LocalTime.now();
response.getWriter().println(now2);
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
-
<% java代码 %>中书写的代码被直接解析成java代码
-
html部分都被out.write(" ")方法以字符串的形式拼接,然后响应给浏览器
-
在这个java文件中有个_jspService,这个方法有两个参数request,response。由此可看出JSP本质上就是一个Servlet。
3.JSP中书写java代码的三种方式
在JSP页面的body标签中,可以直接书写html代码和JS代码。但是,如果在JSP页面中书写java代码。必须遵循固定的格式,才能够生效;
JSP页面中书写java代码有三种方式:1.脚本片段;2.脚本声明;3.脚本表达式
方式一 :脚本片段
脚本片段指的是一段java代码。书写格式:<% java 代码 %>
【示例】
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
response.getWriter().println()任意数据
response.getWriter().write//只能输出字符 字符数组 字符串
--%>
<%
response.getWriter().println("hello jsp");
response.getWriter().write(65);
%>
</body>
</html>
方式二 : 脚本声明
脚本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就行需要一个新的技术——脚本声明。
脚本声明的格式:<%! Java代码 %>
【示例】声明成员变量
<%@ page contentType="text/html;charset=UTF‐8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%‐‐
成员变量 int num = 0;
public void method(){}
‐‐%>
<%!
int num = 10;
public void method(){}
%>
</body>
</html>
方式三 : 脚本表达式
虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response向页面输出内容——这个就是脚本表达式。
脚本表达式的格式:<%= 内容 %> 等价于:out.print(内容)
【示例】在页面输出信息
<%@ page contentType="text/html;charset=UTF‐8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("hello out");
response.getWriter().println("response");
%>
<%="内容"%>
</body>
</html>
小结 :
-
脚本表达式 <%= str %> :在页面输出内容,在service方法中起作用;
-
脚本片段 <% %> :在service方法中,原样输出的代码片段;
-
脚本声明 <%! String str = "内容" %> :定义成员变量;
write() 和 print()区别
-
write() : 仅支持输出字符类型数据,字符,字符数组,字符串等
-
print() : 可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出。
response.getWriter().println();
response.getWriter().write('c');
out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。
response.getWriter().println();和out.write(); 区别
-
执行原理不同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。
-
out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,而response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面。
4.JSP页面常用对象
JSP页面中书写的代码最终都会翻译到_jspService()方法中, 这个方法中有两个入参:
HttpServletRequest对象 ,HttpServletResponse对象。
所以说,JSP的本质就是一个Servlet。我们可以直接在JSP页面上使用这两个对象。
第二章 EL表达式
1.EL概述
1.1 引入
脚本表达式在JSP页面上书写起来比较麻烦。而在页面上取值在开发中使用的又比较多,所以Sun公司为了简化在页面上的取值操作。
${表达式内容}
1.2 EL 简介
EL全称: Expression Language
作用:代替jsp中脚本表达式的功能,简化对java代码的操作,从【域对象】中取值。 EL表达式简化<%= %>方式取值
EL语法表达式的格式:${表达式内容}
2.EL取值
2.1 JSP的四大域对象
page域 request域 session域 application域
通常用EL表达式${表达式内容}从域对象取值
2.2 EL表达式从四大域中取值
2.3 EL表达式搜索数据
EL表达式取值的时候也可以不指定域,如果取值的时候不指定域对象。就会按照从page域--->request域--->session域--->servletContext域从小到大逐级根据name属性值查找。
2.4 EL表达式从cookie中取值
格式 : ${cookie.cookie名称.value} 取出单个cookie的值
3.EL运算符
EL表达式的运算符主要有以下几类:算术运算,关系运算,逻辑运算,三元运算,empty运算符。
3.1 算术运算
进行算术运算的符号,主要包括:加,减,乘,除
3.2 关系运算
关系运算符是判断两个数据的大小关系的,关系运算符有:==,!=,<,<=,>,>=
3.3 逻辑运算
逻辑运算符包括:&& ,||,!
3.4 三元运算
表达式1 ? 表达式2 : 表达式3
${n1>=n2?"正确":"错误!"}
3.5 empty运算
${empty 表达式};
注 : not empty 可以用在EL表达式中,判断非空的情况
EL表达式小结
EL : Expression Language
EL语法 : ${表达式}
作用 : 简化脚本表达式的取值,简化<%= request.getAttribute("name") %> ===> ${name}
jsp的四大域对象
page域 pageContext pageContext.setAttrubute() pageContext.getAttribute() JSP特有 作用范围:当前的JSP页面
request域 request request.setAttribute() request.getAttribute() 作用范围:一次请求和响应之间
session域 session session.setAttribute() session.getAttribute() 作用范围:会话期间(多次请求和响应)
servletContext域 application application.setAttribute() application.getAttribute() 作用范围:整个项目;
jsp从四大域中取值(指定域对象)
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
JSP搜索域对象中的值:page --- request --- session --- servletContext
${name}
第三章 JSTL标签库
1.JSTL概述
1.1 JSTL引入
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSTL</title>
</head>
<body>
<%
int[] arr = {123,456,789};
for (int i : arr) {
out.println("<h1>"+i+"</h1>");
}
%>
</body>
</html>
1.2 JSTL是什么
标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL
使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的标准提供自己的实现,以获取最佳性能
1.3 JSTL核心标签库
2.JSTL标签引用
2.1 安装JSTL
JSTL标签是将一段java代码功能封装成一个标签来使用。所以,我们使用JSTL标签之前必须导入被封装的java代码---jar包。JSTL标签库主要依赖以下两个jar包:
在IDEA的web项目的WEB-INF目录下创建一个lib文件夹,然后将jar包复制到这个文件夹里。选中这些jar包,右键---add as library即可将jar包导入到项目中。
2.2 将标签库资源引入JSP页面
在JSP页面中通过以下标签,通过taglib标签引入JSTL资源
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- prefix:是jstl标签在使用的时候的前缀;
-
uri:是标签库的资源路径;
2.3 在JSP页面中使用JSTL标签
在JSP页面中书写"<c: ",如果出现如下图的提示则说明标签库引入成功,我们可以根据提示信息使用自己需要的标签。
3.常用JSTL标签
3.1 c:if标签
3.1.1 c:if标签的作用
<c:if test="条件判断" >标签的作用相当于java中的if判断语句
3.1.2 属性
test : if的判断条件
3.2 c:foreach标签
3.2.1 c:foreach标签的作用
<c:foreach>标签的作用相当于java中的for循环
3.2.2 c:foreach标签的属性
var:在不循环对象的时候,保存的是控制循环的变量;在循环对象的时候,保存的是被循环对象中的元素
items:指定要循环的对象
varStatus:保存了当前循环过程中的信息(循环的开始、结束、步长、次数等)
begin:设置循环的开始
end:设置循环的结束
step:设置步长——间隔几次循环,执行一次循环体中的内容
3.3 choose标签
3.3.1 choose标签作用
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。
三个标 签组合发挥java代码if(){}else if(){} else{}语句的作用。
3.3.2 choose标签子标签
<c:when>,相当于else if(){}。
<c:when>标签含有test属性,作用与if相同<c:otherwise>,相当于else{}。
3.3.3 choose标签注意事项
三个标签必须组合使用,一组标签中不能出现两个<c:otherwise>
3.3.4 choose标签演示
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/switchServlet")
public class SwitchServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//实现switch功能
int temp = 7;
switch (temp){
case 1:
System.out.println("T1");
break;
case 2:
System.out.println("T2");
break;
case 3:
System.out.println("T3");
break;
case 4:
System.out.println("T4");
break;
case 5:
System.out.println("T5");
break;
default:
System.out.println("你输入错误!");
}
//转发到servlet
request.setAttribute("temp",temp);
//转发到choose.jsp
request.getRequestDispatcher("/choose.jsp").forward(request,response);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:choose>
<c:when test="${temp == 1}">
<c:out value="T1"></c:out>
</c:when>
<c:when test="${temp == 2}">
<c:out value="T2"></c:out>
</c:when>
<c:when test="${temp == 3}">
<c:out value="T3"></c:out>
</c:when>
<c:when test="${temp == 4}">
<c:out value="T4"></c:out>
</c:when>
<c:when test="${temp == 5}">
<c:out value="T5"></c:out>
</c:when>
<c:otherwise>
<c:out value="输入有误"></c:out>
</c:otherwise>
</c:choose>
</body>
</html>
访问对应的URL
效果 :