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

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

11-JSP 快速入门

第 1 章 : JSP 入门

课时 1 JSP 入门

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 标签

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%
// java语句
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
// http://localhost:8080/demo
%>

<%=basePath%>

<%
// 等价于
out.print(basePath);
%>

<br/>

<%!
// 成员变量
int a = 5;

// 成员方法
public void getValue(){
System.out.print("hi");
}
%>

<% int a = 10; // 局部变量 %>

访问局部变量:
<%=a%>

访问成员变量:
<%=this.a%>

<%
// 调用成员方法
getValue();
%>

列表循环
<ol>
<% for(int i=0; i< 10; i++){ %>
<li><%=i%></li>
<% } %>
</ol>

课时 3 JSP 和 Servlet 分工的案例

计算器示例

  1. 获取表单数据 form.jsp
  2. 把字符串转换成 int 类型
  3. 进行加法运算得到结果
  4. 保存数据结果到 request 中
  5. 转发到 result.jsp

处理流程

form.jsp -> servlet ->  result.jsp

代码文件


form.jsp

<form action="calculate" method="post">
<input type="text" name="num1" />
<input type="text" name="num2" />
<input type="submit" />
</form>

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

<%=request.getAttribute("result")%>

课时 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. 1 个 Cookie 最大 4kb
  2. 一个服务器最多给一个浏览器 20 个 cookie
  3. 一个浏览器最多保存 300 个 cookie

用途:

服务器跟踪客户端状态

购物车

JavaWeb 中使用:

(1)原始方法
response发送Set-Cookie响应头
request获取Cookie请求头

(2)便捷方法
response.addCookie()
request.getCookies()

示例

setCookie.jsp

<h2>设置Cookie</h2>
<%
Cookie cookie = new Cookie("key", "value");
response.addCookie(cookie);
%>

getCookie.jsp

<h2>获取Cookie</h2>
<%
Cookie[] cookies = request.getCookies();

if(cookies != null){
for(Cookie c: cookies){
out.print(c.getName() + ": "+ c.getValue());
}
}
%>

课时 8 Cookie 的路径

path 设置需要归还的 cookie 作用域

默认值为当前路径的父级目录

eg:
cookie.setPath('/')

eg:
cookieA /demo
cookieB /demo/jsp/
cookieC /demo/jsp/html/

/demo/index.jsp -> 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 是内置对象,可以直接使用

<%
void session.setAttribute(String name, String value);
Object session.getAttribute(String name);
void session.getAttribute(String name);
%>

课时 11-12 HttpSession 第一例

创建和获取 session

setSession.jsp 创建 session

<h2>设置Session</h2>
<%
session.setAttribute("name", "Tom");
%>

getSession.jsp 获取 session

<h2>获取Session</h2>
<%=session.getAttribute("name")%>

课时 13 HttpSession 第二例

登录

思路

login.jsp
-> LoginServlet 登录失败跳转回 login.jsp
-> admin.jsp 未登录跳转回 login.jsp

使用 session 关闭浏览器后就消失

可以使用 cookie 设置保存时长,持久化到浏览器中

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%
// 如果有msg就显示
String msg = (String)session.getAttribute("msg");
if(msg == null){
msg = "";
}
%>

<h2>登录</h2>

<div style="color: red"><%=msg%></div>

<%
// 清空session中的msg
session.removeAttribute("msg");
%>

<form action="/demo/login" method="post">
<input type="text" name="username"><br/>
<input type="text" name="password"><br/>
<input type="submit">
</form>

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

<%@ 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();
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>

课时 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<String> getAttributeNames();
Object getAttribute(String var1);
void setAttribute(String var1, Object var2);
void removeAttribute(String var1);

}

web.xml 中配置 session 最大不活动时间

<session-config>
<!-- 单位:分钟 -->
<session-timeout>30</session-timeout>
</session-config>

课时 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

<%@ 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

  1. include 静态包含
  2. 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 大内置对象

  1. out JspWriter response.getWriter() 发送文本数据
  2. config ServletConfig this.ServletConfig
  3. page this,当前 jsp 对象
  4. pageContext 页面上下文对象 一个顶 9 个
  5. exception 只有在错误页面中使用
  6. request HttpServletRequest
  7. respone HttpServletResponse
  8. application ServletContext
  9. session HttpSession


Servlet 中有大个域对象,

JSP 中有四个域对象:

  1. ServletContext 整个应用程序
  2. session 整个会话,一个会话中只有一个用户
  3. request 一个请求链
  4. 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 动作标签

  1. 转发 RequestDispatcher.forword
  2. 包含 RequestDispatcher.include
  3. 传递参数

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>
            </div>
目录
相关文章
|
6月前
|
人工智能 自然语言处理 达摩院
通义大模型:中国AI领域的新里程碑
本文介绍了阿里巴巴达摩院研发的“通义大模型”系列,该模型在2025年已成为AI领域的重要里程碑。通义大模型拥有超大规模参数、多模态融合、高效训练框架和中文优化等技术特点,在智能客服、内容创作、教育和企业服务等多个场景实现应用。未来,它将在多模态能力、小样本学习、安全性及应用场景拓展等方面持续突破,推动中国AI技术进步与行业智能化转型。
1808 18
|
存储 数据挖掘 大数据
深度解析Hologres计算资源配置:如何根据业务场景选择合适的计算类型?
【8月更文挑战第22天】Hologres是一款由阿里云提供的分布式分析型数据库,支持高效的大数据处理与分析。本文通过电商优化商品推荐策略的案例,介绍了Hologres中的计算组型与通用型配置。计算组型提供弹性扩展资源,适合大规模数据及高并发查询;通用型则适用于多数数据分析场景,具备良好计算性能。通过实例创建、数据加载、计算任务建立及结果查询的步骤展示,读者可理解两种配置的差异并根据业务需求灵活选择。
172 2
|
搜索推荐 API
淘宝商品数据洞察:解锁精准营销新策略
在快速变化的商业环境中,高效的营销策略对企业至关重要。通过API获取淘宝APP的商品细节数据,企业可以精准分析产品特性、强化卖点,并制定灵活的价格策略。利用用户画像实现个性化营销,选择最佳渠道并优化内容,从而提升品牌影响力。这一方法不仅帮助企业抓住目标消费者,还能增强市场竞争力,促进长期发展。
|
存储 Rust 编译器
30天拿下Rust之箱、包和模块
Rust语言使用模块系统来组织工程和代码。模块系统允许我们将相关的函数、类型、常量等组织在一起,形成一个逻辑上的单元。通过模块系统,我们可以隐藏实现细节,只暴露必要的接口,从而提高代码的可读性和可维护性。Rust的模块系统还支持路径依赖和重导出等功能,使得代码的组织更加灵活和方便。 Rust的模块系统中有三个非常重要的概念,分别是:箱(Crate)、包(Package)和模块(Module),下面逐一进行介绍。
147 1
30天拿下Rust之箱、包和模块
|
缓存 网络协议 Windows
一分钟解决Github连接慢或者无法连接,亲测有效!
一分钟解决Github连接慢或者无法连接,亲测有效!
5580 0
一分钟解决Github连接慢或者无法连接,亲测有效!
|
5天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
16天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1315 5
|
2天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。