网安
  • Develop
    • JAVA学习
      • 字节码
      • API开发
      • Web开发
      • 工程结构推荐
      • 创建第一个项目
      • 权限管控
      • 配置文件
      • 日志管理
      • 数据访问
      • 性能监控
      • IoC容器
      • Spring
      • Filter与Listener
      • jsp
      • MVC
      • servlet-1
      • servlet-2
      • servlet-3
      • servlet-4
      • FreeMarker
      • Thymeleaf
      • EL
      • SpEL
      • JSTL
      • 部署
      • JDBC
      • 数据库连接池
      • fastjson
      • jackson
      • XML
      • JSON
      • 序列化
      • Maven
      • 安装与使用
      • 工具
      • 爬虫
    • GO学习
      • GO
        • flag 包
        • goland 远程调试
        • GoReleaser
        • OS 包
        • time 包
        • 格式化输出
    • Lua学习
      • Lua
      • 基础语法
      • LuaJIT
      • 与系统交互
    • Pyhon
      • 基础
      • Django
      • CLI
      • miniforge
      • MockingBird
      • pdb
      • pyc
      • 装的我脑血栓要犯了
      • Python101
      • 反序列化
      • 爬虫
      • Pillow
      • 图像识别
      • flask
    • Speed-Ruby
      • 入门1
      • 入门2 对象
      • 入门3 创建命令
      • Encoding类
      • File类与Dir类
      • IO
      • Proc类
      • Time类与Date类
      • 正则
      • 错误处理与异常
      • 对象、变量和常量
      • 方法
      • 数值
      • 数组
      • 条件判断
      • 循环
      • 运算符
      • Socket编程
      • 字符串
      • 并发与线程
      • 块
      • 类和模块
      • 散列
    • Web
      • HTTP
        • Connection
        • HTTP 报文
        • Vary
      • 笔记
        • 跳转
        • 认证 & 授权
        • 同源策略(SOP)
        • 文件
    • Git 学习笔记
    • JSON
      • JSON 学习笔记
    • HTML
      • Speed-HTML
      • 语法学习
      • HTML字符实体
    • XML
      • XML 学习笔记
    • 计算机基础
      • 操作系统
      • 计算机组成
      • 算法
      • 内存
      • 字符编码
    • gnuplot 学习笔记
    • regex
  • Integrated
    • Linux
      • God-Linux
      • Secure-Linux
      • Power-Linux
      • IO模型
      • Speed-Linux
      • 发行版
      • 工具
      • 启动过程
      • 进程
      • 认证
      • 日志
      • 守护进程
      • 文件
      • 信息
      • VSFTP 配置案例
      • auditd
      • containerd
      • DNS 配置案例
      • Docker
      • Docker-Compose
      • firewalld 实验
      • gpg
      • Iptables
      • httpd
      • LAMP
      • mysql
      • nfs 配置案例
      • openssl
      • PAM
      • samba 配置案例
      • terraform
      • ufw
      • VSFTP 配置案例
    • Network
      • Speed-Net
      • Power-Net
      • SDN 笔记
      • DNS
      • TLS
    • Windows
      • Secure-Win
      • Speed-Win
      • ACL
      • LDAP
      • IPC$(Internet Process Connection)
      • PDB符号文件
      • 工作组
      • WinRM
      • 角色权限
      • 凭据
      • 签名
      • 日志
      • 认证
      • 协议
      • 信息
      • 应用
      • 组策略
      • 域
      • asp站点搭建
      • Exchange 搭建
      • Windows 故障转移集群
      • Windows 基础服务搭建
      • Windows 域搭建
      • 本地抓包
      • PowerShell 笔记
    • 容器
      • Docker
    • 数据库
      • Speed-SQL
      • Power-SQL
      • MSSQL
      • MySQL
      • Postgresql
      • Redis
      • MySQL大小写问题
      • 主键和外键
      • MySQL快速入门
      • 虚拟化
        • ESXi
        • vCenter
  • Plan
    • Mac-Plan
    • Misc-Plan
    • Team-Plan
    • Thinking-Plan
    • VM-Plan
  • Sercurity
    • Power-PenTest
    • BlueTeam
      • 安全建设
      • 分析
      • 加固
      • 取证
      • 应急
      • USB取证
      • 磁盘取证
      • 内存取证
      • ClamAV 部署
      • yara 实验
      • 安防设施搭建使用
      • ZIP明文攻击
      • 流量分析
    • Crypto
      • Crypto
        • 2020 9 G60攻防大赛
        • CTF
        • 2020 9 中能融合杯工控CTF
        • 2020 10 全国工业互联网安全技术技能大赛江苏省选拔赛
        • 2020 10 全国网络与信息安全管理职业技能大赛江苏场
        • 2020 11 I²S峰会暨工业互联网安全大赛
        • 2021 6 第二届I²S峰会暨工业互联网安全大赛
        • 2021-9-第七届工控信息安全攻防竞赛
        • 2021 9 第七届全国职工职业技能大赛某市县选拔赛
        • 2021 9 全国网络与信息安全管理职业技能大赛江苏场
        • 2021-10-G60攻防大赛
    • CTF
      • CTF
      • writeup
        • 2020 9 中能融合杯工控CTF
        • 2020 9 G60攻防大赛
        • 2020 10 全国工业互联网安全技术技能大赛江苏省选拔赛
        • 2020 10 全国网络与信息安全管理职业技能大赛江苏场
        • 2020 11 I²S峰会暨工业互联网安全大赛
        • 2021 6 第二届I²S峰会暨工业互联网安全大赛
        • 2021-9-第七届工控信息安全攻防竞赛
        • 2021 9 第七届全国职工职业技能大赛某市县选拔赛
        • 2021 9 全国网络与信息安全管理职业技能大赛江苏场
        • 2021-10-G60攻防大赛
    • ICS
      • PLC攻击
      • S7comm 相关
      • 工控协议
      • 上位机安全
      • Modbus 仿真环境搭建
      • siemens 仿真搭建实验
      • S7-300 启停实验
    • IOT
      • 无线电安全
        • RFID复制卡
        • RFID基础知识
        • WiFikiller
      • 硬件安全
        • DIY键盘嵌入指纹识别模块实验记录
        • Device-Exploits
        • HID-Digispark
        • HID-KeyboardLogger
        • HID-USBHarpoon
        • HID-USBKeyLogger
      • 固件安全
        • 固件安全
        • Dlink_DWR-932B 路由器固件分析
    • Mobile sec
      • 小程序安全
      • Android安全
    • PWN
      • SLMail溢出案例
      • PWN
    • Red Team
      • OS安全
        • Linux 安全
        • Exploits
        • NTLM中继
        • Windows 安全
        • Responder欺骗
        • Windows-LOL
      • Web_Generic
        • Top 10
          • RCE
          • Fileread
          • SQLi
          • SSRF
          • SSTI
          • Web Generic
          • XSS
          • XXE
      • Web_Tricks
        • JWT 安全
        • HTTP_request_smuggling
        • OOB
        • 绕过访问
      • 靶场
        • Hello-Java-Sec 学习
        • DVWA-WalkThrough
        • pikachu-WalkThrough
        • upload-labs-WalkThrough
        • XVWA-WalkThrough
        • XSS挑战-WalkThrough
      • 实验
        • flask
        • fastjson
        • Log4j
        • nodejs
        • Shiro
        • Spring
        • Weblogic
      • 前端攻防
      • IDOR
    • 安防设备
      • Exploits
      • Bypass 技巧
    • 后渗透
      • 权限提升
      • 后渗透
      • 权限维持
      • 实验
        • C2 实验
        • Exchange
        • 端口转发实验
        • 代理实验
        • 免杀实验
        • 隧道实验
    • 软件服务安全
      • Exploits
      • CS Exploits
      • 实验
        • Docker
        • Kubernetes
        • Mysql
        • Oracle
        • PostgreSQL
        • Redis
        • vCenter
    • 协议安全
      • Exploits
    • 信息收集
      • 端口安全
      • 空间测绘
      • 信息收集
    • 语言安全
      • 语言安全
        • 语言安全
      • GO安全
        • GO安全
        • Go代码审计
      • JAVA安全
        • JAVA安全
        • JAVA代码审计
        • JAVA反序列化
        • SpEL 注入
      • PHP安全
        • PHP安全
        • bypass_disable_function
        • bypass_open_basedir
        • phpinfo
        • PHP代码审计
        • PHP反序列化
        • PHP回调函数
        • 变量覆盖
        • POP
        • 弱类型
        • 伪协议
        • 无字母数字Webshell
      • Python安全
        • pyc反编译
        • Python安全
        • Python 代码审计
        • 沙箱逃逸
      • dotnet安全
      • JS安全
    • 云安全
      • 公有云安全
    • Reverse
      • Reverse
      • FILE
        • ELF
        • BMP
        • JPG
        • PE
        • PNG
        • ZIP
        • 文件头
      • 实验
        • PYAble
          • 2-逆运算
          • 1-基本分析
          • 3-异或
          • 4-Base64
          • 5-Base64换表
          • 6-动态调试
        • Windows
          • condrv.sys 内存损坏漏洞
    • 工具
      • Aircrack
      • BloodHound
      • Burp Suite
      • frp
      • CobaltStrike
      • Ghidra
      • fscan
      • Hashcat
      • IDA
      • merlin
      • Kali
      • Metasploit
      • Mimikatz
      • ModSecurity
      • Nmap
      • nps
      • nuclei
      • pupy
      • RedGuard
      • SET
      • sliver
      • Snort
      • Sqlmap
      • Suricata
      • Sysmon
      • uncover
      • Volatility
      • Wfuzz
      • Wireshark
      • xray
    • 安全资源
      • 靶机
        • VulnHub
          • DC
            • DC2 WalkThrough
            • DC1 WalkThrough
            • DC3 WalkThrough
            • DC4 WalkThrough
            • DC5 WalkThrough
            • DC6 WalkThrough
            • DC9 WalkThrough
            • DC8 WalkThrough
          • It's_October
            • It’s_October1 WalkThrough
          • Kioptrix
            • Kioptrix2 WalkThrough
            • Kioptrix3 WalkThrough
            • Kioptrix4 WalkThrough
            • Kioptrix5 WalkThrough
          • Mission-Pumpkin
            • PumpkinGarden-WalkThrough
            • PumpkinFestival WalkThrough
            • PumpkinRaising WalkThrough
          • Symfonos
            • symfonos1 WalkThrough
            • symfonos2 WalkThrough
            • symfonos3 WalkThrough
            • symfonos5 WalkThrough
        • Wargames
          • Bandit
            • Bandit-WalkThrough
      • 面试问题
        • 面试问题
