1、学习servlet前的必要的知识
1.1软件架构
1.1.1b/s软件架构
即浏览器/服务器模式,browser/server
特点:b/s架构相当于c/s来说开发简单,并且容易维护
页面相对于c/s来说比较简陋
基于Http协议的
1.1.2c/s架构
即客户端/服务器模式,client/server
特点:相对于b/s来说,开发维护起来比较困难
页面比较华丽,充分利用显卡资源
基于tcp协议之上自行创建了一个协议
1.2资源分类
1.2.1静态资源
不同的用户去访问同一个静态资源,得到的结果是一样的
浏览器内置静态资源的解析引擎
创建的静态资源:html、css、js、png、jpeg
1.2.2动态资源
不同的用户去访问同一个动态资源,得到的结果可能是不一样的
动态页面技术:php、asp、jsp、servlet
1.3网络通信三要素
IP地址:通过IP地址可以识别计算机网络中的一台主机,如192.168.2.184
端口号:通过端口号能够在一台计算机中唯一识别一个应用程序,范围:1~65535,如mysql服务器的默认端口:3306,web服务器http 默认端口号:80
通信协议:TCP传输层协议:给上层(应用层)协议提供可靠数据传输,三次握手建立连接
UDP传输层协议:不可靠,优点:速度较快
1.4web服务器
服务器:运行服务端软件的计算机
服务软件:提供软件服务,web服务软件,mysql数据库软件
文本服务器:提供web服务的计算机,可以在web服务器中,创建多个web项目,每个web项目可以组织一些资源,提供给浏览器访问
url:统一资源定位符
1.5tomcat web服务器软件
1.5.1常见的web服务器软件
WebLogic
WebSphere
JBOSS
tomcat
1.5.2tomcat软件
安装:解压到某个不带中文的目录
卸载:解压的目录删除掉即可
运行:tomcat有java开发的,运行依赖JDK或JRE,确保JAVA_HOME正确配置
双击bin\startup.bat
关闭:在tomcat运行的控制窗口中 ctrl+c或在命令行cmd.exe中,输入bin\shutdown.bat
非正常关闭:直接X掉tomcat运行的控制窗口
8080端口占用:通过命令 netstat -ano 查找哪个进程占用了8080端口,可以在Windows任务管理器中强制关闭该进程
tomcat日志输出乱码解决:conf\logging.properties中有5处utf-8修改为GBK
2、Servlet入门
2.1概念
servlet,server applet缩写,运行在服务器上的小程序
本质是一个接口,定义了一个Servlet对象如何被web服务器所能访问的规则
2.2Servlet入门程序
第一步,创建一个java类使其实现Servlet接口,空实现以后再service方法中打印hello
第二步,配置web.xml,定义该servlet能够被浏览器访问的url样式
![](https://i-blog.csdnimg.cn/blog_migrate/a588db5cd4a31746ea7a4c73b17f4d93.png)
servlet规范web3.0引入一个注解@WebServlet("所配置的uri"),代替web.xml的servlet相关的配置
![](https://i-blog.csdnimg.cn/blog_migrate/052b1fd711556490fa91fec31eabd2d3.png)
2.3Servlet对象生命周期
创建:默认情况下,是在第一次被浏览器访问的时候创建,调用init()方法,标签load-on-startup可以使该servlet再web服务器启动时初始化
活着(提供服务):每次访问都会调用service()方法,多次访问,多次调用
销毁:当web服务器正常关闭时,会被web容器销毁,调用destroy()
![](https://i-blog.csdnimg.cn/blog_migrate/172f7e31aa60bfa52c799034d98d820f.png)
2.4Servlet的继承体系
Servlet接口
GenericServlet抽象类:将service()做成抽象方法,其他Servlet接口中的方法做了一个空实现
![](https://i-blog.csdnimg.cn/blog_migrate/a86b9273dae925cafaf168511e7a0e05.png)
HttpServlet抽象类:在web开发领域对Servlet做了一些相关Http协议的实现,根据请求方式,来复写doGet()方法和doPost()方法即可
![](https://i-blog.csdnimg.cn/blog_migrate/6bf4bd162d28327f077d36491912d7c8.png)
2.5Servlet urlPatern写法
/xxxx:基础写法
/xxx/yyy:二级目录写法
{"/xxx","/yyy",......}:多个url的形式
*.do:匹配以.do结尾的,此处的do可以是自定义的
/:匹配所有(但是优先级低于已经存在的url),以 .jsp结尾的东西可以被访问到
/*:匹配所有(但是优先级低于已经存在的url),以.jsp结尾的东西无法被看见
![](https://i-blog.csdnimg.cn/blog_migrate/f91a1377a7e725ecc5aa74adc6087e87.png)
3、Request对象
3.1Http协议
Hyper Text transfer Protocol:超文本传输协议
3.1.1特性
基于TCP协议的高层协议,应用层,可靠的
默认端口号 80
基于请求响应模型,一次请求,有且仅有一次响应
无状态,每次请求响应之间,协议本身不会记录相关的状态信息,多次请求与响应之家是无法共享数据
3.1.2请求信息
请求行:请求头部信息的第一行
GET /requestDemo1 Http/1.1
请求方式 请求的地址 协议/版本号
请求方式(有7种,我们只掌握两种):
GET:
意味着找服务器拿数据,并不希望修改服务器的状态
传递参数是直接放在请求url中(请求行中),格式是在请求url末尾以?开始
url长度有2k限制,传参不能传递大量的数据(文件)
会浏览器的地址栏中显示传递的参数,相对不安全
GET方式没有请求体
POST:
意味着给服务器放数据,意图希望改变服务器的某些状态
传递参数放在请求体中,参数大小没有限制,用于给服务器上传文件
传递参数相对安全
POST有请求体
请求头:格式一行显示一个 名:值 对(后端可以通过request对象得到)
请求空行:用于分割请求头和请求体
请求体:(按f12在payload中查看,post请求时为Form Data,get请求时为Query String Parameters)
存放浏览器发送给服务器的实质数据
GET请求方式没有请求体,POST方式才有请求体
如果是表单提交,那么请求体中的数据为该格式:name=zs&pwd=123
3.2request对象
在浏览器发送请求时,服务器都会创建一个request对象,并且把前端发送的请求数据封装到request中
3.2.1request中常用api
request.getParameter("请求参数名"):获取前端传过来的参数的值
request.getRequestURI():获取浏览器访问时的URI
request.getRequestURL()获取浏览器访问时的URL
request.getQueryString():获取使用get请求时url后面拼接的参数
使用URLDecoder.decode方法和URLEncoder.encoder方法可以实现类似的双向转换
![](https://i-blog.csdnimg.cn/blog_migrate/63014213caca205b9062c4f2090d9517.png)
3.2.2请求转发------内部资源的跳转
request.getRequestDispatcher("选择要进行跳转的资源").forward(request,response)
特点:浏览器并不知道请求转发,浏览器地址栏不会有任何变化
只能转发到服务器内部资源
只有一次请求和响应
![](https://i-blog.csdnimg.cn/blog_migrate/a522205f04da0d810a112edf97830ee8.png)
3.3域对象
3.3.1概念
使用域对象可以在一定的作用范围内共享数据,不同的域对象其作用范围也会不同
3.2.2四个域对象
PageContext(PageContextImpl类):当前jsp页面范围内有效
request(HttpServletRequest类):一次请求内有效
session(HttpSession类):一整个会话中有效(打开浏览器到关闭浏览器)
application(ServletContext类):整个web工程范围内都有效(web工程不停止,数据都在)
3.2.3共享数据方法
request.setAttribute("数据名", 数据):设置一些共享数据
request.getAttribute("数据名"):获取共享的数据
request.removeAttribute("数据名"):删除共享的数据
3.3中文乱码问题
get请求发送中文没有乱码,tomcat帮我们处理了
post请求发送中文有乱码
原因:在发送请求时使用utf-8对中文编码,解码时,读请求体数据的流对象中的缓冲区编码默认使用IOS-8859-1,不一致导致乱码
解决:request.setCharacterEncoding("utf-8"),注意要在获取请求参数之前使用