JSP入门
...大约 4 分钟
1. 概念
Java Server Pages
(java服务器端页面)可以理解为,一个特殊的页面;其中既可以指定定义html标签,又可以定义java代码,作用是用于简化书写,减少写过多的类,并更好的实现页面的交互功能。
2. 原理
JSP本质上就是一个Servlet。
2.1. 解析
- 启动一个JavaWEB项目,找到控制台中
Using CATALINA_BASE
中的路径C:\Users\HK\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Tomcat_8_5_311_Test
; - 打开该路径,在work路径下可以找到
.jsp
文件被转化的后的.java
文件和编译后的.class
文件; - 打开被转化后的
.java
文件,发现该类继承了org.apache.jasper.runtime.HttpJspBase
类; - 打开Tomcat的源码找到该类,可以发现该类继承了HttpServlet,因此JSP本质上就是一个Servlet。
3. JSP的脚本
JSP定义Java代码的方式,主要有下面三种:
<% 代码 %>
:定义的java代码,相当于在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。<%! 代码 %>
:定义的java代码,相当于在jsp转换后的java类的成员位置(成员变量、成员方法、静态代码块),比较少用。<%= 代码 %>
:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
3.1. 代码解析
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//写入到service方法中
System.out.println("hello jsp");
int i = 5;
String contextPath = request.getContextPath();
System.out.print(contextPath);
%>
<%! int i = 3;//相当于声明java的成员变量 %>
<%= i //定义的java代码的值,会输出到页面上,相当于out.print(i) %>
</body>
</html>
4. JSP的内置对象
在jsp页面中不需要获取和创建,可以直接使用的对象,一共有9个内置对象。
目前主要学习以下3个:
- request
- response
- out:字符输出流对象,可以将数据输出到页面上,和
response.getWriter()
类似。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>输出流区别</title>
</head>
<body>
<%!int i =8;//定义成员变量%>
<%-- 定义的java代码的值,会输出到页面上,相当于out.print(i) --%>
<%= i %//输出成员变量的值>
<% out.write("out");%>
<% response.getWriter().write("response");%>
<%-- 页面上的输出为 response 8 out --%>
</body>
</html>
response.getWriter()
和out.write()
的区别主要为,在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。因此response.getWriter()
数据输出永远在out.write()
之前。在实际使用中为避免混乱一般只用out.write()
。
5. 案例:改造Cookie案例
这种方式的代码很乱,后期会更多学习别的方式来简化。
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.UnsupportedEncodingException" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//1.设置响应编码
response.setContentType("text/html;charset=utf-8");
//2.从浏览器获取Cookie的数组
Cookie[] cs = request.getCookies();
//3.判断数组中是否存在Cookie内容
//3.1存在Cookie内容
if (cs != null && cs.length > 0) {
//4.设置标签判断是否存在名为lastTime的cookie,然后遍历Cookie数组
boolean flag = false;
for (Cookie c : cs) {
//5.判断是否存在名为lastTime的cookie
//5.1存在名为lastTime的cookie
if (c.getName().equals("lastTime")) {
//标签变为真
flag = true;
//5.1.1输出上次登录时间
%>欢迎你,你上次登录的时间为<%= URLDecoder.decode(c.getValue())%><%
//5.1.2调用getCookie()的方法获取经过处理后的当前时间
String nowTime = getCookie();
//5.1.3将当前的时间存到名为lastTime的cookie中,对上次登录的时间进行更新
c.setValue(nowTime);
//5.1.4更新名为lastTime的cookie的值
response.addCookie(c);
//5.1.5停止当前循环
break;
}
}
//5.2如果标签为假,不存在名为lastTime的cookie,用户首次登录
if (flag == false) {
firstTime(response);
%>欢迎你,这是你的首次登录<%
}
}
//不存在Cookie内容,用户首次登录
else {
firstTime(response);
%>欢迎你,这是你的首次登录<%
}
%>
<%!
/**
* 用户首次登录的方法
* @param response lastTime的Cookie
* @throws IOException
*/
private void firstTime(HttpServletResponse response) throws IOException {
//1.调用getCookie()的方法获取经过处理后的当前时间
String nowTime = getCookie();
//2.生成cookie
Cookie lastTime = new Cookie("lastTime", nowTime);
//3.设置过期时间为一个月
lastTime.setMaxAge(60 * 60 * 24 * 30);
//4.添加名为lastTime的cookie到浏览器
response.addCookie(lastTime);
}
%><%!
/**
* 获取当前的时间
* @return 处理后的当前时间
* @throws UnsupportedEncodingException
*/
private String getCookie() throws UnsupportedEncodingException {
//1.获取当前时间戳
Date date = new Date();
//2.对时间进行格式化
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy年MM月dd日 HH:mm:ss");
String formatTime = sdf.format(date);
//3.将格式化后的时间进行URL编码,防止乱码
String nowTime = URLEncoder.encode(formatTime);
return nowTime;
}
%>
</body>
</html>