JavaWeb理论集锦

http全称叫超文本传输协议。其中超文本表示发生方和接收方传输的内容不仅仅限于文本数据,而且还包括图片、视频、音频等多媒体资源。传输意味着协议是用于数据交互的协议,也就是发送方和接收方发送数据格式的规则。发送方和接收方如果都遵循http协议,就能从发送的信息中,提取自己感兴趣的数据。 

http协议遵循请求/响应模型,并且在一次请求和响应完成以后,连接会断开,以释放服务器的内存资源。所以,http协议是一种无状态的协议。另外http协议占用80端口。

处理流程

第一步:客户端和web服务器建立连接
第二步:客户端发送http请求 http request
第三步:生成http响应回发 http response
第四步:关闭连接

HTTP协议请求信息分为四部分

  1. 请求行:描述请求方式,请求的URL。http协议版本
  2. 请求头:以键值对方式描述客户端相关信息
  3. 空行:标识请求头的结束,和消息体的开始
  4. 消息体(只限于POST方式):描述客户端发送给服务器的表单数据

HTTP协议响应信息分为四部分

  1. 状态行:描述http协议版本 状态码 以及状态描述
  2. 响应头:以键值对方式描述服务器相关的信息
  3. 空行:标识响应头的结束合消息体的开始
  4. 消息体:描述客户端浏览器需要展示的内容

传统的web服务器,在产生响应时,只能产生静态的HTML内容。极大的影响响应信息的灵活性。解决方案是,在web服务器基础之上,添加一个辅助应用。辅助应用允许服务器在接收到请求信息之后,做一些业务逻辑处理,然后,动态产生响应信息。 

CGI技术全称叫通用网关接口。是辅助应用的一种解决饭。优点是可以使用多语言进行编写。工作原理是,当客户端向服务器发出请求,服务器会开启一个CGI进程处理请求。这样,如果有很多客户同时请求,那么,会在服务器同时开启很多进程。对服务器的内存资源会进行极大的占用,甚至导致服务器当机(死机)。所以,CGI技术无法做到接收高并发的请求。

WEB容器

web容器负责管理和运行servlet
容器对servlet的支持包括

  1. 通信支持(将请求信息和响应信息封装成请求对象和响应对象)
  2. Servlet生命周期管理(产生Servlet和销毁Servlet,并调用servlet相关的方法)
  3. 多线程支持(线程创建、线程启动、线程运行、线程同步)
  4. JSP支持(jsp引擎编写)
  5. 处理安全性

Web容器主要是用于给处于容器中的应用程序组件(Servlet、JSP)提供一个环境,使Servlet、JSP直接跟容器中的环境变量交互。这样,我们就可以把注意力放在用Servlet实现业务逻辑上,而不必关注其他系统问题


Java Web应用程序的组成:
配置文件
静态文件和JSP
类文件和包 
按照servlet规定,web应用程序中的WEB-INF目录,是不能被客户端直接访问的。所以存放一些比较隐秘的信息。 
tomcat的目录结构:
bin:用于存放tomcat的可执行文件。其中startup.bat用于启动tomcat。shutdown.bat用于关闭tomcat。
conf:用于存放tomcat的配置文件。
其中server.xml用于配置tomcat服务器相关信息
web.xml用于配置tomcat的web应用相关信息。
lib:用于存放tomcat运行时,需要使用的jar包。
logs:用于存放日志。
temp:用于存放临时文件。
webapps:用于存放web应用程序。
work:用于jsp支持。


Servlet业务接口(由开发者书写业务逻辑) Service()由开发者书写业务逻辑的业务方法

ServletConfjg配置接口,用于servlet相关配置

CenericServlet适配器类,同时实现两个接口,并实现大部分方法,但是,service()没有实现,该方法由子类根据自身协议特点进行重写

HttpServlet该类根据http协议的特点,重写了service(),并根据请求方式,分别调用doXX()


三层架构:

表现层:采用MVC模式。
M:模型。也就是实体类bean。作为数据封装和数据传输的介质。
V:视图。也就是GUI窗体,或者是HTML网页。用于数据展示和数据的收集。
C:也就是事件。用于业务方法的调用和流程控制。 

