0x01 前言

JSP全称Java Server Pages,是一种动态网页开发技术
它使用JSP标签在HTML网页中插入Java代码,常用标签是<%java代码%>

JSP是为了简化Servlet的处理流程而出现的替代品
早期的Java EE因为只能使用Servlet来处理客户端请求而显得非常的繁琐和不便
于是就诞生了JSP方便快速的完成后端逻辑请求

从本质上说 JSP 就是一个Servlet ,因为JSP文件最终会被编译成class文件
而这个class文件实际上就是一个特殊的Servlet

需要注意的是,是先出现了Servlet然后才出现了JSP的

0x02 JSP脚本标签

0x02.1 说明

脚本元素是JSP中使用最频繁的元素,脚本程序可以包含任意量的Java语句、变量、方法或表达式

0x02.2 JSP声明语句

0x02.2.1 语法格式

  1. 作用: 用于声明方法、属性、全局变量, 其中写的内容会直接编译在Servlet类中
  2. 语法格式:
  3. <%!
  4. 常量
  5. 静态变量
  6. 实例变量
  7. 静态代码块
  8. 实例代码块
  9. 构造函数
  10. 实例⽅法
  11. 静态⽅法
  12. %>
  13. 或者,您也可以编写与其等价的XML语句:
  14. <jsp:declaration>
  15. 代码片段
  16. </jsp:declaration>

0x02.2.2 小例子

  1. <%!
  2. int sum = 1;
  3. String name = "name";
  4. public String printName() {
  5. return name + "ooooo";
  6. }
  7. %>
  8. 或是
  9. <jsp:declaration>
  10. int sum = 1;
  11. String name = "name";
  12. public String printName() {
  13. return name + "ooooo";
  14. }
  15. </jsp:declaration>

0x02.3 JSP表达式

0x02.3.1 语法格式

  1. 作用: 用于将已经声明的变量或者表达式输出到网页上面
  2. 语法格式:
  3. <%= 表达式 %>
  4. 或者,您也可以编写与其等价的XML语句:
  5. <jsp:expression>
  6. 表达式
  7. </jsp:expression>

0x02.3.2 小例子

  1. // 输出今日时间
  2. <%= (new java.util.Date()).toLocaleString() %>
  3. 或是
  4. <jsp:expression>
  5. (new java.util.Date()).toLocaleString()
  6. </jsp:expression>

0x02.4 JSP脚本片段

0x02.4.1 语法格式

  1. 作用: JSP脚本片段(JSP Scriptlet),常常用于在Service方法中定义局部变量或者调用其他方法
  2. 语法格式:
  3. <% Java代码 %>
  4. 或者,您也可以编写与其等价的XML语句:
  5. <jsp:scriptlet>
  6. 代码片段
  7. </jsp:scriptlet>

0x02.4.2 小例子

  1. <%
  2. out.println("Your IP address is " + request.getRemoteAddr());
  3. %>
  4. 或是
  5. <jsp:scriptlet>
  6. out.println("Your IP address is " + request.getRemoteAddr());
  7. </jsp:scriptlet>

0x02.5 小例子

  1. // 目录结构
  2. ├── src
  3. └── main
  4. └── webapp
  5. └── com
  6. └── Servlet
  7. └── ...
  8. └── WEB-INF
  9. └── web.xml
  10. ├── ...
  11. └── test2.jsp
  1. // 文件名test2.jsp
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
  3. <%
  4. for (int i = 0; i < 3; i++) {
  5. out.println(i);
  6. }
  7. %>
  8. <%!
  9. int sum = 1;
  10. String name = "name";
  11. public String printName() {
  12. return name + "ooooo";
  13. }
  14. %>
  15. <% int sum = 8; %>
  16. <% out.println(sum++); %>
  17. <%= this.sum %>
  18. <%= this.name %>
  19. <%= this.printName() %>
  20. -------------------xml语法-----------------------
  21. <jsp:declaration>
  22. int a = 5;
  23. </jsp:declaration>
  24. <jsp:scriptlet>
  25. out.println(a);
  26. </jsp:scriptlet>
  27. <jsp:expression>
  28. (new java.util.Date()).toLocaleString()
  29. </jsp:expression>
  30. <jsp:scriptlet>
  31. out.println("Your IP address is " + request.getRemoteAddr());
  32. </jsp:scriptlet>
  33. // 执行test2.jsp

