JSP核心考点全解析:从入门到精通

第一章:JSP 与 Web 技术概论

1. Web 应用基本原理

  • B/S 架构(Browser/Server):用户通过浏览器访问服务器上的 Web 应用,无需安装客户端。
  • HTTP 请求/响应模型
    • 客户端(浏览器)发送 HTTP 请求(GET/POST 等);
    • 服务器接收请求,处理后返回 HTTP 响应(HTML 页面、JSON 等);
    • 无状态:每次请求独立,服务器默认不记住用户。

2. JSP 的优势

  • 跨平台:基于 Java,一次编写,到处运行(依赖 JVM)。
  • 组件重用:可复用 JavaBean、自定义标签等。
  • 与 Servlet 无缝集成:JSP 本质是 Servlet,可直接调用 Servlet API。

3. JSP 开发模式演进

模式结构缺点适用场景
纯 JSP所有逻辑写在 JSP 中代码混乱,难维护小型演示
Model 1(JSP + JavaBean)JSP 负责显示 + 控制,JavaBean 封装数据控制逻辑仍在 JSP,耦合度高简单应用
Model 2 / MVCServlet(Controller) + JavaBean(Model) + JSP(View)结构清晰,职责分离主流开发模式

常考点解析
MVC 中各角色作用

  • Model(模型):负责业务逻辑和数据访问(如 JavaBean、DAO);
  • View(视图):负责数据显示(如 JSP 页面);
  • Controller(控制器):接收请求、调用 Model、决定跳转到哪个 View(如 Servlet)。
📌 答题模板:
“MVC 模式将程序分为三部分:Model 处理数据,View 展示界面,Controller 协调两者。优点是解耦、易维护、便于团队分工。”

第二章:JSP 开发和运行环境

1. 核心组件

  • JDK:提供 Java 编译和运行环境;
  • Web 服务器(如 Tomcat):解析 HTTP 请求,执行 JSP/Servlet;
  • 浏览器:发送请求、渲染响应。

2. Tomcat 目录结构

目录作用
webapps存放所有 Web 应用(每个应用一个文件夹)
WEB-INF受保护目录,客户端无法直接访问
WEB-INF/classes存放编译后的 .class 文件
WEB-INF/lib存放项目依赖的 .jar
WEB-INF/web.xml部署描述符,可配置欢迎页、错误页、Servlet 映射等

常考点解析
为什么 WEB-INF 下的文件不能被客户端直接访问?
→ 出于安全考虑,防止用户直接下载敏感文件(如 .class、配置文件)。所有对 WEB-INF 的直接 URL 请求都会被 Tomcat 拒绝(返回 404)。

📌 答题关键:安全机制 + 受保护资源

第三章:JSP 基本语法

1. 脚本元素

