体系结构
servlet---接口
GenericServlet---抽象类
HttpServlet---抽象类
GenericsServlet:将Servlet接口中其他方法做了默认空实现,只将service()方法作为抽象方法
将来定义servlet类时,可以继承GenericsServlet,实现service()方法即可
HttpServlet:对http协议的一种封装,简化操作
定义类继承httpServlet
复写doGet/doPost方法
servlet相关配置:
urlpartten:servlet访问路径
一个servlet可以定义多个访问路径:@webServlet({"路径一","路径二","路径三"})
路径定义规则:
/XXX:路径匹配
/XXX/XXX:多层路径。结构目录
*.do:扩展名匹配
HTTP:
概念:全称为:Hyper Text Transfer Protocol超文本传输协议
传输协议:定义了客户端与服务器端通信时发送数据的格式
特点:
基于TCP/IP的高级协议
默认端口号为80
基于请求/响应模型的:一次请求对应一次响应
无状态的:每次请求之间相互独立,不能交互数据
历史版本:
1.0:每次请求响应都会建立新的连接
1.1:复用连接
请求消息数据格式:
请求行:
请求方式 请求url 请求协议/版本
GET/login.html HTTP/1.1
请求方式:
HTTP协议由七种请求方式,常用两种:
GET:
请求参数在请求行中,在url后
请求的url长度有限制的
不太安全
POST:
请求参数在请求体中
请求的url长度没有限制的
相对安全
请求头:客户端浏览器告诉服务器一些信息
请求头名称:请求头值
User-Agent:浏览器告诉服务器,访问服务器使用的浏览器版本信息
可以在服务器端获取该头的信息。解决浏览器的兼容性问题
Referer:http://localhost/login.html
告诉服务器,当前请求从哪里来
作用:防盗链;统计工作
请求空行:
一个空行,用于分隔POST请求的请求头,和请求体的
请求体(正文):
封装POST请求消息的请求参数的
字符串格式
响应消息数据格式
request对象和response对象的原理
request和response对象是由服务器创建的,我们只是使用它
request对象时来获取请求消息的,response对象是来设置响应消息
request对象是继承体系结构:
ServletRequest ---接口
| 继承
HTTPServletRequest ---接口
| 实现
org.apache.catalina.connect.RequestFacade 类(tomcat)
request功能:
获取请求消息数据
获取请求行数据:
GET:/DEMO/demo1?name=zhangsan HTTP/1.1
方法:
获取请求方式:GET
*String getMethod()
(重要知识点)获取虚拟目录:/DEMO
*String getContextPath()
获取Servlet路径:demo1
*String getServletPath()
获取get方式请求参数:name=zhangsan
*String getQureyString()
(重要知识点)获取请求URI:/DEMO/demo1
*String getRequestUTI():/DEMO/demo1
*StringBuffer getRequestURL(): http://localhost/DEMO/demo1
URL:统一资源定位符,如:http://localhost/DEMO/demo1
URI:统一资源标识符,如:/DEMO/demo1
获取协议及版本:HTTP/1.1
*String getProtocol()
获取客户机的IP地址:
*String getRemoteAddr()
获取请求头数据:
方法:
(重要知识)String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有请求头名称
获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的参数
步骤:获取流对象
BufferReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
在从流对象中拿数据
其他功能:
1.获取请求参数通用方式∶不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值username=zs&password=123
2. String[] getParameterValues(String name);根据参数名称获取参数值的数组 hobby=xx&hobby=game
3. Enumeration<string> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
中文乱码问题:
get方式:tomcat 8已经将get方式乱码问题解决了
post方式:会乱码
解决∶在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
2.请求转发︰—种在服务器内部的资源跳转方式
1.步骤:
1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(string path)
2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
2.特点:
1.浏览密地址栏路径不发生变化
2.只能转发到当前服务器内部资源中。
3.转发是一次请求
3.共享数据︰
域对象:一个有作用范围的对象,可以在范围内共享数据
*request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
1. void setAttribute(string name,object obj):存储数据
2. object getAttitude(string name):通过键获取值
3. void removeAttribute(string name):通过键移除键值对
4.获取servletcontext :
servletcontext getservletcontext()
BeanUtils略
响应消息∶服务器端发送给客户端的数据
*数据格式:
1、响应行
1.组成:协议/版本响应状态码状态码描述
2.响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1.状态码都是3位数字
2.分类:
1.1xx∶服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2.2xx∶成功。代表:200
3.3xx∶重定向。代表:302(重定向),304(访问缓存)
4. 4xx∶客户端错误。
*代表:
*404〔请求路释没有对应的资源)
*405:请求方式没有对应的doXxx方法
5.5xx∶服务器端错误。代表:50e(服务器内部出现异常)
2.响应头:
1.格式:头名称:值
2.常见的响应头︰
1. content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition :服务器告诉客户端以什么格式打开响应体数据
*值∶
*in-line :默认值,在当前页面内打开
*attachment;filename=xxx∶以附件形式打开响应体。文件下载
3.响应空行
4.响应体:传输的数据
*功能:设置响应消息
1.设置响应行
1.格式:HTTP/1.1 200 ok
2.设置状态码:setstatus ( int sc)
2.设置响应头: setHeader(string name,string value)
3.设置响应体:
*使用步骤:
1.获取输出流
字符输出流:Printwriter getwriter(
字节输出流: Servletoutputstream getoutputstream()
2.使用输出流,将数据输出到客户端浏览器
完成重定向方式
*重定向:资源跳转的方式多代码实现:
方法1、设置状态码为302,设置响应头location
response.setstatus( 302);2.设置响应头location
response.setHeader( "location" , " /day/responseDemo2");
方法2、简单的重定向方法
response. sendRedirect(" / day/responseDemo2");
*重定向的特点: redirect
1.地址栏发生变化
2.重定向可以访问其他站点(服务器)的资源
3,重定向是两次请求。不能使用request对象来共亨数据
*转发的特点: forward
1,转发地址栏路径不变
2.转发只能访问当前服务器下的资源
3.转发是一次请求,可以使用request对象来共亨数据
路径写法:
1.路径分类
1.相对路径∶通过相对路径不可以确定唯一资源
如: ./index.html
*不以/开头,以.开头的路径
*规则:找到当前资源和目标资源之间的相对位置关系
*./:当前目录
* ../:后返一级目录
2.绝对路释:通过绝对路径可以确定唯一资源
*如: http: / / localhost/day/responseDemo2
/ day/responseDemo2
以/开头的路径
*规则∶判断定义的路释是给谁用的?判断请求将来从哪儿发出
*给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
*建议虚拟目录动态获取:request.getcontextPath()
*<a> , <form>重定向...
*给服务器使用:不需要加虚拟目录
*转发路径
服务器输出字符数据到浏览器
*步骤:
1.获取字符输出流 2.输出数据
*注意:
*乱码问题:
1. Printwriter pw = response.getwriter();获取的流的默认编码是I50-8859-1
2.设置该流的默认编码
3.告诉浏览器响应体使用的编码
//简单的形式,设置编码,是在获取流之前设置
response.setContentType( "text/ html; charset=utf-8");
服务器输出字节数据到浏览器
*步骤:
1.获取字节输出流 2.输出数据
Javaweb基础知识---servlet、HTTP、Request
原文:https://www.cnblogs.com/9-King/p/14319109.html