image.png

0x03 JSP注释

0x03.1 说明

  1. 1. JAVA注释_1
  2. 作用: 单行注释
  3. 语法格式: //注释内容
  4. 2. JAVA注释_2
  5. 作用: 多行注释
  6. 语法格式: /*注释内容*/
  7. 3. JSP注释
  8. 作用: JSP注释
  9. 语法格式: <%--注释内容--%>

0x03.2 小例子

  1. // 文件名test3.jsp
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <%
  4. // JAVA注释
  5. // int name = "laowang";
  6. /* System.out.print(name); */
  7. %>
  8. <%--
  9. int name = "xiaowang";
  10. System.out.print(name);
  11. --%>
  12. // 执行test3.jsp
  13. // 执行结果,啥也没有,因为被代码被注释了

0x04 JSP三大指令

指令 描述
<%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %> 包含其它文件
<%@ taglib … %> 引入标签库的定义

0x04.1 page指令

  1. 作用: Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令
  2. 语法格式: <%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>

下表列出与Page指令相关的属性:

属性 描述
buffer 指定out对象使用缓冲区的大小
autoFlush 控制out对象的缓存区
contentType 指定当前JSP页面的MIME类型和字符编码
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends 指定servlet从哪一个类继承
import 导入要使用的Java类
info 定义JSP页面的描述信息
isThreadSafe 指定对JSP页面的访问是否为线程安全
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行EL表达式
isScriptingEnabled 确定脚本元素能否被使用
  1. 例子1-指定页面编码-解决中文编码问题:
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
  3. 例子2-导入包:
  4. <%@ page import="java.util.*,java.text.*" %>

0x04.2 include指令

  1. 作用: 包含其它文件
  2. 语法格式: <%@ include file="要被包含的页面"%>
  1. 例子1-包含一个通用jsp文件
  2. <%@ include file="common/herder.jsp"%>

0x04.3 taglib指令

  1. 作用: 引入标签库的定义
  2. 语法格式: <%@ taglib ... %>

0x05 JSP内置/隐式的九大对象

0x05.1 说明

JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用
JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量
开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用

名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 客户端请求对象,包含了所有客户端请求信息
response javax.servlet.http.HttpServletResponse 响应对象,主要用于服务器端设置响应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用户请求会话信息
application javax.servlet.ServletContext 全局对象,所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
pageContext javax.servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

0x05.2 小例子

  1. // 文件名test4.jsp
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <%
  4. out.println("test");
  5. out.println(request.getSession());
  6. %>
  7. // 执行test4.jsp

image.png

0x06 JSP行为

0x06.1 说明

这里直接抄一下菜鸟教程的JSP教程: https://www.runoob.com/jsp/jsp-syntax.html

  1. JSP行为标签使用XML语法结构来控制servlet引擎
  2. 它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等
  3. 行为标签只有一种语法格式,它严格遵守XML标准
  4. <jsp:action_name attribute="value" />

行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:

语法 描述
jsp:include 用于在当前页面中包含静态或动态资源
jsp:useBean 寻找和初始化一个JavaBean组件
jsp:setProperty 设置JavaBean组件的值
jsp:getProperty 将JavaBean组件的值插入到output中
jsp:forward 从一个JSP文件向另一个文件传递一个包含用户请求的request对象
jsp:param 一般和jsp:forward配合使用
用于在转发时增加额外的请求参数
请求参数的值可以通过HttpServletRequest类的getParameter()方法获得
jsp:plugin 用于在生成的HTML页面中包含Applet和JavaBean对象
jsp:element 动态创建一个XML元素
jsp:attribute 一般和jsp:element配合使用
定义动态创建的XML元素的属性
jsp:body 一般和jsp:element配合使用
定义动态创建的XML元素的主体
jsp:text 用于封装模板数据

0x06.2 小例子

  1. // 目录结构
  2. ├── src
  3. └── main
  4. └── webapp
  5. └── com
  6. └── ...
  7. └── WEB-INF
  8. └── web.xml
  9. ├── ...
  10. └── JSP行为
  11. ├── ...
  12. └── ...

