jsp简介与基本的使用

     [1] 简介


> 为什么要有JSP这门技术?
> 软件的三层架构:表现层(HTML,Servlet)   业务逻辑层(Service层)    持久化层(Dao层)

> HTML是专门用来展示网页,不能在页面中执行Java代码
> Servlet不擅长显示网页,但是擅长执行java程序

> 为了解决网页动态的效果,所以我们将HTML和Servlet进行一个强强联合。这门技术就是JSP
JSP既有HTML擅长显示网页的特点,还有Servlet擅长处理Java程序的特点。

> JSP全称Java Server Pages,顾名思义就是运行在java服务器中页面,
也就是在我们JavaWeb中的动态页面,其本质就是一个Servlet。
> JSP不能脱离服务器运行。
> JSP = HTML + JAVA代码

[2] JSP运行原理


- JSP的本质是一个Servlet.

- 我们创建好了一个jsp页面以后,我们通过浏览器去访问这个jsp,这时候jsp的引擎(服务器)会首先将jsp
页面翻译成一个java文件。这个java文件其实就是一个Servlet。而我们每一次去访问JSP页面,其实都是去访问
刚刚翻译好的Servlet。
-  .jsp   --翻译成--   .java    --进行编译--   .class

- 我们在镜像服务器中在work目录下找到了jsp翻译后的.java文件,我们说JSP本质上就是一个Servlet,所以
我们要查看这个java文件。
  我们查看java文件,发现java类继承自HttpJspBase,而HttpJspBase又是继承自HttpServlet,所以我们得出结论
jsp被jsp引擎翻译后的java文件就是一个Servlet.
  我们又在镜像服务器的web.xml中找到了jsp相关的Servlet的配置信息。


[3] JSP基本语法


> 学习JSP的基本语法其实就是学习JSP引擎(服务器)如何将JSP页面翻译成.java文件

> 模板元素
- 就是jsp中的html代码
- 模板元素的内容在java文件中的service方法中,通过out.write()方法输出到页面中。
- 在jsp页面中编写HTML代码
> 脚本片段
<% %> 在里面编写java代码
- 作用:就是执行java代码
- 脚本片段中的java代码会原封不动的复制到java文件的service方法的指定位置。
- 脚本片段在jsp页面中可以出现多个。但是注意:多个脚本片段的java代码必须要完整。
- 在方法中能够编写什么java代码,那么在脚本片段中就能够写什么代码。
- 在方法中不能定义成员变量和方法,所以在脚本片段中不能编写成员变量和方法。

> 表达式
<%= %>
- 作用:向页面中输出一个对象或者一个变量
- 表达式中的内容会作为out.print()方法的参数输出到页面中。
- out.print()方法能够接收什么类型的数据,我们在表达式中就能写什么类型的数据。
- out.print()方法能够接收任意类型的数据。
> 注释
<%-- --%>
作用:在jsp注释中的内容,不会被jsp引擎所翻译。

在jsp页面中可以使用如下几种注释:
1.html的注释
2.jsp的注释
3.java代码的注释
三者之间的可见范围浏览器页面中页面的源代码中  在java文件中
html的注释 可见 可见
jsp的注释   不可见 不可见
java代码中的注释 不可见 不可见可见

> 声明
<%! %> 
- 作用:声明中的java代码会原封不动的复制到java文件的成员位置。
- Servlet中的service方法是以多线程的方式执行的,所以可能产生多线程的数据安全问题,
所以不建议在Servlet的成员位置定义成员变量。
- 所以JSP的声明很少会用到,只需要知道就ok。

[4] JSP指令

> JSP指定的使用的格式:
<%@ 指令的名称 属性名1="属性值1" 属性名2="属性值2" ... %>

> JSP指令用于"转换阶段"提供整个JSP页面的相关信息,影响由JSP页面生成的Servlet的整体结构。
指令不会产生任何的输出到当前的输出流中。

> page指令
- page指令的作用是用来告诉jsp引擎如何去翻译jsp页面。
- page指令中有如下的属性:

1.language
作用:用来指定jsp翻译成何种语言
目前只有一个值 : java

2.contentType
作用:设置当前jsp页面的数据的类型和编码格式。
完整的写法 : text/html;charset=utf-8

3.pageEncoding
作用:设置当前jsp文件的编码格式

4.autoFlush
作用:自动刷新,设置响应输出流是否自动刷新。
默认值是true,表示自动刷新。
一般不去修改它。

5.buffer
作用:设置流的缓冲区大小,默认是8kb.
一般不去修改它。

6.extends
作用:设置翻译后的java文件继承的类。
一般不去修改它。

7.errorPage
作用:设置当前页面发生错误以后转发到另一个页面。

8.import
作用:用来导包

9.info
作用:设置翻译后的servlet的信息。也就是Servlet中getServletInfo()方法的返回值。
没有太大的作用

10.isELIgnored
作用:设置是否忽略EL表达式。
默认值是false,表示不忽略。
一般不去修改它。

11.session
默认值是true,如果是true表示可以在jsp页面中直接使用session对象。
如果设置成false,那么在jsp页面中就不能直接使用session对象。
默认不去修改它。

12.isErrorPage
表示当前的jsp页面是否是错误页面。
默认值是false,表示不是错误页面,
如果设置成true,那么可以直接在页面中使用一个叫exception的对象。

常用的属性如下:
contentType
errorPage
import
isErrorPage

> include指令
<%@ include file=""%>
file属性的值指向的是另一个jsp页面。
作用:将指定的页面包含到当前页面中。

- 我们通过查看镜像服务器中的java文件,发现只生成一个当前页面的java文件,另一个被包含的页面
并没有被jsp引擎所解析。

- 例如1.jsp中包含2.jsp,首先会将2.jsp中所有的内容复制到1.jsp指定的位置。
然后jsp引擎会翻译1.jsp。