Powered by GitBook
On this page
  • 什么是 JavaServer Pages?
  • 为什么使用 JSP?
  • JSP 的优点
  • JSP 案例
  • JSP 高级功能
  • JSP Tag
  • Source & Reference
  1. Develop
  2. JAVA学习

jsp


什么是 JavaServer Pages?

JavaServer Pages(JSP) 是一种技术,能够开发支持动态内容的网页,可以帮助开发人员在 HTML 页面中利用特殊的 JSP 标签插入 Java 代码,其中大部分标签是以 <% 开始,以 %> 结束的。

JavaServer Pages 组件是 Java Servlet 的一种,旨在为 Java web 应用程序实现一个用户界面。Web 开发人员编写 JSP 作为文本文件,结合 HTML 或 XHTML 代码,XML 元素,并嵌入 JSP 操作和命令。

使用 JSP,你可以通过 web 页面的形式收集来自用户的输入,来自数据库或其他资源的当前记录并动态地创建 web 页面。

JSP 标签可用于各种用途,如从数据库检索信息或注册用户首选项,访问 javabean 组件,在页面之间传递控制,在请求、页面之间共享信息等。


为什么使用 JSP?

JavaServer Pages 的服务通常与通用网关接口(CGI)实现程序一样。但 JSP 与 CGI 相比,有几个优势。