业务层:采用事务脚本模式,将一个业务中所有数据库操作封装成一个方法。保证该方法中所有数据库更新操作同时成功同时失败

持久层:采用DAO模式。建立实体类和数据表映射。也就是哪个表对应哪个类,哪个属性对应哪个列。而持久层的目的就是完成对象数据和关系数据的转换。

碰到一件奇怪的事情,从浏览器发送搜索请求“中文内容”,无法搜索,空白显示,最后通过向数据库插入新数据“中文加上数字的格式,如‘张三5’”,再次输入5进行模糊查询新增格式数据,成功显示,接着只查中文,也能成功显示

切记,越蹊跷的错误往往出现在越简单越不起眼的地方


servlet可以通过在浏览器中输入URL地址进行访问。同时,也可以利用表单的action和超链接的href属性书写访问servlet的URL地址。这样当提交表单和点击超链接时就可访问该servlet。
在表单的action和超链接href属性中,如果直接书写URL路径,默认是在当前目录下查找。如果以/开始,表示回到webapps根目录,那么需要在/后面添加web应用程序的部署名。

切记文件夹创建顺序:工程名,HTML WEB-INF,LIB CLASSES 没逗号表示两个为同级目录

SERVLET的映射路径:

  1. 精确匹配:/ts。表示只能以/ts方式访问servlet。
  2. 扩展映射:*do。表示凡是以.do结尾的请求都能访问servlet。
  3. 路径映射:/abc/*。表示在abc目录下的所有请求都能访问servlet。

SERVLET生命周期:

  1. 启动tomcat。读取conf/server.xml文件,以确定启动端口和WEB应用程序存放的路径。
  2. 读取webapps目录下的所有web程序。并将web。xml文件进行解析。如果解析失败,那么抛出解析异常。这就意味着,如果有一个web应用程序的web.xml书写有误,那么启动时都会抛出异常。
  3. WEB加载并实例化Servlet。注册servlet时,如果加上并且,该标签的值为正数,表示容器一起动就实例化servlet。如果没有加或该标签的值为负数,表示客户端第一次访问该servlet时,才实例化。  推荐使用第一种,启动加载速度虽然慢点,但是不影响后面的使用,否则访问时才实例化的话就会慢点。
  4. 调用init()方法完成初始化。
  5. 当请求到达,调用service()完成业务
  6. 销毁阶段,调用destroy()完成清理工作在整个生命周期中,1 , 2 ,3 , 4 , 6都只进行一次。只有5才是每次请求都到达才会执行。而servlet对象在整个生命周期中也只有一个,是单实例多线程的对象。

在注册servlet时,可以通过




书写servlet的初始化信息。可以通过ServletConfig配置接口中定义的getInitPatameter()根据参数键,得到参数的值。但是只能被当前servlet所访问,不能在别的servlet中访问。

应用上下文

  1. 属于整个Web应用程序
  2. 可以访问到Web应用程序资源 的本地输入流
  3. 读取context-param全局配置信息
  4. 把资源的虚拟路径转换为物理路径
  5. 记录事件日志
  6. 绑定一个对象在整个Web应用程序中共享

HTTP状态码

100-199:表示信息性代码,标识客户端应该采取的其他动作,请求正在进行。
200-299:表示客户请求成功。
300-399:表示用于已经移走的资源文件,指示新的地址。
400-499:表示客户端错误。
500-599:表示服务器错误。

在使用PrintWriter向客户端发送消息体之前设置状态码

可以通过HttpServletResponse的setHeader()设置响应头,setHeader()只针对http协议。只有http协议才会有响应头。所以,是HttpServletResponse特有的方法。setHeader()的键,必须是根据HTTP协议规定好的键,才能被浏览器所识别
HttpServletResponse响应对象,向客户端输出的数据分为两种:

  1. getWriter(),得到打印字符流,向客户端输出文本数据。
  2. getOutputStream(),得到打印字节流,向客户端输出二进制数据。

汉字正则表达式:\u4e00-\u9fa5

重定向的工作流程:

客户端请求服务器,服务器调用response。sendRedirect()方法,重定向到新的资源。产生响应时,会产生302状态码,同时产生location响应头。客户端浏览器在接收到响应信息后,发现是302状态码,会读取location响应头的信息,然后根据location响应头的内容,在服务器发出第二次请求。

GET和POST提交方法的区别

特征 GET提交 POST提交
提交数据类型 文本 文本、二进制文本
提交数据长度 不超过255个字符 没有限制
提交数据可见性 作为URL地址的一部分显示在浏览器地址栏 作为请求的消息体,不可见
提交数据缓存 缓存在浏览器URL历史状态中 不会被浏览器缓存



浏览器向Web服务器发送HTTP请求

用户在网页上点击一个超链接
用户提交在网页上填写好的表单
用户在浏览器地址栏中输入URL地址并回车

默认情况下都是使用HTTP协议的GET方法提交请求

定制浏览器行为




Get和Post的区别

  1. 流格式的区别。
    get方式只有请求行、请求头、空行。在URL后面附加表单数据。
    post方式有请求行、请求头、空行、消息体。在消息体中描述表单数据。
  2. 用途区别
    get方式主要用于资源查找
    post方式主要用于数据的传输
  3. 传输性能的区别
    get方式不能传大数据,只能传输文本数据,表单数据会显示在地址栏,不安全。
    post方式可以传文本数据和二进制数据,并可以传输大数据,表单数据在消息体中,地址栏不会显示,相对安全。



得到表单数据可以用request请求对象的getParameter()和getParameterValues()。getParameter()根据键得到值,如果该键有多个值,那么只返回第一个值。getParameterValues(),该方法返回数组。可以得到一个键对应的所有的值(复选框,同名的文本框,列表框)。
列表框提交的是选中项的value值。所以,在提交列表框之前,需要选中选项才能提交。一般通过JS选中选项再提交。


请求转发

每个客户的请求可以传递给很多Servlet以及Web应用程序中的其他资源。
整个过程完全是在服务器端完成。
不需要任何客户端浏览器的行为。
不需要在客户端浏览器和服务器端之间传递特殊信息。
通过javax.servlet.RequestDispathcher对象的实现。
请求转发只发一次请求,转发的是本身服务器的资源。

在超链接中书写URL,表单中书写action,在网页中链接资源,重定向,在/后面都需要加WEB应用程序的部署名。
内部转发,获取资源的真实路径,是在服务器内部进行查找,在/后面无需加部署名。

可以通过request.getRequestDispatcher("url")得到请求转发对象RequestDispatcher。该对象提供了两个方法转发资源:
forward()转发到指定资源,不包括本身servlet输出的内容。
include()包含指定资源,除了转发资源之外,还包括本身servlet输出的内容。
在请求对象request中,也提供了setAttribute()和getAttribute()方法,可以绑定数据共享,但作用范围再一次请求。

重定向和请求转发的区别

  1. 重定向由Response发出,请求转发由RequestDispatcher发出。
  2. 请求转发客户端只向服务器发出一次请求,而重定向客户端要向服务器发出两次请求。所以,请求转发可以共享request中绑定的数据,而重定向不行。
  3. 请求转发只能转发服务器本身资源。而重定向可以在第二次请求时访问别的服务器。

注意:重定向和内部转发在一个servlet中只能做一次。不能在重定向或内部转发之后,再做页面跳转。否则会抛出方法调用异常——java.lang.IllegalStateException:Cannot call sendRedirect() after the Response has been committed
jsp:全名称叫java server page。是一段服务器脚本。jsp允许在普通网页上通过<% %>标记嵌入java代码。这样,静态html标记可以直接书写。同时可以动态嵌入java类处理的结果。可以大大简化输出页面的难度。
在web容器中,提供了一些类对jsp作支持。这些类可以将用户书写的jsp页面翻译成java类。称为jsp引擎。
按照servlet规范规定,由WEB容器厂商翻译jsp页面形成的Java类,必须实现HttpJspPage接口。而HttpJspPage接口是Servlet的子接口。所以,翻译形成的Java类同样满足servlet规范。从这个意义上说,jsp本质是servlet。只不过,jsp重在于数据的页面展示,而servlet重在于逻辑处理。

JSP生命周期

  • 由JSP引擎将JSP页面翻译成JAVA代码
  • 将JAVA代码编译成class字节码文件
  • 加载到容器
  • 由容器实例化成对象
  • 初始化阶段相关的方法是jspInit()
  • 请求到达,调用服务阶段相关的方法是_JspService()
  • 销毁阶段相关的方法是jspDestroy()

JSP语法和语义

JSP网页主要由元素(Element)和模板数据(Template Data)两个部分组成
模板数据是JSP的静态部分
WEB容器不处理
元素则是必须经过WEB容器解释


JSP脚本元素分为三种:

  1. 声明:<%! %> 定义成员变量、静态变量和方法。
  2. 脚本:<% %>丰富_jspService()方法,在脚本中定义的变量都是_jspService()的局部变量。
  3. 表达式:<%= %>_jspService()方法,相当于out.print(),向客户端输出结果。注意:表达式后面不能加分号。

JSP注释分为三种

  1. jsp注释:<%-- --%>该注释WEB容器不做翻译,只在源代码可见,最为安全!
  2. html注释:该注释WEB容器会以out.println()方式输出到客户端。客户端和服务器均可见,不能注释java代码。最不安全!
  3. java代码注释:// /* */。该注释只能注释java代码,在服务器端可见,客户端不可见。

