程序的演进
1、单机程序:txt文档,word文档,ppt文档
2、两层CS架构
客户端:Client,设计用户界面和少量的逻辑代码
服务端:数据库,大量的逻辑代码
优点:交互简单
缺点:业务逻辑使用数据库编程语言编写
在程序移植方面非常差,需要重新编写业务逻辑代码
3、三层CS架构
C:client,设计用户界面和少量的逻辑代码
S:应用服务器,大量的逻辑代码
db:数据库,只进行数据的交互
优点:移植性好
缺点:开发客户端成本高
4、BS架构
B:browser,浏览器
S:应用服务器,所有的业务逻辑代码所在处
db:数据库进行数据的交互
优点:只需要遵循浏览器的HTTP通信协议即可,无客户端开发成本
所有的逻辑代码都在服务器端开发。
移植性好。
BS框架的工作原理
从用户的操作开始,用户在浏览器页面提交表单操作,向服务器发送请求,服务器接收并处理请求,然后把用户请求的数据(网页文件、图片、声音等等)返回给浏览器,至此一次请求完成。
Servlet(Server Applet)
1、概念
是Sun(Oracle)公司制定的用于扩展web应用服务器的一个组件规范。
2、web应用服务器:可以部署bs架构项目的服务器。
最开始,web应用服务器只能进行一些静态资源的处理。
无法满足需要经过计算得到的动态资源。
之后出现了CGI,通用编程接口,来实现动态接口。
但是CGI(Common Gateway Interface) 编程非常复杂,不利于开发与维护。
之后就出现了替代CGI的技术,Servlet.
3、规范
通过继承或实现某些类或接口,符合一定规范,可以完成部分功能,并且需要部署到容器里的组件。
4、容器
就是能实现组件功能的一个程序。
Tomcat
1、tomcat是apache基金会的一个servlet容器。
也相当于一个微型的web应用服务器。
2、安装:
解压,放在某一路径下
3、在conf文件下
server.xml里的<Connector port = "8080"……
修改成你想要的端口号:不修改的话可能与oracle的http协议端口号相碰撞
4、启动服务器
windows:startup.bat
linux:startup.sh
PS:启动后窗口不要关闭
异常:闪退:没有配置JAVA_HOME环境变量
Address already in use:……port 端口号被占用
5、打开任意浏览器进行测试:
http://ip:prot
例子: http://localhost:8080
出现一只喵即成功
手工编写一个web程序
web程序的组织架构
(1)appName
--WEB-INF
--classes
---xxx.class
--lib(可选)
---xxx.jar
--web.xml
--index.html(主页-可选)
(2)自定义一个源文件(如:HelloWorld)
0)先导包
1)继承HttpServlet
2)重写service方法
3)获取流对象,输出信息
(3)编译源文件
javac -classpath servlet-api.jar的全路径 源文件.java
(4)将class文件放入组织架构里的classes文件夹下
(5)编写web.xml
1)注册servlet组件
<servlet>
<!--组件昵称-->
<servlet-name>firstweb</servlet-name>
<!--组件的类全名 -->
<servlet-class>HelloWorld</servlet-class>
</servlet>
2)注册servlet组件的映射信息
<servlet-mapping>
<!--必须与组件昵称一致-->
<servlet-name>firstweb</servlet-name>
<!--url-pattern的值与浏览器地址栏上的值必须匹配 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
(6)部署项目到服务器中
将(1)的整个组织架构放入webapps中
(7)启动服务器
(8)使用浏览器访问服务器中的项目
http://ip:port/appName----- 访问项目的首页
http://ip:port/appName/url-pattern
使用IDE开发web程序
1、先配置tomcat
window-->preferences-->server-->runtime environments-->add-->
tomcat-v7.0-->next-->browser-->硬盘上的tomcat-->选择文件夹-->关闭
2、显示tomcat
window-->show view-->servers-->点击连接-->选中tomcat-v7.0-->finish
3、设置tomcat的参数信息
双击tomcat
配置server locations
选择use tomcat installation
修改
使用IDE开发web项目
1、new-->dynamic web project
2、起名后-->next-->next-->选择web.xml-->finish
3、定义Servlet组件,编写Servlet规范的程序
4、配置web.xml
5、部署项目
点击servers里的tomcat-->add and remove-->添加要部署的项目-->finish
6、启动tomcat
7、使用浏览器访问
错误代码及其解决方法
服务器在处理完业务逻辑后,会响应浏览器,响应的内容包含了状态编码(数字类型)
200:表示成功处理业务
404:服务器处理的路径存在问题,找不到相关请求资源
如:
(1)在地址栏上的路径有问题(大小写不对)
(2)<url-pattern>的值与地址栏路径不一致
(3)两个servlet-name不一致
(4)没有部署项目
(5)项目的组织结构有问题
405:容器找不到Servlet组件的service方法。
(1)方法名写错
(2)方法的参数类型有问题
(3)方法的异常,返回值有问题
500:容器找不到Servlet组件
(1)没有继承HttpServlet或实现Servlet接口
(2)<servlet-class>写的有错
(3)service里的逻辑出现了问题
HTTP协议
1、概念
http协议是w3c(万维网联盟)定义的一种用于应用层的协议,就是规定了浏览器与web服务器如何通信的数据格式。
2、如何通信
(1)浏览器与服务器之间先建立连接
(2)浏览器将数据打包发送给服务器--->发送请求
(3)服务器要将数据打包发送给浏览器--->发送响应
(4)断开连接
一次连接后就断开一次:为服务器端有限的连接数做到尽可能多的连接客户端。
3、数据格式
请求数据包---------请求行:请求方式+请求资源路径+协议类型
reg: get + /firstweb/hello +http/1.1
消息头:w3c组织定义的一些键值对,用来向服务器发送一些特定的数据。
浏览器的类型及其版本
如:user-agent:Edge/17.1736
Accept:text/html
……
实体内容: 请求方法为post请求时,实体内容才有数据。
响应数据包
状态栏:服务器端处理数据的结果。
格式:协议版本+状态编码+状态描述信息
如:http/1.1 200 ok
消息头:服务器端要告诉浏览器端的一些信息
Connect:keep-Alive
Date:……
ContentType:text/html
实体内容:服务器端处理后的数据
Servlet如何处理HTTP协议
当浏览器向服务器端发送请求后,服务器端会维护两个对象,用来封装和处理请求数据包的数据,及其响应数据。
分别是HttpServletRequest和HttpServletResponse对象
1、HttpServletRequest对象
封装和处理请求数据包的数据,提供了以下方法
String getParameter(String name)
String[] getParameterValues(String name)
String getHeader(String str)
Enumration<E> getHeaders()
RequestDispatcher getRequestDispatcher(String url)
……
2、HttpServletResponse对象
封装和处理服务器端要响应给浏览器的数据
提供了以下方法:
void setContentType()
Servlet的工作过程
1、Servlet的运行原理
(1)浏览器依据IP和PORT与服务器建立连接
(2)发送请求数据包到服务器
(3)服务器创建Servlet组件对象
(4)使用request处理请求数据包
(5)使用response封装响应数据
(6)服务器发送响应数据包
(7)浏览器进行解析,生成页面
2、Servlet处理参数值
处理1对1形式的参数与参数值
String getParameter(String name)
如果name不存在,返回null
处理1对多形式的参数与参数值
String[] getParameterValues(String name)
如果name不存在,返回null
3、请求方式
浏览器向服务器请求的种类有八种:
GET,POST,OPTIONS,HEAD,PUT,DELETE,TRACE,CONNECT
(1)常用的两种GET和POST
get:向特定资源发送请求(如返回登陆界面)
--在地址栏上直接写地址
--表单的默认提交
post:向指定资源提交数据(提交表单,上传文件)
--表单的method属性设置为POST
(2)两者的区别
get:提交的数据会显示在地址栏上,数据量小,最多为4kb,不安全
post:提交的数据不会在地址栏上显示,因此我们可以提交大量的数据,相对安全
Servlet处理中文参数值
中文会出现乱码,原因是编码与解码的字符集不一致造成
发送请求时:中文乱码解决方式
方式1:适合 get/post,服务端先编码再解码
服务器端默认使用iso-8859-1解码
浏览器端常用的为utf-8进行编码
方式2:只适合post
request.setCharacterEncoding("utf-8")
位置:处理请求参数前
发送响应时:
response.setContentType("text/html;charset=utf-8")
位置:写在获取流之前
重定向
1.概念
服务器处理完业务逻辑后,向浏览器发送一个状态码302,
同时发送一个消息头Location,此消息头的值是一个新地址。
当浏览器接收到这些信息后,会立即向服务器发送该地址的请求。
2.重定向的原理
3.如何重定向
response.sendRedirect(String url)
url:是重定向的新地址
4.重定向的特点
地址栏的地址会发生改变
重定向之前不能进行流关闭流
两次请求不共享request和response对象
Servlet处理请求资源路径
1.什么是请求资源路径
http://ip:port/appName/url-pattern
请求资源路径:appName/url-pattern
2.处理原理
浏览器依据ip和端口号port确定服务器,之后依据appName确定应用程序所在的目录,
servlet容器默认浏览器请求的是Servlet组件,所以会校验web.xml里的url-pattern,
进行匹配,执行相关的Servlet组件。
3.精确匹配
服务器在进行web.xml里的url-pattern的校验时,会严格匹配请求路径是否一致,如果
匹配成功就会执行相关资源。
reg:<url-pattern>/hello.html</url-pattern>
如果严格匹配成功后,即使程序中有hello.html页面,也不会返回这个页面,而是
执行相关Servlet
4.通配符匹配
通配符:*,匹配0个或多个字符,必须使用斜杠
reg:<url-pattern>/*</url-pattern>
比如http://ip:port/appName/abc.html---匹配成功
http://ip:port/appName/service/add.html---匹配成功
http://ip:port/appName/listEmp---匹配成功
5.后缀匹配
在写web.xml里的url-pattern的值时,我们可以使用*.后缀的方式,后缀可以是1或多个字符组成的。
如:<url-pattern>*.action</url-pattern>
例如:
http://ip:port/appName/abc.html---匹配失败
http://ip:port/appName/emp/abc.action---匹配成功
http://ip:port/appName/listEmp.action---匹配成功
优先级:精确匹配最高,后缀匹配最低
假如:web.xml中有三个Servlet组件,其url-pattern如下
<url-pattern>/abc.do</url-pattern>
<url-pattern>/*</url-pattern>
<url-pattern>*.do</url-pattern>
浏览器地址:http://ip:post/appName/abc.do
会执行精确匹配的Servlet组件
如果精确匹配,通配符匹配,后缀匹配都没有成功,容器会查找是否有此文件。如果有此文件,打包
数据返回给浏览器,如果没有,返回404。
6.Servlet组件的合并
一般情况下,Servlet组件充当的角色为控制角色,控制角色的作用是接收到请求后进行分发
到不同的资源里,因此一个Servlet就可以对请求资源路径进行分析,使用分支结构来处理不同
的资源。
如何合并:
(1)采用后缀匹配进行修改web.xml
(2)获取请求资源路径进行分析,然后使用if分支进行处理
Servlet的生命周期
Servlet容器如何创建Servlet对象,如何初始化Servlet对象。
如何调用其功能,及其Servlet对象的销毁。
生命周期分为四个阶段,分别为实例化,初始化,就绪,销毁。
阶段1:实例化
即容器创建Servlet对象。
时机1:容器收到请求后,创建Servlet对象
时机2:容器启动后,立即创建Servlet对象
web.xml中需要配置<load-on-startup></load-on-startup>
阶段2:初始化
容器在创建Servlet对象后,会立即调用init方法进行对象的初始化,一般情况下,我们不需
要重写此方法,因为父类型GenericServlet里提供了init方法的实现逻辑。此方法保存了另
外一个对象ServletConfig的引用。
如果你想初始化一些自定义的属性,我们可以将初始化的值配置在web.xml中。
<init-param>
<param-name>company</param-name>
<param-value>华育兴业</param-value>
</init-param>
通过ServletConfig提供的getInitParameter(String name)来获取值
阶段3:就绪
初始化之后,容器调用Servlet对象的service方法进行资源分配。
阶段4:销毁
容器会根据自己的算法进行Servlet对象的销毁,销毁前会调用destroy()方法。因此我们可以
重写此方法来完成一些业务逻辑。
卸载程序时,一定会销毁Servlet对象。