Java Server Pages
jsp 本质就是 Servlet
jsp:在原有 html 基础上添加 java 脚本
分工:
jsp 显示数据
servlet 处理数据
jsp -> servlet -> jsp
jsp 组成:
1、html + java 脚本 + jsp 标签(指令)
2、9 个内置对象:
request
response
session
application
pageContext
config
out
page
exception
3、3 种脚本
Java代码片段,多条代码
Java表达式,一条代码
声明成员
课时 2 JSP 中 Java 脚本的演示
html 中的 base 标签
访问局部变量:
访问成员变量:
列表循环
课时 3 JSP 和 Servlet 分工的案例
计算器示例
- 获取表单数据 form.jsp
- 把字符串转换成 int 类型
- 进行加法运算得到结果
- 保存数据结果到 request 中
- 转发到 result.jsp
处理流程
form.jsp -> servlet -> result.jsp
代码文件
form.jsp
CalculateServlet.java
package com.pengshiyu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CalculateServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取参数
String s1 = request.getParameter("num1");
String s2 = request.getParameter("num2");
// 类型转换
int num1 = Integer.parseInt(s1);
int num2 = Integer.parseInt(s2);
// 求和
int result = num1 + num2;
// 赋值
request.setAttribute("result", result);
// 转发
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
result.jsp
课时 4 JSP 的原理
jsp 是一个特殊的 servlet
第一次访问 jsp 页面时,服务器会把 jsp 编译成 java 文件,一个 servlet 类 再把.java 文件编译成.class 文件 创建该类对象 最后调用它的 service()方法
第二次访问同一个 jsp 页面时,直接调用 service()方法
流程图
第一次访问:
客户端 -> 服务器 -> jsp -> java -> class -> 创建Servlet对象 -> 调用service()方法
第二次之后访问:
客户端 -> 服务器 -> jsp -> 调用service()方法
jsp 编译为 java 类
jsp java类
===============================================
头 定义9个内置对象
为9个内置对象赋值
===============================================
体
html out.write()
原样搬运
out.print()
声明成员
注释不做翻译
===============================================
尾 做异常处理
课时 5 JSP 中的注释
html注释
jsp注释,不会输出到html文件中
第 2 章 : Cookie 处理
课时 6 Cookie 入门
Cookie 是 http 协议
由服务器创建保存到客户端浏览器的一个键值对 服务器响应头
Set-Cookie: key1=value1; key2=valu2
客户端浏览器下次请求时会带上 Cookie 客户端请求头
Cookie: key1=value1; key2=valu2
规定:
- 1 个 Cookie 最大 4kb
- 一个服务器最多给一个浏览器 20 个 cookie
- 一个浏览器最多保存 300 个 cookie
用途: 服务器跟踪客户端状态 购物车
JavaWeb 中使用:
(1)原始方法
response发送Set-Cookie响应头
request获取Cookie请求头
(2)便捷方法
response.addCookie()
request.getCookies()
示例 setCookie.jsp
设置Cookie
getCookie.jsp
获取Cookie
课时 7 Cookie 的生命
maxAge:Cookie 保存的最大时间,以秒为单位
maxAge>0 会保存到客户端硬盘
maxAge cookieA
/demo/jsp/index.jsp -> cookieA、cookieB
/demo/jsp/html/index.jsp -> cookieA、cookieB、cookieC
课时 9 Cookie 的域
domain 指定共享域名
eg:
cookie.setDomain('.baidu.com')
cookie.setPath('/')
共享:www.baidu.com、zhidao.baidu.com
第 3 章 : HttpSession
课时 10 HttpSession 入门
HttpSession 用于会话跟踪,保存在服务器端
1、Servlet 三大域对象:
- request
- session
- application
2、HttpSession 底层依赖: Cookie 或是 Url 重写
3、会话范围 用户首次访问服务器开始,到该用户关闭浏览器结束
4、Servlet 中获取 session
HttpSession = request.getSession()
5、jsp 中的 session 是内置对象,可以直接使用
课时 11-12 HttpSession 第一例
创建和获取 session
setSession.jsp 创建 session
设置Session
getSession.jsp 获取 session
获取Session
课时 13 HttpSession 第二例
登录
思路
login.jsp
-> LoginServlet 登录失败跳转回 login.jsp
-> admin.jsp 未登录跳转回 login.jsp
使用 session 关闭浏览器后就消失
可以使用 cookie 设置保存时长,持久化到浏览器中
login.jsp
登录
LoginServlet.java
package com.pengshiyu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession();
if ("admin".equals(username) && "123456".equals(password)) {
session.setAttribute("username", username);
// 添加Cookie
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24); // 保存一天
response.addCookie(cookie);
response.sendRedirect("session/admin.jsp");
} else {
session.setAttribute("msg", "账号或密码不正确");
response.sendRedirect("session/login.jsp");
}
}
}
admin.jsp
欢迎
课时 14 HttpSession 原理
sessionId 保存到 cookie 中
request.getSession(false) // 不会创建sessionId
request.getSession(true) // 会创建sessionId
request.getSession() // 会创建sessionId
课时 15 配置 session 最大不活动时间
public interface HttpSession {
long getCreationTime();
String getId(); // 获取sessionId
long getLastAccessedTime();
ServletContext getServletContext();
// 设置最大不活动时间,默认30分钟
void setMaxInactiveInterval(int var1);
int getMaxInactiveInterval();
// 让session失效
void invalidate();
// 查看是否为新的,判断客户端第一次请求
boolean isNew();
Enumeration getAttributeNames();
Object getAttribute(String var1);
void setAttribute(String var1, Object var2);
void removeAttribute(String var1);
}
web.xml 中配置 session 最大不活动时间
30
课时 16 session 之 url 重写
如果浏览器的 cookie 被禁用了,可以将 sessionId 在 url 参数中传递
// 如果cookie中没有会加到url上
response.encodeURL()
第 4 章 : 验证码
课时 17 生成图片(VerfiyCode 类)
package util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
public class ImageUtil {
public static void main(String[] args) throws IOException {
// 创建图片缓冲区
BufferedImage bi = new BufferedImage(50, 50, BufferedImage.TYPE_3BYTE_BGR);
// 得到绘制环境
Graphics2D g = (Graphics2D) bi.getGraphics();
// 设置白色
g.setColor(Color.WHITE);
// 绘制矩形,相当于绘制背景色
g.fillRect(0, 0, 50, 50);
// 设置红色
g.setColor(Color.RED);
// 写字
g.drawString("hello", 2, 35);
// 保存输出
ImageIO.write(bi, "JPEG", new FileOutputStream("1.jpg"));
}
}
结合登录验证的完整代码
login.jsp(VerifyCodeServlet) -> LoginServlet -> admin.jsp
login.jsp
登录
用户名:
密码:
验证码:
换一张
function changeImage(){
let code = document.getElementById("code");
code.src = "/demo/code?" + new Date().getTime();
}
admin.jsp
欢迎
LoginServlet.java
package com.pengshiyu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String verifyCode = request.getParameter("verify_code");
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
// 验证码校验
if(!code.equalsIgnoreCase(verifyCode)){
session.setAttribute("msg", "验证码不正确");
response.sendRedirect("session/login.jsp");
return;
}
if ("admin".equals(username) && "123456".equals(password)) {
session.setAttribute("username", username);
// 添加Cookie
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24); // 保存一天
response.addCookie(cookie);
response.sendRedirect("session/admin.jsp");
} else {
session.setAttribute("msg", "账号或密码不正确");
response.sendRedirect("session/login.jsp");
}
}
}
VerifyCodeServlet.java
package com.pengshiyu.servlet;
import util.ImageUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class VerifyCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code = ImageUtil.getVerifyCode(4);
request.getSession().setAttribute("code", code);
ImageUtil.writeImage(code, response.getOutputStream());
}
}
ImageUtil.java
package util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
public class ImageUtil {
public static void writeImage(String text, OutputStream output) throws IOException {
// 创建图片缓冲区
BufferedImage bi = new BufferedImage(50, 20, BufferedImage.TYPE_3BYTE_BGR);
// 得到绘制环境
Graphics2D g = (Graphics2D) bi.getGraphics();
// 设置白色
g.setColor(Color.WHITE);
// 绘制矩形,相当于绘制背景色
g.fillRect(0, 0, 50, 20);
// 设置红色
g.setColor(Color.RED);
// 写字
g.drawString(text, 8, 16);
// 保存输出
ImageIO.write(bi, "JPEG", output);
}
public static String getVerifyCode(int length){
String code = "1234567890";
StringBuilder sb = new StringBuilder();
Random random = new Random();
for(int i=0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?