JSP隐式对象:

jsp页面经过web容器的jsp引擎翻译之后,形成一个java类,在jspService方法中,由WEB容器定义了九个局部变量,并且作了初始化。由于开发者书写的jsp代码,是在丰富jspService(),所以可以直接使用这九个局部变量。这些变量称为jsp隐式对象。

Jsp隐式对象有九个:

四个作用域:

  1. pageContext:作用于页面。
  2. request:作用于请求。
  3. session:作用于会话。
  4. application:作用于全局。

二个输出:

  1. response:响应对象。
  2. out:打印输出流。

当前对象:page 配置对象:config 异常对象:exception

JSP指令

提供整个JSP页面的相关信息<%@ %>
用于JSP页面与容器之间的通信

在Jsp中,有三种类型的指令

  1. page指令为当前页面提供处理指令
  2. include指令用于把另一个文件包含在JSP中
  3. taglib指令指定如何包含和访问自定义标签库

PAGE指令常用的属性:

  1. contentType:定义响应信息的MIME类型和编码集。
  2. import:导入该jsp中所使用的类。
  3. errorPage:表示如果当前页面抛出了运行异常,则请求转发至指定页面。
  4. isErrorPage:表示当前页面为处理异常的页面。该页面定义了Exception隐式对象,用于接收和处理从其他jsp页面中抛出的异常对象。

