JavaWeb理论集锦

来源:互联网 发布:杭州淘宝城是做什么的 编辑:程序博客网 时间:2024/06/12 23:07

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服务器相关信息
<Connector port="8080" protocol="HTTP/1.1" 用于定义tomcat启动端口
<Host appBase="webapps" 用于定义tomcat中web应用程序存放的目录。
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时,如果加上<load-on-startup>并且,该标签的值为正数,表示容器一起动就实例化servlet。如果没有加<load-on-startup>或该标签的值为负数,表示客户端第一次访问该servlet时,才实例化。  推荐使用第一种,启动加载速度虽然慢点,但是不影响后面的使用,否则访问时才实例化的话就会慢点。
  4. 调用init()方法完成初始化。
  5. 当请求到达,调用service()完成业务
  6. 销毁阶段,调用destroy()完成清理工作在整个生命周期中,1 , 2 ,3 , 4 , 6都只进行一次。只有5才是每次请求都到达才会执行。而servlet对象在整个生命周期中也只有一个,是单实例多线程的对象。

在注册servlet时,可以通过
<init-param>
<param-name></param-name>
<param-value><param-value>
</init-param>
书写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方法提交请求

定制浏览器行为

<form method="post"></form>


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

动作转发<jsp:forward page =```></jsp:forward>
相当于请求转发,调用该标签后,通过请求转发到达指定页面,并且忽略该页面的其他代码。

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:目录资源发生异常时过滤。

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

<url-pattern>针对请求路径作过滤
<servlet-name>访问指定名称的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处理后,再显示。

0 0
原创粉丝点击