0x06.2.1 jsp:include

  1. // jsp:include使用详解
  2. 注: 代码审计时可以看看page参数参数是否可控,可控表示有漏洞,可以尝试加载管理员界面绕过权限校验
  3. jsp:include的语法为: <jsp:include page="URL" flush="true"></jsp:include>
  4. page: 被包含文件的相对路径
  5. flush: 在包含文件之前是否清空缓存, 默认为false
  1. // 文件地址: ./src/main/webapp/JSP行为/include/
  2. // 文件名称: head.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <div>这是一个头部</div>
  1. // 文件地址: ./src/main/webapp/JSP行为/include/
  2. // 文件名称: test1.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. </head>
  8. <body>
  9. <jsp:include page="${param.value}" flush="true"></jsp:include>
  10. <div>这是一个test1.jsp</div>
  11. </body>
  12. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSP行为/include/test1.jsp?value=head.jsp

image.png

0x06.2.2 jsp:userBean/jsp:setProperty/jsp:getProperty

  1. // jsp:userBean使用详解
  2. jsp:userBean的语法为: <jsp:userBean id="beanId" class="className" scope="value"/>
  3. id: JavaBean对象的名称
  4. class: javaBean的全类名
  5. scope: JavaBean对象的作用域
  6. 可设置的作用域:
  7. page(当前页面有效)
  8. request(当前请求有效)
  9. session(当前会话有效)
  10. application(整个应用有效)
  11. 有了JavaBean之后可以使用jsp:setProperty/jsp:getProperty行为来对JavaBean的属性进行操作
  1. // jsp:setProperty使用详解
  2. jsp:setProperty的语法为: <jsp:setProperty name="beanName" property="propertyName" value="" param=""/>
  3. name: JavaBeanid
  4. propertys: 属性名
  5. value: 属性值
  6. name:
  7. name属性是必需的,它表示要设置属性的是哪个Bean
  8. property:
  9. property属性是必需的, 它表示要设置哪个属性
  10. 有一个特殊用法: 如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法
  11. value:
  12. value属性是可选的, 该属性用来指定Bean属性的值
  13. 字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、booleanBoolean byteBytecharCharacter
  14. 例如:
  15. booleanBoolean类型的属性值(比如"true")通过Boolean.valueOf转换
  16. intInteger类型的属性值(比如"42")通过Integer.valueOf转换
  17. valueparam不能同时使用,但可以使用其中任意一个
  18. param:
  19. param属性是可选的, 它指定用哪个请求参数作为Bean属性的值
  20. 如果当前请求没有参数, 则什么事情也不做, 系统不会把null传递给Bean属性的set方法
  21. 因此, 你可以让Bean自己提供默认属性值, 只有当请求参数明确指定了新值时才修改默认属性值
  22. 注意: valueparam属性不能同时使用, 但可以使用其中任意一个
  23. 它们的区别是:
  24. 1. value是自定义属性的值, param是将请求参数(比如前端表单数据)作为值,注入到该property
  25. 2. param的值应该对应前端, 请求参数的name属性名, 表明哪个请求参数将注入到该property
  1. jsp:getProperty的语法为: <jsp:getProperty name="beanName" property="propertyName" />
  2. name: JavaBeanid
  3. propertys: 属性名
  4. 注意:当JavaBean中的属性名为xxx, 而获取该属性值的方法名为getyyy(), property="yyy", 而不是property="xxx"
  1. // 文件地址: ./src/main/webapp/JSP行为/useBean/
  2. // 文件名称: TestBean.java
  3. package JSP行为.useBean;
  4. public class TestBean {
  5. private String userName;
  6. private String password;
  7. private int age;
  8. public String getUserName() {
  9. return userName;
  10. }
  11. public void setUserName(String userName) {
  12. this.userName = userName;
  13. }
  14. public String getPassword() {
  15. return password;
  16. }
  17. public void setPassword(String password) {
  18. this.password = password;
  19. }
  20. public int getAge() {
  21. return age;
  22. }
  23. public void setAge(int age) {
  24. this.age = age;
  25. }
  26. }
  1. // 文件地址: ./src/main/webapp/JSP行为/useBean/
  2. // 文件名称: register.jsp
  3. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
  4. <%
  5. request.setCharacterEncoding("utf-8");
  6. %>
  7. <!DOCTYPE html>
  8. <html lang="en">
  9. <head>
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  11. <title>注册成功</title>
  12. </head>
  13. <jsp:useBean id="user" scope="page" class="JSP行为.useBean.TestBean"/>
  14. <jsp:setProperty name="user" property="*"/>
  15. <jsp:setProperty property="userName" name="user" param="userName"/>
  16. <jsp:setProperty property="password" name="user" param="password"/>
  17. <jsp:setProperty property="age" name="user" param="age"/>
  18. <body>
  19. <div>注册成功:</div>
  20. <div>使用Bean的属性方法</div>
  21. <div>用户名: <%=user.getUserName()%></div>
  22. <div> 码: <%=user.getPassword()%></div>
  23. <div> 龄: <%=user.getAge()%></div>
  24. <hr>
  25. <div>使用getProperty</div>
  26. <div>用户名: <jsp:getProperty name="user" property="userName"/></div>
  27. <div> 码: <jsp:getProperty name="user" property="password"/></div>
  28. <div> 龄: <jsp:getProperty name="user" property="age"/></div>
  29. </body>
  30. </html>
  1. // 文件地址: ./src/main/webapp/JSP行为/useBean/
  2. // 文件名称: register.html
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>注册</title>
  8. </head>
  9. <body>
  10. <form action="register.jsp" method="post">
  11. <table>
  12. <tr>
  13. <td>姓名:<input type="text" name="userName"></td>
  14. </tr>
  15. <tr>
  16. <td>密码:<input type="text" name="password"></td>
  17. </tr>
  18. <tr>
  19. <td>年龄:<input type="text" name="age"></td>
  20. </tr>
  21. <tr>
  22. <td align="center"><input type="submit"></td>
  23. </tr>
  24. </table>
  25. </form>
  26. </body>
  27. </html>
  28. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSP行为/useBean/register.html

