一、什么是JSP?
JSP
(java Service Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的动态技术标准。
在传统的HTML文件(*.htm 、 *.html)中加入Java程序片段(Scriptlet)和JSP标签,构成了JSP网页。
1.1 JSP页面的运行原理
- 客户端向服务器发送JSP页面请求。
- JSP容器接收到请求后检索对应的JSP页面,如果该JSP页面是第一次被请求,则容器将此页面中的静态数据(HTML文本)和动态数据(Java脚本)全部转化成Java代码,使JSP页文件翻译成一个Java文件即Servlet。
- 容器将翻译后的Servlet文件编译成字节码文件即.class。
- 编译后的字节码文件被加载到容器内存中执行。并根据用户的请求生成 HTML格式 的响应内容。
- 容器将响应内容返回到客户端。如下图所示
1.2 JSP页面元素
1.3 page指令
每个JSP
页面都有一个page
指令:
page指令属性:
属性 值 默认值 import 类名或包名 无 language 脚本语言名称 “java” contentType MIME类型和字符集 “text/html” extends 类名 无 info 文本字符串 无 session 布尔值 "true’ buffer 缓冲器大小,或none autoFlush 布尔值 "true’ isThreadSafe 布尔值 "true’ errorPage 本地URL 无 isErrorPage 布尔值 "false’
page的三大指令
- Page :指令是针对当前页面的指令
- Include :用于指定如何包含另一个页面
- Taglib :用于定义和指定自定义标签。
JSP中
动态include
和静态include
的区别
- 静态include:语法:<%@ include file=“文件名” %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。
- 动态include:语法:<jsp:include page=“文件名”>,能够自动检查被包含文件,当客户端对JSP文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。
1.4 九大内置对象
-
request
对象
request
对象是javax.servlet.httpServletRequest
类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request
对象的作用域为一次请求。 -
response
对象
response
代表的是对客户端的响应,主要是将JSP
容器处理过的对象传回到客户端。response
对象也具有作用域,它只在JSP
页面内有效。 -
session
对象
session
对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session
对象,用于保存该用户的信息,跟踪用户的操作状态。session
对象内部使用Map
类来保存数据,因此保存数据的格式为 “Key/value
”。session
对象的value
可以使复杂的对象类型,而不仅仅局限于字符串类型。 -
application
对象
application
对象可将信息保存在服务器中,直到服务器关闭,否则application
对象中保存的信息会在整个应用中都有效。与session
对象相比,application
的out 对象
用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用out对象
输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。 -
pageContext
对象
pageContext
对象的作用是取得任何范围的参数,通过它可以获取JSP
页面的out
、request
、reponse
、session
、application
等对象。pageContext
对象的创建和初始化都是由容器来完成的,在JSP
页面中可以直接使用pageContext
对象。 -
config
对象
config
对象的主要作用是取得服务器的配置信息。通过pageConext
对象的getServletConfig()
方法可以获取一个config
对象。当一个Servlet
初始化时,容器把某些信息通过config
对象传递给这个Servlet
。 开发者可以在web.xml
文件中为应用程序环境中的Servlet
程序和JSP
页面提供初始化参数。 -
page
对象
page
对象代表JSP
本身,只有在JSP
页面内才是合法的。page
隐含对象本质上包含当前Servlet
接口引用的变量,类似于Java编程中的 this 指针。 -
exception
对象
exception
对象的作用是显示异常信息,只有在包含isErrorPage=“true”
的页面中才可以被使用,在一般的JSP
页面中使用该对象将无法编译JSP
文件。excepation
对象和Java的所有对象一样,都具有系统提供的继承结构。exception
对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch
关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成exception
对象,并把exception
对象传送到在page
指令中设定的错误页面中,然后在错误页面中处理相应的exception
对象。
1.5 四大作用域
( 从小到大排序 )
-
page:代表与一个页面相关的对象和属性。
-
request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
-
session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
-
application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
较常用的就是session,适用于浏览器的多次请求与响应的过程。
而使session(当前会话)结束的有三种:
- 关闭当前服务器,
- 超时,服务器响应.
- 调用 session.invalidate()方法来结束。
二、什么是Servlet?
Servlet 可以看作是在服务器上运行的小程序,一个页面处理程序。
2.1 Servlet的生命周期
主要分为以下几个阶段:
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁
s三个阶段分别对应Servlet
的三个方法:
init()
初始化
service()
处理请求
destroy()
销毁
初始化阶段
Servlet 初始化是其生命周期的第一个阶段,也是其他阶段的基础。只有完成了初始化,Servlet 才能处理来自客户端的请求。
-Servlet 初始化阶段分为 3 步:
- 当客户端首次发送第一次请求后,由
Servlet
容器去解析请求,根据请求找到是否有对应的Servlet
。 - 判断是否有
Servlet
实现类的对象存在?存在则直接使用,不存在则先创建一个Servlet
实现类的对象。 - 调用 init() 方法进行初始化
请求响应阶段
初始化完成后调取service()方法,由service()判断客户端的请求方式。
- 如果是get请求,则执行doGet()方法。
- 如果是post请求,则执行doPost()。
- 处理方法完成后会作出相应的结果返回给客户端,单次请求处理完毕。
当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init()
,而直接执行service()
方法调取doGet()
/ doPost()
方法。
服务终止阶段
当服务器关闭,重启或移除Servlet
实例时Servlet
调取destroy()
方法进行销毁,宣告生命周期的结束。
2.2 Servlet如何输出页面
servlet
作为服务端既可以处理用户从页面发过来的请求,并反馈到其他页面,也可以直接在通过servlet
直接进行页面的输出:
① 先使用response
的setContentType()
方法设置发送到客户端的响应的内容类型(text/html
, text/plain
, application/msword
等等)
例如:
setContentType(“text/html;charset=UTF-8”);
响应类型为HTML格式的
setContentType(“text/plain;charset=UTF-8”);
响应类型为文本格式的
setContentType(“application/msword;charset=UTF-8”);
响应类型为word格式的
当要进行页面展示的时候就选用text/html;charset=UTF-8
;
② 在设置上述方法之后,使用PrintWriter out=response.getWriter();
拿到输出器,然后用out
对象的write()
方法写出页面,如:
private static final String CONTENT_TYPE="text/html;charset=utf-8";
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<head><title>MyServlet</title></head>");
out.println("<body bgcolor=\"#ffffff\">");
out.println("<p><h1>hello world</h1></p>");
out.println("</body></html>");
out.close();
三、jsp和servlet 的区别
JSP
是Servlet
技术的扩展,本质上就是Servlet
的简易方式。JSP
编译后是“类servlet
”。
Servlet
的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩 展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
四、其他相关
4.1 页面向后台提交数据有三种方式
- form表单。
- a href 超链接。
- ajax运用了
js
技术
4.2 页面向后台提交请求有两种方式
- get。
- post。
get和post的区别:
get
是用来从服务器上获取数据,而post
是用来向服务器传递数据;get
将表单中数据按照variable=value
的形式,添加到action
所指向的URL
后面,并且两者用?
连接,变量之间用&
连 接;而post
是将表单中的数据放在form
的数据体中,按照变量与值对应的方式,传递到action
所指定的URL
。get
是不安全的,因为在传输过程中,数据是被放在请求的URL
中;而post
的所有操作对用户来说都是不可见的。get
传输的数据量小,这主要应为受url
长度限制;而post
可以传输大量的数据,所有上传文件只能用post提交。get
限制form
表单的数据集必须为ASCII
字符;而post
支持整个IS01 0646
字符集。get
是form
表单的默认方法。
页面发送请求,servlet
执行逻辑,servlet
调用service
方法根据页面提交方式来调用doget()
或dopost(
)方法。最后相应。
4.3 解决乱码
既然的提交数据那么肯定有中文,有数字,而数据提交不是中文格式,那么提交的数据就会出现乱码问题,那么如何解决表单提交的中文乱码问题呢?
- 设置页面编码,若是jsp页面,需编写代码<%@page language=“java” pageEncoding=“UTF-8” contentType=“text/html;charset=UTF-8” %>
若 是 html 页 面 , 在 网 页 头 部 ( < head>< /head> ) 中 添 加 下 面 这 段 代 码 < meta http-equiv=“Content-Type” content=“text/html; charset=utf-8” /> - 将 form 表 单 提 交 方 式 变 为 post 方 式 , 即 添 加 method=“post”; ) 在 Servlet 类 中 编 写 代 码request.setCharacterEncoding(“UTF-8”),而且必须写在第一行。
- 如 果 是 get 请 求 , 在 Servlet 类 中 编 写 代 码 byte [] bytes = str.getBytes(“iso-8859-1”);String cstr = new String(bytes,“utf-8”);或者直接修改Tomcat服务器配置文件server.xml增加内容:URIEncoding=“utf-8”
4.4 request.getAttribute()和 request.getParameter()的区别
request.getParameter()
取得是通过容器的实现来取得通过类似post
,get
等方式传入的数据。getAttribute()
是返回对象,getParameter()
返回字符串getAttribute()
一向是和setAttribute()
一起使用的,只有先用setAttribute()
设置之后,才能够通过getAttribute()
来获得值,它们传递的是Object类型的数据。而且必须在同一个request
对象中使用才有效。而getParameter()
是接收表单的get
或者post
提交过来的参数
如下是Request对象的主要方法
4.5 转发与重定向的区别?
- 从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。
转发地址栏不发生改变,重定向地址栏发生改变。
转发是一次请求,重定向是多次请求。 - 从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.redirect:不能共享数据.redirect不仅可以重定向到当前应用程序 的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.forward方法 只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.redirect 是服务器通知客户端,让客户端重新发起请求.所以,你可以说 redirect 是一种间接的请求, 但是你不能说"一个请求是属于forward还是redirect "。
转发数据不会丢失,而重定向数据会丢失。 - 从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. - 从效率来说
forward:高. redirect:低.
4.6 servlet的四种会话跟踪技术
- session :使用
setAttribute(String str,Object obj)
方法将对象捆绑到一个会话。 - cookie: 一个 cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技术比较, Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值
- URL 重写 :URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字 / 值对。
- 隐藏表单域:适合步需要大量数据存储的会话应用。
session的工作原理:
session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。
参考资料:
- CSDN
https://blog.csdn.net/m0_59079129/article/details/117934977
- CSDN
https://blog.csdn.net/weixin_67588007/article/details/125071301