- 2.7.1 JSP介绍
- 2.7.2 JSP快速入门
- 2.7.3 JSP的执行过程
- 2.7.4 JSP文件内容介绍
- 2.7.5 JSP语法
- 2.7.5.1 JSP注释
- 2.7.5.2 Java代码块
- 2.7.5.3 JSP表达式
- 2.7.5.4 JSP声明
- 2.7.6 JSP指令
- 2.7.6.1 page指令
- 2.7.6.2 include指令
- 2.7.6.3 taglib指令
- 2.7.7 JSP使用细节
- 2.7.7.1 九大隐式对象
- 2.7.7.2 PageContext对象
- 2.7.7.3 四大域对象
- 2.7.8 MVC模型
JSP,Java Server Pages ,是一种动态网页技术标准。
JSP部署在服务器上,可以处理客户端发送的请求并根据请求内容动态的生成HTML、XML或其他格式文档的Web网页,然后再响应给客户端。
JSP是基于Java语言的,它的本质就是Servlet。也就是说,它既可以显示网页,又可以编写Java代码。
比较以下各文档的区别:
| 类别 | 使用场景 |
|---|---|
| HTML | 开发静态资源,无法添加动态资源 |
| CSS | 美化页面 |
| Javascript | 给网页添加一些动态效果 |
| Servlet | 编写Java代码,实现后台功能处理 |
| JSP | 包含了显示页面技术,也具备Java代码功能 |
步骤:
1.创建一个web项目
2.在web目录下创建一个index.jsp文件
3.在文件中写一句话
在JSP中HTML的写法同样适用。
4.部署并启动项目
5.通过浏览器测试
首先,依旧是由客户端的浏览器向服务器发起请求,服务器接收到请求后会解析请求地址,根据我们所填写的虚拟目录的名称来找到我们具体的应用,也就是找到我们发布的这个项目,从而找到对应的jsp文件,找到这个文件后它并不是将文件直接显示,而是将这个jsp文件翻译成Java文件,翻译成一个java文件后想要运行,就要编译,编译成class文件,最后一步就是响应给客户端了。
jsp文件会被翻译成Java文件,而这个Java文件,
我们可以打开tomcat的这个路径
apache-tomcat9.0.29workCatalinalocalhostROOTorgapachejsp
这里有两个文件,我们先打开class文件,我们可以用反编译工具
打开后如下:
我们发现这个类继承自HttpJspbase,那我们就再查看一下HttpJspbase
而这个HttpJspbase是继承自HttpServlet,所以说jsp的本质就是一个Servlet,而看其中的方法,有init,destroy,service。
我们再来打开文件夹中的另一个java文件index.java
这里的文件太长,这里就介绍几个地方,可以自己在本地打开来看看
这里面有jspInit,jspDestroy,jspsevice方法,所以说,jsp的本质就是servlet。
再来看共享数据是怎么实现的:
这里有设置编码等我们很眼熟的方法,还有111行的getOut方法其实就是获取一个响应的输出流对象,在看123行往下,调用的write方法不就是实现html代码的源码吗,还有117行往下的设置共享数据的代码……
所以说,jsp可以实现显示一些页面,并且可以写Java代码。
<%-- 这是注释内容 --%>
我们来实践一下
web目录下创建一个jsp文件,
由于博客编写没找到写jsp的代码功能,这里用的是html格式,所以颜色区别不明显
注释的快捷键是ctrl+/
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
jsp
<%--这是一行注释--%>
2.7.5.2 Java代码块
<% 这里是Java代码%>
实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
jsp
<%--Java代码--%>
<%
System.out.println("Hello,jsp");
out.println("Hello,jsp");
%>
这里要知道的是, System.out.println(“Hello,jsp”)是在控制台输出,而我们想在浏览器输出,就要用out,这个out是一个JspWriter对象,调用print方法。启动tomcat,打开浏览器查看一下
如果要是换行,println是没效果的,需要加html换行的代码,像这样
out.println("Hello,jsp
");
2.7.5.3 JSP表达式
<%= 表达式%>
先看例子
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
jsp
<%--表达式--%>
<%= "你好"%>
启动服务器,打开浏览器,会发现浏览显示 你好
这说明,<%= “你好”%>的效果跟<% out.println(“Hello,jsp”);%>的效果是一样的,就是简化写法了。
<%!声明变量或方法%>
这个是用来声明变量和方法的,静态、普通方法都可以。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
jsp
<%--声明--%>
<%! String s = "abc"; %>
<%= s%>
刷新我们的浏览器依旧有效。
但是貌似上面的直接声明也能用呀,他们有什么区别呢?
如果加! 代表声明的是成员变量
如果不加 代表声明的是局部变量
<%@ page 属性名=属性值 属性名=属性值……%>
这里的属性建议都试试,这里的导包可以提一下,我们使用的Java类库中的代码,需要导包的,而这个导包就需要这个对应的格式,如果你用的是idea,那么你就不用考虑导包的问题了直接修复即可。
另外,这里并不需要把全部的属性都加入,因为它们是有默认值的。
include指令可以包含其他页面
<%@ include-file=包含的页面 %>
示例:
我们新建一个include.jsp文件,并定义一个变量s
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
被包含的页面
<% String s = "Hello"; %>
我们期望在另一个jsp文件中使用到include.jsp中定义的变量,这时我们就需要在这里加上include指令。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="include.jsp"%>
jsp
<%=s%>
要注意的是 内容是jsp文件的路径。
2.7.6.3 taglib指令taglib指令可以引入外部标签库
<%@ taglib uri=标签库的地址 prefix=前缀名称 %>
隐式对象就是借助这些隐式对象名称,我们可将它当作实际的对象直接使用。
第一个request,request代表的就是隐式对象的名称,它就是一个对象名,实际代表的就是HttpServletRequest,也就是请求对象;response代表的就是响应对象;session代表HttpSession的对象;application代表的就是ServletContext对象,即应用域对象;page代表的是Object对象,在JSP中代表的是本类对象,即this;config代表配置,也就是ServletConfig对象;exception代表的就是异常对象,也就是Throwable;out就是输出到页面的对象,代表的是JspWriter对象;pageContext代表的是页面域对象。
PageContext对象是JSP独有的,Servlet中没有。它是四大域对象之一的页面域对象,还可以操作其他三个域对象中的属性,同时它还可以获取其他八个隐式对象,使用get方法就可获取到。
PageContext对象的生命周期是随着JSP的创建而存在,随着JSP的结束而消失。每个JSP页面都有一个PageContext对象。
这个是PageContext的父类JspContext的常用方法
M(Model):模型。 用于封装数据,封装的是数据模型。
V(View):视图。 用于显示数据,动态资源用JSP页面,静态资源用HTML页面。
C (Controller):控制器。用于处理请求和响应,例如Servlet。
MVC分层思想:
首先,由客户端浏览器发起请求到控制器,也就是我们的Servlet;第二步就是进行一些相关逻辑的处理,处理完成后就会产生一些数据;所以第三步就是将这些数据处理,到我们的数据库中进行一些增删改查的操作,执行完成后,在数据库层面可能还会产生一些新的数据;所以第四步就是将这些数据返回到模型中;第五步将这些数据封装;第六步由控制器将封装好的数据模型选择视图进行展示,如果是一个动态资源就用JSP,如果是一个静态资源就用HTML,最后响应给我们的客户端。