指令包含<%@include file=% >
在编译时发生,将本身页面和包含页面合在一起编译,形成一个Java类和一个class文件。只允许包含文件,不允许两个页面存在同名变量。 动作包含 >
在请求时发生,相当于RequestDispatcher.include(),包含的是另一个页面输出的结果。可以包含文件,可以包含servlet输出的结果。由于是请求时发生,所以包含时,可以传递参数。

动作转发
相当于请求转发,调用该标签后,通过请求转发到达指定页面,并且忽略该页面的其他代码。

EL表达式:

${mb.name}从作用域对象中,取出绑定对象,并且显示该对象的那么属性值。
在访问name属性时,是调用getXX()方法,得到属性值的。如果实体类中没有该属性,但是有getXX()方法,同样,可以取出值。


状态跟踪的方式:

  1. 隐藏表单
  2. cookie
  3. session
  4. URL重写

COOKIE的工作流程:

客户端向服务器发出请求,服务器调用Response.addCookie()方法,附加Cookie对象信息。产生响应时,会增加set-cookie响应头,在该响应头中描述Cookie信息。当客户端向服务器发出请求时,会在请求头中增加Cookie请求头,将Cookie信息再发送给服务器。服务器发现客户端发送服务器的信息,和自己发送给客户端的信息一致,就认为是同一用户。