- 静态包含。

> taglib指令
自定义标签的时候讲解。


[5] JSP动作标签

- JSP的动作标签最终会被jsp引擎翻译成一段java代码执行。

- 动作标签的使用格式: <jsp:标签名 属性1="属性值1" 属性2="属性值2"></jsp:标签名>

- forward动作标签
<jsp:forward page="/forward/2.jsp"></jsp:forward>
标签中有一个page属性,指定的是转发的路径。

注意事项:如果我们在jsp:forward标签中没有子标签,那么标签中不能有任何内容
我们可以给jsp:forward标签添加子标签:
<jsp:param value="zs" name="username"/>
name属性的值是参数的名称,value属性的值是参数的值。
作用就是在请求转发的时候给请求报文设置请求参数。
- <jsp:include page="target.jsp"></jsp:include>
作用:把一个页面包含到当前页面中。page属性就是指定的需要被包含的页面。
例如:1.jsp中使用include标签包含2.jsp。那么就是1.jsp中包含2.jsp

jsp:include动作标签会生成两个jsp页面的对应的java文件,在1.jsp生成的那个java文件中,
我们找到了如下的代码将2.jsp页面引入到1.jsp中:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/include2/2.jsp", out, false);

这种方式包含页面是通过代码来实现的,所以我们称之为动态包含。

[6] JSP中9个隐含对象(★)

- JSP中已经存在了9个隐含对象,这9个隐含对象我们可以直接在jsp的脚本片段或者表达这中直接使用。

- 我们为什么能够直接使用这9个隐含对象呢?
因为在我们jsp页面翻译后生成的java文件中,已经对这9个隐含对象进行了声明并且赋值。所以我们可以直接
使用它们。

- 总共有哪9个对象呢?

1.pageContext
类型:PageContext
代表:代表当前jsp页面的上下文信息。封装的是当前jsp的一些信息。
作用:
获取其他的隐含对象。
pageContext是JavaWEB中的一个域对象,可以在不同的资源之间共享数据。
2.request
类型:HttpServletRequest
代表:代表浏览器发送给服务器的请求报文。
作用:
a.获取请求参数
b.获取项目根路径
c.获取资源的真实路径
d.获取请求方式、请求头等信息
e.获取一个资源的MIME类型
f.是JavaWEB中的一个域对象,可以在不同的资源之间共享数据。

3.session
类型:HttpSession
代表:代表当前会话。会话就是一次打开浏览器到一次关闭浏览器的过程。
作用:
是JavaWEB中的一个域对象,可以在不同的资源之间共享数据。

4.application
类型:ServletContext
代表:代表当前项目的上下文信息。其实就是封装的项目的一些信息。
作用:
a.获取项目的根路径
b.获取某个资源的真实路径
c.获取整个web应用的初始化信息。
d.是JavaWEB中的一个域对象,可以在不同的资源之间共享数据。

5.config
类型:ServletConfig
代表:代表当前Servlet的配置信息
作用:
1.获取Servlet的别名
2.获取Servlet的初始化参数
3.获取ServletContext对象

6.exception
类型:Throwable
代表:当前页面产生的异常
作用:
获取当前页面的异常信息

7.out
类型:JspWriter
代表:代表输出流
作用:
向页面输入内容

8.response
类型:HttpServletResponse
代表:代表服务器发送给浏览器的响应报文
作用:
a.可以向页面中输出一个页面片段或者完整的页面。
b.获取和设置响应的状态码,响应头

9.page
final java.lang.Object page = this;
类型:Object
代表:代表当前的Servlet对象。
作用:
没有什么太大的作用。

[7] JavaWeb中4个域对象(★)

> 域对象的作用:在不同的资源之间共享数据。
- pageContext
类型:PageContext
作用域:只在当前页面有效,只要切换了页面,该域中的属性就失效了。
作用:在当前页面中共享数据
主要为了向标签中传递数据。
- request
类型: HttpServletRequest
作用域:只针对一次请求有效,如果请求发生了改变,那么该域中的属性就失效了。
作用:在一次请求中共享数据
- session
类型:HttpSession
作用域:一次会话有效。一次打开浏览器到关闭浏览器有效。如果会话发生了改变,该域中的属性失效。
不同的浏览器直接会话不会互相干扰。每次打开一个新的浏览器就是一个新的会话。
作用:在一次会话中共享数据。
用来做登录用户信息的显示,保持一次会话中用户永远登录的状态。
- application
类型:ServletContext
作用域:从项目被部署到项目被卸载有效。服务器重启以后,该域对象中的属性就失效了。
作用:在整个应用程序中共享数据。
在线人数统计的功能。
> 域对象都共有的方法:
- void setAttribute(String name,Object value); 给域对象设置属性
- Object getAttribute(String name); 从域对象上获取属性
- void removeAttribute(String name); 从域对象上移除属性

[8] JSP与Servlet分工

> HTML擅长显示网页,但是不能处理Java程序
> Servlet擅长处理Java程序,但是不擅长显示网页。
> JSP既擅长显示网页,也擅长处理Java程序。

> 在Model1年代,项目中已经没有了Servlet,全部都是jsp页面。但是我们如果全部使用JSP
那么就没有了分层,并且在JSP页面中也不好断点调试。

> JSP和Servlet进行分工合作。
我们在网页中将请求数据提交到Servlet中,在Servlet中对请求进行处理,然后处理完毕以后,会把
数据交给JSP页面来显示。

选择哪个域对象呢?
在jsp页面中可以获取四个域对象
但是在Servlet中只能获取三个域对象
1.request
2.session
3.application

以后选择域对象有一个原则:能用小的就用小的。

最终我们的案例选择request域对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Diligently_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值