JSP与Servlet

一、什么是JSP?

JSP(java Service Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的动态技术标准。
在传统的HTML文件(*.htm 、 *.html)中加入Java程序片段(Scriptlet)和JSP标签,构成了JSP网页。

1.1 JSP页面的运行原理

  1. 客户端向服务器发送JSP页面请求。
  2. JSP容器接收到请求后检索对应的JSP页面,如果该JSP页面是第一次被请求,则容器将此页面中的静态数据(HTML文本)和动态数据(Java脚本)全部转化成Java代码,使JSP页文件翻译成一个Java文件即Servlet。
  3. 容器将翻译后的Servlet文件编译成字节码文件即.class。
  4. 编译后的字节码文件被加载到容器内存中执行。并根据用户的请求生成 HTML格式 的响应内容。
  5. 容器将响应内容返回到客户端。如下图所示
    在这里插入图片描述

1.2 JSP页面元素

在这里插入图片描述

1.3 page指令

每个JSP页面都有一个page指令:
在这里插入图片描述

page指令属性:

属性默认值
import类名或包名
language脚本语言名称“java”
contentTypeMIME类型和字符集“text/html”
extends类名
info文本字符串
session布尔值"true’
buffer缓冲器大小,或none
autoFlush布尔值"true’
isThreadSafe布尔值"true’
errorPage本地URL
isErrorPage布尔值"false’

page的三大指令

  1. Page :指令是针对当前页面的指令
  2. Include :用于指定如何包含另一个页面
  3. Taglib :用于定义和指定自定义标签。

JSP中动态include静态include的区别

  1. 静态include:语法:<%@ include file=“文件名” %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。
  2. 动态include:语法:<jsp:include page=“文件名”>,能够自动检查被包含文件,当客户端对JSP文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。

1.4 九大内置对象

  1. request对象
    request对象是javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

  2. response对象
    response代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

  3. session对象
    session对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

  4. application对象
    application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比, applicationout 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

  5. pageContext对象
    pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的outrequestreponsesessionapplication 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

  6. config 对象
    config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

  7. page 对象
    page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

  8. exception 对象
    exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

1.5 四大作用域

( 从小到大排序 )

  1. page:代表与一个页面相关的对象和属性。

  2. request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。

  3. session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。

  4. application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

较常用的就是session,适用于浏览器的多次请求与响应的过程。

而使session(当前会话)结束的有三种:

  1. 关闭当前服务器,
  2. 超时,服务器响应.
  3. 调用 session.invalidate()方法来结束。

二、什么是Servlet?

Servlet 可以看作是在服务器上运行的小程序,一个页面处理程序。

2.1 Servlet的生命周期

主要分为以下几个阶段:

加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁

s三个阶段分别对应Servlet的三个方法:
init() 初始化
service() 处理请求
destroy() 销毁

初始化阶段

Servlet 初始化是其生命周期的第一个阶段,也是其他阶段的基础。只有完成了初始化,Servlet 才能处理来自客户端的请求。

-Servlet 初始化阶段分为 3 步:

  1. 当客户端首次发送第一次请求后,由Servlet容器去解析请求,根据请求找到是否有对应的Servlet
  2. 判断是否有Servlet实现类的对象存在?存在则直接使用,不存在则先创建一个Servlet实现类的对象。
  3. 调用 init() 方法进行初始化

请求响应阶段

初始化完成后调取service()方法,由service()判断客户端的请求方式。

  1. 如果是get请求,则执行doGet()方法。
  2. 如果是post请求,则执行doPost()。
  3. 处理方法完成后会作出相应的结果返回给客户端,单次请求处理完毕。

当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init(),而直接执行service()方法调取doGet() / doPost()方法。

服务终止阶段

当服务器关闭,重启或移除Servlet实例时Servlet调取destroy()方法进行销毁,宣告生命周期的结束。

2.2 Servlet如何输出页面

servlet作为服务端既可以处理用户从页面发过来的请求,并反馈到其他页面,也可以直接在通过servlet直接进行页面的输出:

① 先使用responsesetContentType()方法设置发送到客户端的响应的内容类型(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 的区别

JSPServlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩 展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑

四、其他相关

4.1 页面向后台提交数据有三种方式

  1. form表单。
  2. a href 超链接。
  3. ajax运用了js技术

4.2 页面向后台提交请求有两种方式

  1. get。
  2. post。

get和post的区别:

  1. get是用来从服务器上获取数据,而post是用来向服务器传递数据;
  2. get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者用?连接,变量之间用&连 接;而post是将表单中的数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL
  3. get是不安全的,因为在传输过程中,数据是被放在请求的URL中;而post的所有操作对用户来说都是不可见的。
  4. get传输的数据量小,这主要应为受url长度限制;而post可以传输大量的数据,所有上传文件只能用post提交。
  5. get限制form表单的数据集必须为ASCII字符;而post支持整个IS01 0646字符集。
  6. getform表单的默认方法。
    页面发送请求,servlet执行逻辑,servlet调用service方法根据页面提交方式来调用doget()dopost()方法。最后相应。

4.3 解决乱码

既然的提交数据那么肯定有中文,有数字,而数据提交不是中文格式,那么提交的数据就会出现乱码问题,那么如何解决表单提交的中文乱码问题呢?

  1. 设置页面编码,若是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” />
  2. 将 form 表 单 提 交 方 式 变 为 post 方 式 , 即 添 加 method=“post”; ) 在 Servlet 类 中 编 写 代 码request.setCharacterEncoding(“UTF-8”),而且必须写在第一行。
  3. 如 果 是 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()的区别

  1. request.getParameter()取得是通过容器的实现来取得通过类似postget等方式传入的数据。
  2. getAttribute()是返回对象,getParameter()返回字符串
  3. getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()设置之后,才能够通过getAttribute()来获得值,它们传递的是Object类型的数据。而且必须在同一个request对象中使用才有效。而getParameter()是接收表单的get或者post提交过来的参数
    如下是Request对象的主要方法
    在这里插入图片描述

4.5 转发与重定向的区别?

  1. 从地址栏显示来说
    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
    redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。
    转发地址栏不发生改变,重定向地址栏发生改变。
    转发是一次请求,重定向是多次请求。
  2. 从数据共享来说
    forward:转发页面和转发到的页面可以共享request里面的数据.redirect:不能共享数据.redirect不仅可以重定向到当前应用程序 的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.forward方法 只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.redirect 是服务器通知客户端,让客户端重新发起请求.所以,你可以说 redirect 是一种间接的请求, 但是你不能说"一个请求是属于forward还是redirect "。
    转发数据不会丢失,而重定向数据会丢失。
  3. 从运用地方来说
    forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
  4. 从效率来说
    forward:高. redirect:低.

4.6 servlet的四种会话跟踪技术

  1. session :使用setAttribute(String str,Object obj)方法将对象捆绑到一个会话。
  2. cookie: 一个 cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技术比较, Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值
  3. URL 重写 :URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字 / 值对。
  4. 隐藏表单域:适合步需要大量数据存储的会话应用。

session的工作原理:
session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。

参考资料:

  1. CSDN https://blog.csdn.net/m0_59079129/article/details/117934977
  2. CSDN https://blog.csdn.net/weixin_67588007/article/details/125071301
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值