COOKIE的分类:

  1. 存放在客户端浏览器的缓存中,当浏览器一关闭,Cookie消失。
  2. 如果Cookie设置了过期时间,Cookie存放在客户端的文件中。在过期时间内,浏览器可以一直读取Cookie文件信息,发送给服务器。

SESSION工作流程:

客户端向服务器发送请求,服务器产生session对象用于跟踪用户的状态。为了标识不同的用户,服务器会给每个session对象分配一个唯一标识sessionID。然后,为了管理所有用户的session对象,服务器以sessionID为键,以session对象为值,封装成Map集合。 产生响应时,会将sessionID已set-cookie响应头的方式发送给客户端。客户端将sessionID缓存在浏览器。当客户端再次发出请求,会将sessionID再以Cookie请求头的方式发送给服务器,服务器根据sessionID找到对应的session对象,从而跟踪状态。


会话超时管理 :

session是服务器用于跟踪用户状态的对象。由于http协议是无状态的协议,当请求和响应完成后,连接会断开。这意味着,客户端是否关闭浏览器,用户是否下线,服务器并不清楚。所以,如果session不及时清理,那么无效的、过时的session对象会极大消耗服务器内存资源

销毁Session## 有三种方式:

  1. 设置会话超时
  2. 在session对象上调用invalidate()方法强行销毁
  3. 应用结束(服务器崩溃或重新部署)

SESSION和COOKIE的区别

  1. session是服务器端的对象,用户信息保存在服务器端。cookie信息是保存在客户端。
  2. session可以绑定对象在会话范围内共享。而cookie只保存文本数据。

URL重写:

由于cookie容易引起一些安全隐患。所以,有些用户出于安全考虑,可能会禁用cookie。但这样一来,如果使用session跟踪状态,客户端也无法将sessionID传递给服务器。这时,可以采用URL重写,将sessionID强行附加在URL后面,保证客户端禁用cookie时,服务器也能得到sessionID,从而跟踪状态。URL重写可以看做是session的一种补充。使用response.encodeURL("url路径")进行URL重写。

对象作用域

作用域对象 属性操作方法 作用域范围说明
ServletContext(上下文)最好不用 void setAttribute(String,Object)Object getAttribute(String) void removeAttribute(String) 整个Web应用程序
HttpSession(会话)   一个会话交互过程
ServletRequest(请求)   一次请求过程

监听器

监听session,request,ServletContext这三个对象里存取数据的变化

分类

监听生命周期,属性变化。Request监听器很少用。

唯一一个不需要注册的监听器,HttpSessionBindingListener接口

过滤器

过滤器的分类

  1. request(默认):表示针对指定的URL过滤。
  2. include:表示包含目标资源时过滤
  3. forward:表示请求转发到目标资源过滤。
  4. error:目录资源发生异常时过滤。

注册过滤器的过滤范围方式有两种:

针对请求路径作过滤
访问指定名称的servlet时,需要经过该过滤器

过滤器链:

当一个请求到达目标资源之前,可能会经过多个过滤器。这就形成了过滤器链。过滤器链执行顺序时,先执行url-pattern,再执行servlet-name,如果有多个url-pattern,那么按部署顺序执行。


AJAX

AJAX涉及到7项技术,JavaScript、XMLHttpRequest、Dom、CSS、HTML、XML以及相关服务器API
XMLHttpRequest是XMLHTTP组件的对象,通过这个对象AJAX可以像桌面应用程序一样只同服务器进行数据交换,却不用每次刷新界面

同步提交和# 异步提交的区别:

  1. 提交表单、点击超链接都是同步提交,而向服务器发出AJAX请求是异步提交。
  2. 同步提交,服务器的响应信息会刷新整个页面。页面上原来的元素不可见。异步提交,页面做局部刷新,页面原来的元素可见
  3. 同步提交,服务器给客户端什么响应信息,页面上就显示什么响应信息。异步提交,可以将服务器的响应信息用js处理后,再显示。

你可能感兴趣的:(JavaWeb理论集锦)