自学JSP技术(上)
JSP技术
一、JSP入门
(一)JSP简介
JSP全称是Java Server pages, 简称Java服务器页面;
它是建立在servlet的规范之上的动态网页技术, 在jsp文件中, HTML代码和Java代码共存;
其中HTML代码用来展示静态资源内容, 而Java代码展示动态内容;
为了与传统的HTML页面有所区别, JSP文件的后缀名为.jsp;
(二)创建JSP页面
JSP属于前端资源, 替代HTML页面
所以我们的JSP页面要创建到WebContext中
如何修改编码问题?
(三)入门案例
Jsp与html的区别:
- Html只能展示静态资源, 不能写java代码
- Jsp页面不仅可以写静态资源代码. 还可以写java代码
JSP=Java+HTML;
(四)JSP的执行原理
一个jsp页面的执行过程需要经历以下三个阶段:
- 翻译阶段: 先将jsp页面通过tomcat服务器先翻译成一个.java文件(源文件), 即servlet文件
- 编译阶段: 将.java文件编译成.class文件
- 执行阶段: 执行.class文件
如何响应数据?
问题:
每次执行jsp文件, 都需要经过翻译, 编译, 和执行么?
答案: 不是的
Jsp页面只有第一访问时, 才会经历以上三个阶段, 但是没有修改源码的情况下再次进行访问时, 就不会再经历前两个阶段, 只会进行执行.class文件;
一旦更改了jsp文件源码, 就需要重新经历以上三个阶段;
因此, 第一次访问时速度较慢, 后边再访问时速度较快;
(五)JSP和Servlet的联系与区别(面试题)
联系: jsp文件的本质就是一个servlet
区别:
- Jsp动态网页, 它擅长的是视图层, servlet的擅长的是表现层
- Jsp有九大内置对象的, 而servlet没有内置对象
- Jsp不是一个完整的servlet, 需要借助于tomcat将文件翻译成.java文件;而servlet纯粹就是一个类
二、JSP页面组成
组成部分:
- 前端资源: html, css, js
- Java代码: 脚本, 表达式, 声明
- 指令: page include taglib(三大指令)
- 注释
(一)JSP页面中的java代码
1. 脚本
语法:<% Java代码 %>
翻译后在java文件的位置: 在_jspService方法中
2. 表达式
语法:<%=java要输出的值 %>
其作用就是在Jsp页面中输出变量的值。
翻译后在java文件的位置: 在_jspService方法中
3. 声明
JSP声明后会将你声明的变量或方法转化java代码后当成成员变量或成员方法;
语法:<%! 内容 %>
翻译后在java文件的位置: 在成员位置(成员方法或者成员变量)
4. 注释
l Html注释: <!-- html内容 -->
l Java注释: // 或者 /**/
l Jsp注释: <%-- 注释内容 --%>
注意:
Jsp注释不会在源码中展示, 只会显示html的注释
(二)JSP指令
Jsp指令包含三大指令:
Page指令(描述页面), include指令(页面包含), taglib指令(表达式的引入)
- Page指令: 所要设置的页面的基本信息
Language:定义页面的语言
contentType: 定义页面的返回类型
pageEncoding: 定义页面的编码格式
还可以定义错误信息, 错误页面, 导入包(Java代码);
案例:
导包案例:
错误页面和错误信息的案例:
注意: 本质上不会在jsp页面中写Java代码(不推荐)
- Include指令(页面包含属于静态包含)
页面包含: 说的是一个页面中可以包含另外一个页面, 并且胡那可以正常运行并加载;
应用场景:
头部:
尾部:
写法格式:
<%@include file=”被包含页面名称”%>
案例:
- Taglib指令(表达式的引入)
后边使用时详细再说, 配合JSTL表达式一起使用
写法格式:
<%@taglib prefix="前缀" uri="表达式的地址" %>
三、EL表达式
(一)EL简介
El表达式: 是表达式语言, 目的: 就是为了使用jsp写起来更加简单, 让jsp代码更加简化;
写法格式: ${el表达式 }
其中: el表达式有很多形式: 变量 对象的属性 集合等
注意: el表达式只能在作用域对象中来获取数据
回顾下:
Servlet三大作用域对象: request session servletContext
Jsp的四大作用域对象: pageContext request session application
(二)EL的入门案例
(三)EL中的运算符
- 算术型(+ - * /或div %或mod)
- 逻辑型和关系型(&& || ! > >= < <= !=)
- 条件型(?:)相当于三元运算符
- 空(empty):用来判断EL表达式是否为空,如果返回值为true表示为空,如果为false表示非空。
(四)EL表达式的使用
1. 取变量的值
- 取String[]数组
- 取List集合
- 取map集合
- 取对象属性的值
四、完善项目功能-查询
案例需求:
在学生信息管理系统项目的基础上,继续完善查询学员列表功能,修改项目业务逻辑,当登录成功时跳转到index.jsp页面,并在显示列表页面中添加新增学员链接,当点击“添加新学员”时跳转到insert.jsp页面(将原来的HTML页面都改成JSP页面),如下图所示:
五、反射
反射是一个框架的灵魂。在程序运行过程中,可以对任意类型进行任意的操作。
例如:加载任意类型、调用类型的任意方法、获取任意的成员变量、构造方法,可以创建该类型的对象等。这种动态获取信息以及动态访问成员的方式称为反射。
(一)获取类的字节码对象
要想获取和操作类中的成员(属性、方法),首先要获取类的字节码对象(也称为.class对象),都是Class类型的对象。
获取类的字节码对象有三种方式:
1、对象名.getClass():返回的是某个引用指向的具体对象所属的运行类的字节码对象。获取到的是那个真正用来创建对象的子类的字节码对象。
2、类名.class:如果已经有了类名,可以通过.class的方式获取这个类的字节码对象。
3、通过Class.forName(String className):Class类中有一个静态方法forName,传入一个类的全类名,将类名描述的字节码文件,加载到内存中,形成一个字节码对象。例如:Class.forName("com.mysql.cj.jdbc.Driver")加载JDBC驱动,实质就是通过Driver类的全类名,将该类加载到内存中,并形成该类的字节码对象。
注意:
无论通过哪种方式获取到字节码对象, 都是指向的是同一个引用;
以上三方式哪种使用最多(推荐使用class.forName())
(二)Class类中的方法
一旦获取了类的字节码对象,就可以使用这个对象的所有方法,这些方法都定义在Class类型中。
通过这些方法可以获取类的所有信息:成员变量、成员方法、构造方法、内部类、类所在的包、类的修饰符等。这些内容获取后,又是一些对象,有专门的数据类型,描述这些对象。
1、获取类中的成员变量
1)通过Class类中的:getField(String propertyName)
参数列表:属性的名称
返回值类型:Field,表示一个成员变量对象所属的类型
2)Field类型:表示一个成员变量类型,每个对象都是一个具体的成员变量
作用:获取成员变量的各种信息(修饰符、名称等)
赋值:set(Object obj, Object value),给obj对象赋value值
2、获取类中的成员方法
1)通过Class类中:getMethod(String methodName, Class...paramTypes)
参数列表:methodName表示方法名称,paramTypes表示参数列表的数据类型
返回值类型:Method,表示一个成员方法对象所属的类型
2)Method类型:表示成员方法的类型,该类型的每个对象,都是一个具体的成员方法
作用:获取成员方法信息(方法的修饰符、方法的返回值类型、方法的名称、方法的参数等)
其中,最重要的一个方法,就是该方法的执行:invoke(Object obj, Object...values)
六、使用反射改造项目多方法请求
七、完善项目功能-删除
在index.jsp页面中操作“删除”链接,当单击删除链接时,跳转到后台的Servlet完成删除功能,并刷新显示列表页面数据。