image.png
image.png

0x06.2.3 jsp:forward/jsp:param

  1. // jsp:forward使用详解
  2. <jsp:forword page="URL">
  3. ...
  4. </jsp:forward>
  5. page: 要跳转的地址
  1. // jsp:param使用详解
  2. <jsp:param name="属性名" value="值" />
  3. name: 属性名
  4. value:
  1. // 文件地址: ./src/main/webapp/JSP行为/forword/
  2. // 文件名称: a.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <title>跳转前页面</title>
  7. </head>
  8. <body>
  9. <%
  10. String username = "testname";
  11. %>
  12. <jsp:forward page="b.jsp">
  13. <jsp:param name="name" value="<%=username%>"/>
  14. <jsp:param name="other" value="test-test-test"/>
  15. </jsp:forward>
  16. </body>
  17. </html>
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>跳转后页面,同时接收参数</title>
  5. </head>
  6. <body>
  7. <div> 参数一: <%=request.getParameter("name")%> </div>
  8. <div> 参数二: <%=request.getParameter("other")%> </div>
  9. </body>
  10. </html>
  1. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSP行为/forword/b.jsp
  2. // 打开以后会显示b.jsp的内容,并且链接还是a.jsp的

image.png

0x06.2.4 jsp:plugin

  1. <jsp:plugin>动作元素的语法格式如下:
  2. <jsp:plugin>
  3. type="bean | applet"
  4. name="Applet名称"
  5. code="java类名"
  6. codebase="Java类所在目录"
  7. align="对齐方式"
  8. height="高度"
  9. width="宽度"
  10. hspace="水平间距"
  11. vspace="垂直间距"
  12. archive="预先加载的类列表"
  13. jreversion="JRE版本"
  14. iepluginurl="URL"
  15. nspluginurl="URL"
  16. </jsp:plugin>
