第 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
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String msg = (String)session.getAttribute("msg"); if(msg == null){ msg = ""; } %> <h2>登录</h2> <div style="color: red"><%=msg%></div> <% // 清空session session.removeAttribute("msg"); %> <form action="/demo/login" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="text" name="password"><br/> 验证码:<input type="text" name="verify_code"> <img src="/demo/code" id="code"> <a href="javascript:changeImage()">换一张</a> <br/> <input type="submit"> </form> <script> function changeImage(){ let code = document.getElementById("code"); code.src = "/demo/code?" + new Date().getTime(); } </script>
admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 从session中获取 // String username =(String)session.getAttribute("username"); // 从cookie中获取 String username = null; Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie c :cookies){ if(c.getName().equals("username")){ username = c.getValue(); break; } } } if(username == null){ request.getSession().setAttribute("msg", "用户未登录"); response.sendRedirect("login.jsp"); } %> <h2>欢迎<%=username%></h2>
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 < length; i ++){ int index = random.nextInt(code.length()); sb.append(code.substring(index, index+1)); } return sb.toString(); } public static void main(String[] args) throws IOException { ImageUtil.writeImage(ImageUtil.getVerifyCode(4), new FileOutputStream("1.jpg")); } }
第 5 章 : JSP 指令
课时 19 page 指令
page
include 静态包含
taglib 导入标签库
指令格式
<%@指令名 attr1="" attr2="" %>
一般放在文件最上方,可以有多个
page
<%@page language="java" import="java.util.*,java.net.*" pageEncoding="UTF-8" contentType="text/html; charset=utf-8" errorPage="errorPage.jsp" %>
pageEncoding 指定页面编码
contentType 响应头
如果两个参数只有一个,那么默认为设置的那个
如果两个参数都没有设置,那么默认为 iso
import 导包,可以出现多次
errorPage 页面出错跳转
isErrorPage=“true” 是否为处理错误的页面,会设置状态码为 500,可以使用 exception
eg:
exception.printStackTrace(response.getWriter());
web.xml 配置错误页面
<error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error500.jsp</location> </error-page> <error-page> <excepiton-type>java.lang.RuntimeException</excepiton-type> <location>/error.jsp</location> </error-page>
autoFlush 指定缓冲区满时是否自动刷新
buffer 缓冲区大小,默认 8kb
isELIgnored 是否忽略 EL 表达式,默认为 false,不忽略
基本不用
language 指定当前 jsp 编译后的语言类型,默认为 java
extends 指定当前页面生成 Servlet 的父类
isThreadSafe 是否支持并发访问 默认为 false,为 true 已过时
info 信息
session 是否支持 session,如果为 false,就没有 session 对象
课时 20 pageContext 对象
9 大内置对象
out JspWriter response.getWriter() 发送文本数据
config ServletConfig this.ServletConfig
page this,当前 jsp 对象
pageContext 页面上下文对象 一个顶 9 个
exception 只有在错误页面中使用
request HttpServletRequest
response HttpServletResponse
application ServletContext
session HttpSession
Servlet 中有大个域对象,
JSP 中有四个域对象:
ServletContext 整个应用程序
session 整个会话,一个会话中只有一个用户
request 一个请求链
pageContext 一个 jsp 页面,当前页面标签之间共享数据
// 代理其他域对象 pageContext.setAttribute("key", "value", PageContext.SESSION_SCOPE) // 全域查找,从小到大page、request、response、application pageContext.findAttribute("key"); // 获取其他内置对象
课时 21 include 和 taglib 指令
1、include 静态包含 jsp 编译成 java 文件时完成
<%@include file="demo.jsp" %>
2、tablib 导入标签库
<%@taglib prefix="s" uri="/tags" %> <s:text>
prefix 指定标签库前缀
uri 指定标签库位置
第 6 章 : JSP 动作标签
课时 22 JSP 动作标签
<jsp:forword> 转发 RequestDispatcher.forword
<jsp:include> 包含 RequestDispatcher.include
<jsp:param> 传递参数
a.jsp 动态包含 b.jsp,并传递参数
<jsp:forward page="b.jsp"> <jsp:param name="key1" value="value1"></jsp:param> <jsp:param name="key2" value="value2"></jsp:param> </jsp:forward>
b.jsp
<%=request.getParameter("key1")%> <%=request.getParameter("key2")%>
课时 23 JSP 在 web.xml 中也可以配置
开发自动重启
tomcat/conf/context.xml
<Context reloadable="true"> </Context>