语法名称作用注意事项
<%-- 注释 --%>隐藏注释仅在 JSP 源码中可见,不会发送到客户端安全注释方式
<%! ... %>声明定义成员变量或方法(属于生成的 Servlet 类)多用户共享,慎用
<% ... %>脚本片段写 Java 语句(if/for/赋值)插入到 _jspService() 方法中
<%= 表达式 %>表达式输出值(自动调用 out.print()不能加分号!

2. 指令元素(<%@ ... %>

include 指令静态包含

<%@ include file="header.html" %> 

编译时合并源码,生成一个 Servlet

page 指令:设置页面属性

<%@ page contentType="text/html;charset=UTF-8" import="java.util.*" errorPage="error.jsp" %> 

3. 动作元素(<jsp:xxx>

<jsp:forward>:请求转发(地址栏不变)

<jsp:forward page="result.jsp" /> 

<jsp:include>:动态包含

<jsp:include page="menu.jsp"> <jsp:param name="user" value="Tom" /> </jsp:include> 

运行时执行被包含页,再合并输出

常考点解析
<%@ include %><jsp:include> 的区别

对比项<%@ include %><jsp:include>
包含时机编译时运行时
生成 Servlet 数量1 个多个
能否传参✅(用 <jsp:param>
效率高(一次编译)略低(多次执行)
适用场景静态内容(页头/页脚)动态内容(权限菜单)
📌 答题模板:
“静态包含在翻译阶段合并代码,效率高但不能传参;动态包含在运行时执行,可传递参数,适合动态内容。”

第四章:JSP 内置对象(重中之重!)

1. 九大内置对象(无需声明,直接使用)

对象类型主要用途常用方法
requestHttpServletRequest获取客户端请求数据getParameter(), setAttribute(), getAttribute()
responseHttpServletResponse发送响应sendRedirect(), setContentType()
sessionHttpSession会话管理setAttribute(), getAttribute(), invalidate()
applicationServletContext全局上下文setAttribute(), getInitParameter()
outJspWriter页面输出print(), println()
pageContextPageContext获取其他对象getRequest(), getSession()
configServletConfigServlet 配置getInitParameter()
pageObject当前 Servlet 实例等价于 this
exceptionThrowable异常对象仅在 isErrorPage="true" 的页面可用

2. 四大作用域(按生命周期从小到大)

作用域对应对象生命周期典型应用
pagepageContext当前 JSP 页面执行期间临时变量
requestrequest一次请求(含 forwardServlet 转发数据给 JSP
sessionsession一次会话(创建 → 超时/销毁)用户登录状态、购物车
applicationapplicationWeb 应用启动 → 停止全局计数器、数据库连接池

常考点解析

  • 如何取值? 统一使用 xxx.setAttribute("key", value)xxx.getAttribute("key")
  • forward 后 request 数据还在吗?在!(同一请求)
  • redirect 后 request 数据还在吗?不在!(新请求)
📌 必背口诀:
“page 页内,request 转发,session 会话,application 全局。”

第五章:Cookie 及会话追踪

  • 存储位置:客户端(浏览器)

读取

Cookie[] cookies = request.getCookies();if(cookies !=null){for(Cookie ck : cookies){if("name".equals(ck.getName())){/* ... */}}}

创建与发送

Cookie c =newCookie("name","value"); c.setMaxAge(3600);// 有效期 1 小时(秒),0=删除 response.addCookie(c);

2. Session

  • 存储位置:服务器端
  • 追踪机制:默认通过 Cookie(JSESSIONID),若 Cookie 禁用则用 URL 重写(response.encodeURL(url)

创建与使用

HttpSession session = request.getSession();// 自动创建或获取 session.setAttribute("user","Tom"); session.invalidate();// 销毁会话

3. 会话追踪四种方式

  1. Cookie(简单,但不安全)
  2. URL 重写(在 URL 后加 ;jsessionid=xxx
  3. 隐藏表单字段<input type="hidden" name="sessionid" value="xxx">
  4. Session(最常用,安全可靠)

常考点解析
Cookie 与 Session 的区别

对比项CookieSession
存储位置客户端服务器
安全性低(可篡改)
大小限制≤ 4KB无严格限制
生命周期可设过期时间默认 30 分钟(可配置)
依赖依赖浏览器启用 Cookie默认依赖 Cookie,可 URL 重写
📌 应用题:
“用 Session 实现购物车” → 将商品列表存入 session.setAttribute("cart", list),后续页面从 session 取出即可。

第六章:JavaBean 和表单处理

1. JavaBean 规范

  • 公共类(public class
  • 无参构造方法
  • 私有属性(private
  • 公共 getter/setter(getXxx(), setXxx()

2. JSP 动作标签

<!-- 创建或查找 Bean --> <jsp:useBean scope="session" /> <!-- 批量赋值(表单 name 必须 = Bean 属性名) --> <jsp:setProperty name="user" property="*" /> <!-- 单独赋值 --> <jsp:setProperty name="user" property="name" param="username" /> <!-- 取值 --> <jsp:getProperty name="user" property="name" /> 

常考点解析
<jsp:setProperty property="*"> 的使用条件
→ HTML 表单中的 name 属性必须与 JavaBean 的属性名完全一致(包括大小写)。

📌 示例:
表单 <input name="email"> → Bean 必须有 setEmail(String email) 方法。

第七章:JSP 中文件操作

1. File 类常用方法

  • exists():判断文件/目录是否存在
  • createNewFile():创建新文件
  • mkdirs():创建多级目录
  • delete():删除文件/空目录

2. 数据流

  • 字节流FileInputStream / FileOutputStream(处理二进制)
  • 字符流FileReader / FileWriter(处理文本,注意编码)

3. 文件上传

  • 表单必须设置:enctype="multipart/form-data"
  • 使用第三方库:Commons-FileUpload(主流)或 SmartUpload
  • 核心类:DiskFileItemFactory, ServletFileUpload

常考点解析
文件上传表单的关键属性
method="post" + enctype="multipart/form-data"

📌 错误示例:
若忘记 enctyperequest.getParameter() 将无法获取文件内容。

第八章:应用 JDBC 进行数据库开发

JDBC 编程六步曲

1.Class.forName("com.mysql.jdbc.Driver");// 加载驱动2.Connection conn =DriverManager.getConnection(url, user, pwd);3.Statement stmt = conn.createStatement();4.ResultSet rs = stmt.executeQuery("SELECT * FROM users");5.while(rs.next()){/* 处理结果 */}6. rs.close(); stmt.close(); conn.close();// 关闭资源

防 SQL 注入

使用 PreparedStatement 替代 Statement

String sql ="SELECT * FROM users WHERE name = ?";PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, name);// 自动转义

常考点解析
为什么用 PreparedStatement 能防注入?
→ 因为它将 SQL 语句和参数分开编译,参数被视为纯数据而非 SQL 代码。


第十章:Servlet 基础

Servlet 生命周期

  1. init():初始化(Web 应用启动时或首次请求时调用,仅一次
  2. service():处理请求(每次 HTTP 请求都调用,内部调用 doGet/doPost
  3. destroy():销毁(Web 应用停止时调用,仅一次

与 JSP 关系

  • JSP 最终会被 Tomcat 翻译成一个继承 HttpServlet 的类。
  • JSP = Servlet 的简化写法(侧重视图)

配置方式

注解(Servlet 3.0+):

@WebServlet("/login")publicclassLoginServletextendsHttpServlet{...}

web.xml(传统):

<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.LoginServlet</servlet-class></servlet><servlet-mapping><url-pattern>/login</url-pattern></servlet-mapping>

常考点解析
doGetdoPost 的区别
→ 分别处理 GET 和 POST 请求,开发者需重写对应方法。


第十一章:Servlet 过滤器和监听器

1. Filter(过滤器)

  • 作用:拦截请求/响应,进行预处理或后处理。
  • 典型应用
    • 统一解决中文乱码:request.setCharacterEncoding("UTF-8")
    • 权限检查:验证用户是否登录

核心方法

publicvoiddoFilter(ServletRequest req,ServletResponse res,FilterChain chain){// 前处理 chain.doFilter(req, res);// 放行// 后处理}

2. Listener(监听器)

  • 作用:监听 Web 应用中的事件。
  • 常用监听器
    • ServletContextListener:监听应用启动/销毁(可用于初始化全局资源)
    • HttpSessionListener:监听会话创建/销毁(可用于统计在线人数)

常考点解析

  • 过滤器解决中文乱码:在 doFilter 中设置 request.setCharacterEncoding("UTF-8")
  • 监听器统计在线人数:在 sessionCreated 中计数+1,sessionDestroyed 中-1。

第十二章:JSTL 标准标签库

1. 引入 JSTL

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

2. 核心标签

<!-- 条件判断 --> <c:if test="${age > 18}">成年人</c:if> <!-- 循环 --> <c:forEach items="${list}" var="item" varStatus="status"> ${status.index}: ${item} </c:forEach> <!-- 安全输出(防 XSS) --> <c:out value="${userInput}" /> 

3. EL 表达式 ${}

  • 语法:${作用域.属性名}${属性名}(自动按 page→request→session→application 查找)
  • 示例:${user.name} 等价于 <%= ((User)session.getAttribute("user")).getName() %>

常考点解析
<c:forEach>varStatus 属性
→ 提供循环状态信息,如 index(从 0 开始)、count(从 1 开始)。


🔑 终极复习建议(落实版)

  1. 背熟第四章:九大对象名称、类型、作用;四大作用域生命周期。
  2. 理解对比题
    • 静态 include vs 动态 include
    • Cookie vs Session
    • JSP vs Servlet
  3. 动手写代码
    • 用户登录(表单 → Servlet → Session → JSP 显示)
    • JDBC 查询(防注入版)
    • 过滤器统一编码

Read more

告别SQL恐惧症:我用飞算JavaAI的SQL Chat,把数据库变成了“聊天室”

告别SQL恐惧症:我用飞算JavaAI的SQL Chat,把数据库变成了“聊天室”

摘要 对于许多开发者而言,与数据库打交道意味着繁琐的语法记忆、复杂的联表查询以及令人头疼的性能优化。你是否曾希望,能用说人话的方式直接操作数据库?飞算JavaAI专业版的SQL Chat功能,正是这样一个革命性的工具。本文将分享我如何将它变为一个永不疲倦的“数据库专家同事”,用自然语言轻松搞定一切数据需求。 一、 痛点切入:我们与SQL的“爱恨纠葛” 还记得那次惨痛的经历吗?新接手一个庞大项目,急需从几十张表中查询一份用户行为报表。你对着模糊的需求文档,在Navicat或DBeaver中艰难地敲打着JOIN、WHERE和GROUP BY,一遍遍执行、调试,生怕一个疏忽就拉垮了线上数据库。这不仅是技能的考验,更是对耐心和细心程度的终极折磨。 尤其是面对以下场景,无力感尤甚: * 复杂查询:涉及多表关联、嵌套子查询、窗口函数,SQL语句长得像一篇论文。 * 性能优化:一条SQL跑起来慢如蜗牛,却不知从何下手添加索引或改写。 * 老项目溯源:面对命名随意的表和字段,理解业务逻辑如同破译密码。 我们需要的不是一个更漂亮的SQL客户端,而是一个能理解我们意图的“智能数据库搭档”

By Ne0inhk
Java之Volatile 关键字全方位解析:从底层原理到最佳实践

Java之Volatile 关键字全方位解析:从底层原理到最佳实践

文章目录 * 课程导言 * 适用对象 * 学习目标 * 第一部分:从并发三要素看volatile的定位 * 1.1 并发编程的三座大山 * 1.2 volatile的坐标:轻量级的同步利器 * 1.3 一个先导案例:感受volatile的魔力 * 第二部分:volatile与Java内存模型(JMM) * 2.1 为什么要JMM? * 2.2 JMM的核心结构:主内存 vs 工作内存 * 2.3 可见性问题的根源 * 2.4 volatile如何保证可见性? * 2.5 JMM对volatile的规范 * 第三部分:有序性与指令重排序 * 3.1 什么是指令重排序? * 3.2 重排序的潜在风险 * 3.3 volatile如何禁止重排序? * 3.

By Ne0inhk
【AI应用开发工程师】-分享Java 转 AI成功经验

【AI应用开发工程师】-分享Java 转 AI成功经验

Java 转 AI:别再死磕书本了,老司机带你飞! 文章目录 * Java 转 AI:别再死磕书本了,老司机带你飞! * ⭐AI 大模型应用开发全方位成长路线⭐ * 一、Java 老兵的 AI 转型焦虑:书本,你真的跟不上时代了! * 二、AI 导师,你的专属学习外挂! * 三、抱紧大腿,和 AI 大佬一起成长! * 四、拓展方案一:开源社区,你的 AI 练兵场! * 五、拓展方案二:小步快跑,项目实战是王道! * 六、拓展方案三:知识管理,告别“学了就忘”的魔咒! * 七、总结:转型 AI,一场充满乐趣的冒险!

By Ne0inhk
基于飞算 JavaAI 高效开发电商系统核心功能模块实战指南

基于飞算 JavaAI 高效开发电商系统核心功能模块实战指南

基于飞算 JavaAI 高效开发电商系统核心功能模块实战指南 在电商系统开发领域,效率与稳定性始终是开发者追求的核心目标。传统 Java 开发模式下,电商系统的商品管理、订单处理、支付集成等核心模块往往需要大量重复编码、复杂的异常处理和繁琐的性能优化工作。飞算 JavaAI 作为新一代智能开发工具,通过 AI 驱动的代码生成、自动化测试与性能优化能力,可将电商核心模块的开发效率提升 60% 以上。本文将以主流电商系统的三大核心模块为例,详细讲解如何利用飞算 JavaAI 实现从需求定义到上线部署的全流程高效开发。 一、飞算 JavaAI 电商开发环境准备 1.1 开发环境配置 打开Idea,戳进插件市场(快捷键:Ctrl+Alt+S),搜索‘CalEx-JavaAI’或者’飞算’,安装完成后重启,并登录飞算。 1.2 核心技术栈说明 技术组件版本飞算 JavaAI

By Ne0inhk