Servlet知识总结
Servlet的相关知识:
Servlet中的service方法:
这个方法的作用是对客户端的请求做出相应的相应
一个Servlet程序的编写过程:
1、先写一个类,这个类实现Servlet,实现相应的方法
2、在service方法中编写对应的代码
3、在web.xml中编写相应的Servlet程序配置
Servlet的生命周期:
- 执行Servlet构造方法
- 执行init初始化方法
第一二步都是在第一次进行执行的时候执行的,如果重复访问Servlet网页,第一二步不会再次执行
- 执行service方法
第三步,每访问一次Servlet网页都会进行执行
- 执行destroy销毁方法
第四步,在web工程停止的时候进行调用
(上述的都是在实现Servlet类中都应该实现的类)
在一般的实际项目开发中,都是使用继承Servlet的HttpServlet类的方法取实现Servlet程序的
步骤:
- 编写一个类去继承HttpServlet类
- 根据业务需要重写doGet和doPost方法
- 到web.xml文件中配置Servlet程序的访问地址
ServletConfig是Servlet程序的配置信息类
ServletCofig和Servlet程序都是Tomcat服务器负责创建,我们负责使用。
Servlet程序默认是在第一次访问的时候进行创建,ServletConfig是在每个Servlet程序创建的时候,就创建一个相应的ServletConfig对象(每一个ServletConifg对象那个对应一个Servlet程序,他只能获取到他自己对应的Servlet对象在web.xml文件中的标签的值)
我们在重写init()方法的时候,一定要加上一句super.init(ServletConfig对象),不然就会出现空指针异常,为什么呢?
原因是我们重写的init方法中的参数中的ServletConfig这个参数是一个在GenericServlet抽象类中的参数,在GenericServlet抽象类中也具有init方法,在这个init方法中,他将传入的ServletConfig参数进行保存起来了,如果我们再重写init方法的时候没有加上super.init(ServletConfig对象)这段代码的话,我们就不能将ServletConfig进行保存起来,就会出现异常
ServletContext类他是一个接口。
ServletContext对象:(Servlet上下文对象)
ServletContext对象在每一个web工程只存在一个,不管使用多少次getServletContext()方法,返回的都是同一个ServletContext对象
ServletContext对象是一个域对象,在工程进行部署的时候进行创建,在web工程停止的时候销毁,一个工程在部署的时候都只能创建一个ServletContext对象
什么是域对象?
域对象,是可以和map集合一样的可以存取数据的对象,叫做域对象
这里的域指的是存储数据的操作范围
添加数据: 获取数据: 删除数据
域对象:setAttribute() getAttribute()removeAttribute()
Map:put() get() remove()
ServletContext类的四个作用:
1、获取在web.xml文件中的context-param标签中的上下文参数
2、获取当前工程的路径:格式:/工程路径
3、获取当前工程部署后在服务器硬盘上的绝对路径
4、像map集合一样存取数据
第一种工程部署的方式:
直接将文件拷贝到Tomcat中的webapps中(webapps中的每一个文件夹都是一个工程,也就是网页)
部署好之后,如果想要进行访问,需要将html文件的路径从webapps中这个工程为起始文件进行添加路径进行访问
工程部署的第二种方法
在conf这个配置文件夹中的Catalina\localhost中添加一个xml文件,我举例为kkk.xml文件,在xml文件中进行编写以下代码:
<Context path="/kkk" docBase="E:\IdeaProjects\JavaWeb\out\artifacts\web03_war_exploded" />
代码解释:
Context表示是一个工程上下文
path表示工程的访问路径为/kkk(这个kkk是和xml文件名相同的)
docBade表示的是你的工程目录在哪里(也就是第一种方法中的在webapps中添加的文件夹的位置)
使用这种方式,就不需要再将工程目录存放在webapps目录下了,可以存放在任意位置,前提是docBase后面的值等于工程目录的位置
在进行访问的时候,会从配置文件中加载进行工程的位置,在进行访问
客户端向服务器发送数据叫做请求,服务器向客户端发送数据叫做相应
请求又分为两种:(get请求和post请求)
- get请求
- 请求行
- 请求的方式 get
- 请求的资源路径[ +?+请求参数](这里的请求参数就是标签中的name属性)
- 请求的协议版本号 Http/1.1
- 请求头
1)key:value 组成 不同的键值对表示不同的涵义
请求头中常见的key:
Accept:告诉服务器,客户端可以接受的数据类型
Accept-Language:告诉服务器,客户端接受的语言类型
Zh_CN 中文
En_US 英文
User-Agent:里面就是浏览器的信息(Agent表示代理, 代替用户替我们发送信息的东是是服务器)
Accept-Encoding:告诉服务器客户端可以接受的数据编码(压缩)格式
Host:表示请求的服务器ip和端口号
Connection:告诉服务器请求的连接如何
Keep-Alive 告诉服务器回传数据不要马上关闭,保持一段时间的连接
Closed 马上关闭
Poet请求:
- 请求行
1)请求方法 post
2)请求的资源路径[+?+参数]
3)请求的协议的版本号 Http/1.1
- 请求头
1)key:value 不同的键值对有不同的含义
空行(这里有一个空行将数据进行分开)
Post请求常见的key:
1、 Accept:客户端支持什么数据类型的数据
2、Accept-Language:客户端接受的语言类型
3、Referer:表示发送请求时,浏览器地址栏中当前的地址(从哪儿来)
4、User-Agent:表示浏览器的信息
5、Content-Type:表示发送的数据类型
Application/x-www-form-url lencoded
表示提交的数据格式是:
Key=value&key=value,然后在对其进行url编码,url编码是把非英文的内容转为%xx&xx的形式
Multipart/form-data
表是以多短的形式提交数据给服务器(以流的方式进行提交,用于上传)
- content-length:表示发送的数据的长度
- cache-control:表示如何控制缓存 no-cache表示不缓存
- 请求体—>>>给服务器的请求
常见的get请求:
- form标签 method=get
- a标签
- link标签引入css文件
- script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器地址栏中输入地址后敲回车
常见的post请求:
- form标签 method=post
响应的Http协议格式:
1、响应行
1)响应的协议和版本号
2)响应状态码
3)响应状态描述符
2、响应头
1)key:value 不同的响应头有不同的含义
空行
3、响应体 🡪就是回传给客户端的数据
常见的响应码:
200:表示请求成功
302:表示url重定向,请求重定向
404:表示请求服务器已经收到了,但是你要访问的数据不存在(请求地址错误)
500:表示请求服务器已经收到了,但是服务器内部错误(代码错误)
MIME:
MIME是Http协议中的数据结构
MIME的类型格式是:大格式/小格式
例如:
普通文本 text/plain
超文本标记语言文本 text/html
GIF图片 image/gif
HttpServletRequest类的作用是什么:
每次只要是客户端发送请求到Timcat服务器,Tomcat服务器就会将这个请求进行包装成一个request对象,然后传入service方法(doGet或者是doPost)中给我们使用,我们可以通过HttpServletRequest类查看到请求的全部信息。
HttpServletRequest类中的常用方法:
1、getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的同意资源路径(资源的绝对路径)
- getRemoteHost() 获取客户端的ip地址
- getHeader() 获取请求头
- getParameter()获取参数
- getParameterValues()获取参数具有多个值的时候使用(例如多选框的值等)
- getMethod()获取请求的类型(get或者是post)
- setAttribute()在域对象中添加数据
- getAttribute()在域对象中哦获取数据
- getRequsetDispatcher()获取请求转发对象
什么是请求转发:
请求转发是指服务器收到请求后,从一方资源跳转到另一方资源的操作叫做请求的转发
Web中的相对路径和绝对路径:
相对路径:
. 表示当前路径
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
例如:<a href=”/”>斜杠</a>
Web中斜杠 / 的不同含义:
/ 斜杠在浏览器中被解析为:http://ip:port/
/ 斜杠在服务器中被解析为:http://ip:port/工程路径
例如:
1、<url-pattern>/servlet<url-pattern>
2、servletContext.getRealpath(“/”)
3、request.getRequestDispatcher(“/”)
特殊情况:
Response.sendRediect(“/”) 把斜杠发送到浏览器进行解析,解析到的结果应该是斜杠在浏览器中解析到的结果
HttpServletResponse类的作用:
HttpServletResponse和httpServletResquest一样,每次请求出来,Tomcat创建一个Response对象传递给servlet程序进行使用,HttpServletRequest表示请求的信息,HttpServletResponse表示响应的信息
我们如果需要设置返回给客户端的信息,都可以通过httpServletResponse对象进行设置
对于两个流的说明:
字节流:getOutputStream() 常用于下载和上传(传递二进制文件,值得注意的是,所有的文件都可以看作二进制文件)
字符流:getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。(使用了字节流就不能在使用字符流,反之也是,否则就会报错)
请求重定向:
返回响应码为302
当客户端访问的页面已经进行替换之后,当客户端发送出相应的请求的时候,服务器返回响应的响应码和location地址,location地址就是新的网页的地址,浏览器接受到服务器返回的响应码和location之后,知道当前的页面已经不能访问了,就向location中的地址进行访问,也就是说,浏览器会发出两次请求,服务器也会发出两次响应。
请求重定向的特点:
1、浏览器的地址栏中会发生变化
2、有两次请求
3、因为是两次请求,所以,这两次请求是不同的域对象,因此,在第一次请求中保存的数据,在第二次请求中不能进行获取
4、不能进入web-inf中获取数据(在这里提一下,哪里可以获取web-inf中的数据呢?只有在服务器中才能获取到web-inf中的数据,请求转发就可以获取到web-inf中的数据,因为他是从一个资源路径跳转到另一个资源路径,在进入第一个资源路径的时候就已经是在服务器中了,因此在第二次的资源路径可以是web-inf中的资源,但是请求重定向就不一样,他是两次请求,第一次请求发送到服务器之后,服务器返回了响应码和location,浏览器进行解析后,再将地址栏中的地址修改为location中的地址,因此不能访问到web-inf中的资源)
5、可以访问工程以外的资源(请求转发不能访问工程以外的资源,请求重定向可以访问工程以外的资源)
请求重定向的第一种方法:
//设置响应状态码302
Response.setStatus(302);
//设置location地址(新的地址在哪儿)
Response.setHeader(“location”,”http://ip:port/工程路径/资源路径”);
请求重定向的第二种方式:(推荐使用)
response.sendRedrict(“http://ip:port/工程路径/资源路径”)