Java学习路线-51:JSP 快速入门(2)

简介: Java学习路线-51:JSP 快速入门(2)

第 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>

相关文章
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
427 3
|
3月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
613 1
|
3月前
|
SQL 算法 Java
零基础到精通的史上最强 Java 学习路线图推荐
史上最全Java学习路线图,涵盖基础语法、面向对象、数据结构与算法、多线程、JVM、Spring框架、数据库及项目实战,助你从零基础到精通Java开发,附完整代码与工具推荐。
246 3
零基础到精通的史上最强 Java 学习路线图推荐
|
3月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
301 1
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
518 3
|
4月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
400 0
|
3月前
|
SQL 算法 Java
适合自学的史上最强 Java 学习路线图分享
本路线图系统讲解Java从入门到进阶的学习路径,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架如Spring、数据库操作及项目实战,助你全面掌握Java开发技能,适合零基础及进阶学习。
896 0
|
3月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
640 0
|
3月前
|
缓存 Java API
2025 年小白也能轻松上手的 Java 最新学习路线与实操指南深度剖析
2025年Java最新学习路线与实操指南,涵盖基础语法、JVM调优、Spring Boot 3.x框架、微服务架构及容器化部署,结合实操案例,助你快速掌握企业级Java开发技能。
386 0
|
3月前
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
705 0