各属性及属性名称如下所示
属性 属性作用
type 用来指定插件类型, 可以是Bean和Applet
name 用来指定Applet或Bean名称
code 用来指定所执行的Java类名, 必须以class结尾
codebase 用来指定所执行的Java类所在的目录
align 用来指定Applet或Bean显示时的对齐方式
height 用来指定Applet或Bean显示时的高度
width 用来指定Applet或Bean显示时的宽度
hspace 用来指定Applet或Bean显示时的距离屏幕左右的距离, 单位是像素
vspace 用来指定Applet或Bean显示时的距离屏幕上下的距离, 单位是像素
archive 用来指定Applet或Bean执行前预先加载的类的列表
iepluginurl 用来指定IE用户能够使用的JRE下载地址
nspluginurl 用来指定Netscape Navigator用户能够使用的JRE下载地址
  1. 注: 网上抄的例子,因为我是mac说我组件不匹配,我也不知道是否能成功
  1. // 文件地址: ./src/main/webapp/JSP行为/plugin/
  2. // 文件名称: MyApplet.java
  3. package JSP行为.plugin;
  4. import javax.swing.*;
  5. import java.awt.*;
  6. public class MyApplet extends JApplet {
  7. String img;
  8. @Override
  9. public void paint(Graphics g) {
  10. Image image = getImage(getCodeBase(), img);
  11. //绘制一张图片
  12. g.drawImage(image, 0, 0, 400, 400, this);
  13. g.setColor(Color.blue);
  14. g.setFont(new Font("宋体", 2, 24));
  15. //绘制一个字符串
  16. g.drawString("jsp:plugin-test", 40, 170);
  17. g.setColor(Color.pink);
  18. g.setFont(new Font("NewsRoman", 2, 10));
  19. //绘制一个日期字符串
  20. g.drawString(new java.util.Date().toString(), 10, 109);
  21. }
  22. @Override
  23. public void init() {
  24. //获取plugin指令中的参数
  25. img = getParameter("image");
  26. }
  27. }
  1. // 文件地址: ./src/main/webapp/JSP行为/plugin/
  2. // 文件名称: index.jsp
  3. <%@ page language="java" contentType="text/html;charset=utf-8" %>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>jsp:plugin动作标签</title>
  8. </head>
  9. <body>
  10. <h2>jsp:plugin动作标签</h2>
  11. <jsp:plugin align="middle" type="applet" code="JSP行为.plugin.MyApplet" codebase="." width="200" height="200">
  12. <jsp:params>
  13. <jsp:param name="image" value="test.png"/>
  14. </jsp:params>
  15. <jsp:fallback>error happens when insert applet</jsp:fallback>
  16. </jsp:plugin>
  17. </body>
  18. </html>
  19. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSP行为/plugin/index.jsp

0x06.2.5 jsp:element/jsp:attribute/jsp:body

  1. // jsp:element使用详解
  2. <jsp:element name="e">
  3. ...
  4. </jsp:element>
  5. name: XML元素标签的名称
  6. 注意:
  7. <jsp:element>中可以包含<jsp:attributee>和<jsp:body>
  8. 它只有一个属性name,name的值就是XML元素标签的名称
  1. // jsp:attribute使用详解
  2. <jsp:element name="e">
  3. <jsp:attribute name="a">
  4. ...
  5. </jsp:attribute>
  6. </jsp:element>
  7. name: XML元素标签的名称
  1. // jsp:body使用详解
  2. <jsp:element name="e">
  3. <jsp:body>
  4. ...
  5. </jsp:body>
  6. </jsp:element>
  1. // 文件地址: ./src/main/webapp/JSP行为/attribute/
  2. // 文件名称: test.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <jsp:element name="xmlElement1">
  5. <jsp:attribute name="xmlElementAttr1">${param.test1}</jsp:attribute>
  6. <jsp:body>jsp:body1</jsp:body>
  7. </jsp:element>
  8. <jsp:element name="xmlElement2">
  9. <jsp:attribute name="xmlElementAttr2"><%=request.getParameter("test2")%></jsp:attribute>
  10. <jsp:body>jsp:body2</jsp:body>
  11. </jsp:element>
  12. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSP行为/attribute/test.jsp?test1=test1111&test2=test2222

image.png

0x06.2.6 jsp:text

  1. <jsp:text>允许在JSP页面和文档中使用写入文本的模板
  2. <jsp:text>不能包含其它动作元素,只能只能包含文本和EL表达式
  1. // jsp:text使用详解
  2. jsp:text的语法为: <jsp:text>模板数据</jsp:text>
  1. // 文件地址: ./src/main/webapp/JSP行为/text/
  2. // 文件名称: a.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <title>jsp:text</title>
  7. </head>
  8. <body>
  9. <jsp:text>${param.value}</jsp:text>
  10. <jsp:text>模板数据</jsp:text>
  11. <jsp:text>
  12. EL表达式测试2*2=${2*2}
  13. </jsp:text>
  14. </body>
  15. </html>
  16. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSP行为/text/a.jsp?value=测试

image.png