JSP 简介
什么是Java Server Pages?
- JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
- JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
- JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
- JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
为什么使用JSP?
- JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
- JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。
- JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。
JSP的优势
- 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
- 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
- 与静态HTML相比:静态HTML不包含动态信息。
JSP 的执行过程
- 首先,客户端发出请求(request ),请求访问JSP网页
- 接着,JSP Container将要访问的.JSP文件 转译成Servlet的源代码(.java文件)
- 然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行
- 最后把结果响应(response )给客户端
实例引入
创建一个Java EE Tomcat项目,在 index.jsp 文件里面,进行修改:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP 的入门学习</title>
</head>
<body>
<%
System.out.println("这里可以定义Java代码!");
%>
这里是HTML ~ ~ ~
</body>
</html>
启动tomcat服务器,访问该页面,页面内容如下:
这里是HTML ~ ~ ~
控制台输出:
这里可以定义Java代码!
项目被部署到的根目录为:~/Library/Caches/JetBrains/IntelliJIdea2020.1/tomcat/Tomcat_8_5_54_CookieStudy
在目录:apache/jsp/
中可以看到一个 index_jsp.java
文件,这个文件就是通过index.jsp的内容生成的。查看该文件部分内容:
![20200530231540](https://raw.githubusercontent.com/LeeYiua/FigureBed/master/img/May%202020/20200530231540.png)
通过这里与上面的jsp文件,可以知道,其实给文件就是通过index.jsp文件生成的。且该类继承了Servlet的子类。
JSP定义Java代码的方式
-
<% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
如上面
20200530231540.png
图中的内容都是在_jspService
类中的。 -
<%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
-
<%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
JSP的内置对象
jsp一共有9个内置对象,在jsp页面中不需要获取和创建,可以直接使用这九个对象。
如:
-
request
-
response
-
out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
javax.servlet.jsp.JspWriter out=null
response.getWriter()和out.write()的区别:
- 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
- response.getWriter()数据输出永远在out.write()之前
案例
原Java类实现:cookie案例
通过JSP实现:
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Cookie 练习</title>
</head>
<body>
<%
// 设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
// 获取所有Cookie
Cookie[] cookies = request.getCookies();
// 默认没有cookie为lastTime
boolean flag = false;
// 遍历cookie数组
if(cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
// 获取cookie的名称
String name = cookie.getName();
// 判断名称是否是:lastTime
if("lastTime".equals(name)) {
// 有cookie为lastTime,不是第一次访问
flag = true;
// 获取当前时间的字符串
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String stringDate = simpleDateFormat.format(date);
// 由于stringDate字符串中存在特殊字符(空格),需要URL编码
String encodeCookie = URLEncoder.encode(stringDate, "utf-8");
// 重新设置Cookie的值
cookie.setValue(encodeCookie);
// 设置cookie的存活时间:存活一个小时
cookie.setMaxAge(60 * 60);
// 在响应对象中添加该设置的cookie
response.addCookie(cookie);
// 响应数据
// 获取Cookie的value(时间)
String value = cookie.getValue();
// 对获取到的cookie值进行URL解码
String decodeValue = URLDecoder.decode(value, "utf-8");
%><h1>欢迎回来,您上次访问时间为:<%=decodeValue%></h1><%
// 已经完成了需求
break;
}
}
}
// 假如上面遍历了所有的cookie,都没有cookie为lastTime,或者用户的请求中没有cookie,说明用户是第一次访问
if(cookies == null || cookies.length == 0 || flag == false) {
// 获取当前时间的字符串
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String stringDate = simpleDateFormat.format(date);
// 由于stringDate字符串中存在特殊字符(空格),需要URL编码
stringDate = URLEncoder.encode(stringDate, "utf-8");
// 重新设置Cookie的值
Cookie cookie = new Cookie("lastTime", stringDate);
// 设置cookie的存活时间
cookie.setMaxAge(60 * 60);
// 重新发送cookie
response.addCookie(cookie);
%><h1>您好,欢迎您首次访问!</h1><%
}
%>
</body>
</html>
与原java程序相比,这里将页面的输出语句,直接单独定义为HTML标签。
开启服务器,浏览器访问:http://localhost:8080/CookieStudy_war_exploded/cookie.jsp
![20200531144010](https://raw.githubusercontent.com/LeeYiua/FigureBed/master/img/May%202020/20200531144010.png)
再次访问该网址:
![20200531144500](https://raw.githubusercontent.com/LeeYiua/FigureBed/master/img/June%202020/20200531144500.png)