性能更好,因为 JSP 允许在 HTML 页面本身嵌入动态元素而不需要创建一个单独的 CGI 文件。

JSP 总是在服务器处理之前进行编译,不像 CGI/Perl,每次请求页面时都需要服务器加载一个解释器和目标脚本。

JavaServer Pages 是建立在 Java servlet API 之上的,就像 servlet,JSP 也可以访问所有强大的 Enterprise Java API,包括 JDBC,JNDI,EJB,JAXP 等等。

JSP 页面可以与 servlet 结合使用,来处理业务逻辑,该模型是由 Java servlet 模板引擎支持的。 最后,JSP 还是 Java EE 不可分割的一部分,是 enterprise 级别应用程序的一个完整平台。这意味着 JSP 可以用于从最简单的应用程序到最复杂的应用程序中,并实现要求。


JSP 的优点

下列是 JSP 优于其他技术的另外的优点:

  • 与 Active Server Pages(ASP) 相比: JSP 的优点是双重的。首先,动态的部分是用 Java 编写的,而不是用 Visual Basic 或其他特定的语言编写,所以它使用起来更强大并且更容易。第二,它可以移植到其他操作系统和非 microsoft 的 Web 服务器中。

  • 与 Pure Servlets 相比: 与用大量的 println 语句生成 HTML 相比,JSP 能够更方便的写 (和修改!) 常规的 HTML。

  • 与 Server-Side Includes(SSI)相比: SSI 只是用于简单的包含物,而不是用于使用表单数据、创建数据库链接等的 “真正的” 程序。

  • 与 JavaScript 相比: JavaScript 可以在客户端动态地生成 HTML,但很难与 web 服务器交互来执行复杂的任务,如数据库访问、图像处理等。

与 Static HTML 相比: 当然,常规的 HTML 不能包含动态的信息。


JSP 案例

