1 JSP—概述(day16_cookie)
1.1 概念
- JSP全称Java Server Pages,是一种动态网页开发技术。
- 它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
1.2 作用
- JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
- 网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
- JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
- JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API
- JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持
2 JSP—原理
2.1 JSP本质上就是一个Servle
2.2 代码展示
2.2.1 先运行day16项目,找到项目运行配置目录
2.2.2 关闭项目重启
停掉项目,清除日志信息,
再运行项目,访问index.jsp页面,就会生成工作目录work
查看运行配置目录,
会新增一个work目录
2.2.3 查看work目录下的文件
2.2.4 查看work目录中的index_jsp.java源码
- 1、index_jsp类继承自HttpJspBase
2.2.5 在Tomcat源码中找到HttpJspBase
-
1、在Tomcat源码中找到HttpJspBase类
- org.apache.jasper.runtime.HttpJspBase
-
2、源码目录:
- apache-tomcat-8.5.63-src --> java --> org --> apache --> jasper --> runtime
- 3、发现HttpJspBase继承自HttpServlet
- 证明:JSP本质上就是一个Servlet
2.2.6 JSP如何用来简化书写的
- 1、index_jsp.java文件中同样存在_JspService方法,类似于servlet中的servlet方法
- 2、_JspService方法中定义了out对象
- 3、为out对象赋值
- 4、 out对象帮助我们输出了HTML代码
3 JSP—脚本
3.1 脚本概念
JSP定义java代码的方式
3.2 脚本位置 <% – java代码 – %>
3.3 脚本分类(JSP定义java代码的方式)
方式一、<% java代码 %>
方式二、<%! java代码 %>
方式三、<%= java代码 %>
3.3.1 方式一、<% java代码 %>
<% java代码 %>
此方式定义的代码,在service方法中,Service方法中可以定义什么,该脚本中就能定义什么
3.3.1 方式二、<%! java代码 %>
<%! java代码 %>
定义的java代码,会成为在jap转换后的java类的成员变量位置,不在service方法中,一般不使用
3.3.3 方式三、<%= java代码 %>
<%= java代码 %>
定义的java代码,会输出到页面上,输出语句中能定义什么,改脚本中就能定义什么,定义在Service方法中的脚本
案例:
输出a的值
输出字符串
4 JSP—的内置对象
4.1 内置对象的概念
在jap页面中,不需要获取和创建,可以直接使用的对象
4.2 JSP的九大内置对象
request:请求对象
response:响应对象
out:字符输出流对象,可以将数据输出到页面上,和response.getWrite()方法类似
4.3 out.write()和response.getWrite()的区别
response.getWrite()方法在任何时候,都会优先于out输出到页面
5 JSP—案例-改造Cookie案例
5.1 创建编辑home.jsp文件
将CookieServletLogin中post方法中的代码,放置到home.jsp文件的脚本中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page import="java.net.URLEncoder" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%
//1、获取素有的cookie,判断cookie的名称是不是lastTiMe
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie名为lastTime
//2、判断cookie,遍历cookie
if (cookies != null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
//4.判断名称是否是lastTime
if ("lastTime".equals(name)){ //存在该cookie,不是第一次访问,
//存在lastTime的cookie,将标识符设置成true
flag = true;
//获取当前时间字符串,重新设置cookie的属性值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
String format = sdf.format(date);
System.out.println("编码前"+format);
//设置URL编码
format = URLEncoder.encode(format, "utf-8");
System.out.println("编码后"+format);
cookie.setValue(format);
//设置cookie的存活时间
cookie.setMaxAge(30*24*60*60);
response.addCookie(cookie);
//相应数据:
//获取上次访问的时间
String time = cookie.getValue();
System.out.println("解码前"+time);
//URL解码
time = URLDecoder.decode(time, "utf-8");
System.out.println("编码后"+time);
response.getWriter().write("欢迎回来,您上次的访问时间是:"+time);
//找到之后就不再循环
break;
}
}
}
/*
* 如果cookie不存在的情况
* */
if(cookies==null || cookies.length==0 || flag == false){
//1、获取当前时间字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
System.out.println("编码前"+format);
//设置URL编码
format = URLEncoder.encode(format, "utf-8");
System.out.println("编码后"+format);
//2.创建cookie对象
Cookie cookie = new Cookie("lastTime",format);
//设置cookie的最大存活时间
cookie.setMaxAge(30*24*60*60);
response.addCookie(cookie);
//3、写出响应体数据
response.getWriter().write("您好,欢迎您首次访问");
}
%>
</body>
</html>
5.2 运行项目
访问路径:http://localhost:8080/day16/home.jsp