Java Server Pages:Java服务端页面;
可以理解为一个特殊的页面,其中既可以定义HTML标签,又可以定义Java代码;
用于简化书写;
JSP本质上就是一个Servlet;
第一步:服务器解析请求消息,并找到index.jsp资源;
第二步:将jsp资源转化成Java代码(.java文件);
第三步:将Java代码转化成字节码(.class文件);
第四步:由字节码文件提供(对)访问(的响应);
JSP定义Java代码的方式;
1、<% 代码 %>:
定义的Java代码在service方法中,service方法中可以定义什么该脚本中就可以定义什么;
2、<%! 代码 %>:(用的少)
定义的Java代码,在JSP转换后的Java文件的成员位置,可以定义方法、变量、代码块等;
3、<%= 代码 %>:
定义的Java代码用于输出到页面上,是service方法中输出语句;
在JSP页面中,不需要获取或创建就直接可以使用的对象,就是内置对象;
request:请求对象;
response:响应对象;
out:字符输出流对象,可以将数据输出到页面上,和response.getWriter()类似,
区别是:response.getWriter()永远先输出(无论定义在哪);out对象定义在哪就在哪输出;
原理:在Tomcat服务器给客户端做出响应之前,Tomcat会先读取response缓冲区数据;
建议:尽量不要用response.getWriter()输出;
被改造的案例是《E016Web学习笔记-Cookie和Session(一)》的“四、Cookie案例”;
地址:https://blog.csdn.net/qq_29689343/article/details/100689669
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.nio.charset.StandardCharsets" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//1、获取cookie数组
Cookie[] cookies = request.getCookies();
//2、便利cookie数组,看是否存在lastTime
boolean flag = false;//记录lastTime是否存在
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("lastTime".equals(name)){
//3、存在——非首次访问
flag = true;
//获取当前时间字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format = sdf.format(date);
//设置cookie的值
//提前对空格进行URL编码
format = URLEncoder.encode(format, StandardCharsets.UTF_8);
cookie.setValue(format);
//设置cookie的存活时间
cookie.setMaxAge(60*60*24*30);//一个月
//发送cookie
response.addCookie(cookie);
//提前在value改变之前响应数据
String cookieValue = cookie.getValue();
//URL解码
cookieValue = URLDecoder.decode(cookieValue, StandardCharsets.UTF_8);
out.write("<h1>欢迎,您的上次访问时间是"+cookieValue+"</h1>");
}
}
}
//当cookie不存在
if(cookies==null || cookies.length==0 || !flag){
//不存在,首次访问
//获取当前时间字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format = sdf.format(date);
//提前对空格进行URL编码
format = URLEncoder.encode(format, StandardCharsets.UTF_8);
//设置cookie的值
Cookie cookie = new Cookie("lastTime",format);
//设置cookie的存活时间
cookie.setMaxAge(60*60*24*30);//一个月
//发送cookie
response.addCookie(cookie);
//提前在value改变之前响应数据
out.write("<h1>欢迎,您的首次访问!</h1>");
}
%>
<h1>啦啦啦。。。</h1>
<h1>啦啦啦。。。</h1>
<h1>啦啦啦。。。</h1>
</body>
</html>
用于配置JSP页面,导入资源文件;
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 属性名3=属性值4... %>
1、page:配置JSP页面;
常见属性:
contentType:等同于response.setContentType(),设置想用字符集的MIME类型和字符集;
高级的开发工具,例如IDEA可以以此来设置当前页面的编码,还可以用pageEncoding="编码方式"来设置;
language="java"——编程语言;
buffer="16kb"——缓冲区大小;
import:导包:
errorPage:错误页面,当前页面发生异常后跳转到的页面;
isEeeorPage:用来标识当前页面是否是错误页面,设置为true可以使用内置对象excption,默认是false;
2、include:页面包含,引入页面的资源文件;
有些页面共同包含某一部分;
代码示例:
<%@ include file="header.jsp"%>
3、taglib导入资源
格式:
<%@taglib prefix="自定义的前缀" uri="资源地址" %>
只能注释HTML代码片段,内容会发送到响应体里面;
<!-- 这是注释内容 -->
可以注释所有,内容不会发送到响应体里面;
<%-- 这是注释内容 --%>
在JSP页面中,不需要获取或创建就直接可以使用的对象,就是内置对象;
其中4个域对象(共享数据):
1、pageContext
真实类型:PageContext;
作用:当前页面共享数据,还可以获取其他8个对象;
2、request
真实类型:HttpServletRequest;
作用:一次请求访问多个资源;
3、session
真实类型:HttpSession;
作用:一次会话的多个请求间;
4、application
真实类型:ServletContext;
作用:所有用户间共享数据;
response
真实类型:HttpServletResponse;
作用:响应对象;
page
真实类型:Object;
作用:当前页面(Servlet)的对象,this;
out
真实类型:JspWriter;
作用:输出对象,将数据输出到页面;
config
真实类型:ServletConfig;
作用:Servlet的配置对象;
exception
真实类型:Throwable;
作用:异常对象,isEeeorPage属性值设置为true时,方可使用;