Servlet 就是一个能处理 HTTP 请求,发送 HTTP 响应的小程序,而发送响应无非就是获取 PrintWriter,然后输出 HTML:

PrintWriter pw = resp.getWriter();
pw.write("<html>");
pw.write("<body>");
pw.write("<h1>Welcome, " + name + "!</h1>");
pw.write("</body>");
pw.write("</html>");
pw.flush();

只不过,用 PrintWriter 输出 HTML 比较痛苦,因为不但要正确编写 HTML,还需要插入各种变量。如果想在 Servlet 中输出一个类似新浪首页的 HTML,写对 HTML 基本上不太可能。

JSP 是 Java Server Pages 的缩写,它的文件必须放到 /src/main/webapp 下,文件名必须以. jsp 结尾,整个文件与 HTML 并无太大区别,但需要插入变量,或者动态输出的地方,使用特殊指令 <% ... %>。

我们来编写一个 hello.jsp,内容如下:

<html>
<head>
    <title>Hello World - JSP</title>
</head>
<body>
    <%-- JSP Comment --%>
    <h1>Hello World!</h1>
    <p>
    <%
         out.println("Your IP address is ");
    %>
    <span style="color:red">
        <%= request.getRemoteAddr() %>
    </span>
    </p>
</body>
</html>

整个 JSP 的内容实际上是一个 HTML,但是稍有不同:

包含在 <%-- 和 --%> 之间的是 JSP 的注释,它们会被完全忽略; 包含在 <% 和 %> 之间的是 Java 代码,可以编写任意 Java 代码; 如果使用 <%= xxx %> 则可以快捷输出一个变量的值。

JSP 页面内置了几个变量:

  • out:表示 HttpServletResponse 的 PrintWriter;

  • session:表示当前 HttpSession 对象;

  • request:表示 HttpServletRequest 对象。

这几个变量可以直接使用。

访问 JSP 页面时,直接指定完整路径。例如,http://localhost:8080/hello.jsp,浏览器显示如下:

JSP 和 Servlet 有什么区别?其实它们没有任何区别,因为 JSP 在执行前首先被编译成一个 Servlet。在 Tomcat 的临时目录下,可以找到一个 hello_jsp.java 的源文件,这个文件就是 Tomcat 把 JSP 自动转换成的 Servlet 源码

可见 JSP 本质上就是一个 Servlet,只不过无需配置映射路径,Web Server 会根据路径查找对应的 .jsp 文件,如果找到了,就自动编译成 Servlet 再执行。在服务器运行过程中,如果修改了 JSP 的内容,那么服务器会自动重新编译。


JSP 高级功能

JSP 的指令非常复杂,除了 <% ... %> 外,JSP 页面本身可以通过 page 指令引入 Java 类:

<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>

这样后续的 Java 代码才能引用简单类名而不是完整类名。

使用 include 指令可以引入另一个 JSP 文件:

<html>
<body>
    <%@ include file="header.jsp"%>
    <h1>Index Page</h1>
    <%@ include file="footer.jsp"%>
</body>

Jsp 的定义格式:

  1. <% 代码 %>:定义的 java 代码,在 service 方法中。service 方法中可以定义什么,该脚本中就可以定义什么。

  2. <%! 代码 %>:定义的 java 代码,在 jsp 转换后的 java 类的成员位置。

  3. <%= 代码 %>:定义的 java 代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>

Jsp 指令:

  1. page :配置 JSP 页面的

    • contentType:等同于 response.setContentType()

      1. 设置响应体的 mime 类型以及字符集

      2. 设置当前 jsp 页面的编码(只能是高级的 IDE 才能生效,如果使用低级工具,则需要设置 pageEncoding 属性设置当前页面的字符集)

    • import:导包

    • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面

    • isErrorPage:标识当前也是是否是错误页面。

      • true:是,可以使用内置对象 exception

      • false:否。默认值。不可以使用内置对象 exception

  2. include :页面包含的。导入页面的资源文件

    • <%@include file="top.jsp"%>

  3. taglib :导入资源

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

      • prefix:前缀,自定义的


JSP Tag

JSP 还允许自定义输出的 tag,例如:

<c:out value = "${sessionScope.user.name}"/>

JSP Tag 需要正确引入 taglib 的 jar 包,并且还需要正确声明,使用起来非常复杂,对于页面开发来说,不推荐使用 JSP Tag,因为我们后续会介绍更简单的模板引擎,这里我们不再介绍如何使用 taglib。


Source & Reference

  • https://www.liaoxuefeng.com/wiki/1252599548343744/1266262958498784

  • https://www.cnblogs.com/nice0e3/p/13544145.html

PreviousFilter与ListenerNextMVC