1、基础概念
web资源:放在服务器上的一切文件.称之为web资源.
静态web资源:内容是一成不变的.
动态web资源:内容有可能在不同的时间或者不同的人访问的时候会发生变化
静态web技术:例如 html css js ..
动态web技术:例如 servlet jsp ..
C/S结构:客户端和服务器端
B/S结构:浏览器和服务器端
常见的web服务器
(1)weblogic:所属于oracle,大型的收费的支持javaEE所有规范的web服务器(servlet和jsp)
(2)websphere:所属于IBM,大型的收费的支持javaEE所有规范的web服务器(servlet和jsp)
(3)tomcat:属apache
http协议:
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
请求行:
请求信息的第一行 请求的方式--> 请求的资源--> 协议/版本
请求头:
Accept: text/html,image/* --支持数据类型 mime类型
Accept-Charset: ISO-8859-1 --字符集
Accept-Encoding: gzip --支持压缩
Accept-Language:zh-cn --语言环境
Host: localhost --访问主机
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存文件的最后修改时间
Referer: http://www.test.com/index.jsp --来自哪个页面、防盗链
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 浏览器内核
Cookie:会话技术
Connection: close/Keep-Alive --链接状态
Header | 解释 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html,application/json |
Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |
Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
Host | 指定请求的服务器的域名和端口号 | Host: www.zcmhi.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives... |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
请求体:和请求头之间有一个空行,存放的data数据。
响应头:
Location: http://www.ldd.com/index.jsp --跳转方向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Type: text/html; charset=utf-8 --数据类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间
Refresh: 1;url=http://www.ldd.com --定时刷新
Content-Language: zh-cn --语言环境
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
Connection:Keep-Alive --连接
Set-Cookie Location Content-Type Refresh Content-Disposition Last-Modified
响应体:和响应头之间有一个空行,浏览器解析的内容
2、Servlet
一个实现了servlet接口的普通java类,在于交互式地浏览和修改数据,接受请求,处理请求,生成动态的web内容。
实现servlet的两种方式
(1)原生实现 实现servlet接口 并且配置web.xml
处理业务的方法是:service() 方法。
(2)继承HttpServlet类
原理:HttpServlet extends GenericServlet ,GenericServlet implements servlet,
HttpServlet间接的实现了servlet接口,并且HttpServlet重写了service方法,并且本地实现了
doGet、doPost方法。在service方法中判断当前请求是Get还是Post,然后调用相应的doGet或doPost.
然后咱们自定义的类继承了extends HttpServlet,重写了doGet doPost ,当然也继承了service方法,在请求过来的时候
先调用service方法,然后在调用相应的doGet 或者doPost。
Servlet的生命周期:
默认第一次请求来的时候,服务器创建servlet的对象,且调用init方法实现初始化操作,且调用一次service方法,每当请求来的时候,服务器获取一个线程,调用service方法,完成具体的业务逻辑(编写的代码)当servlet被移除的时候或者服务器正常关闭的时候,服务器调用destroy方法实现销毁操作。
补充:servlet是一个单实例,多线程的。每次请求的时候都会创建一个新的线程来对应一个service方法。
注意:因为在第一次请的时候,才会创建servlet。但是可以在web.xml配置启动的时候就创建servlet。
url-pattern的配置:
完全匹配: 以"/"开始 例如 : /hello
目录匹配: 以"/"开始 以"*"结束 例如: /*
后缀名匹配: 以"*"开始 例如: *.jsp *.action *.do
优先级:完全匹配>目录匹配>后缀名匹配
注意:一个路径对应一个servlet,一个serlvet对应多个路径
3、servletContext(上下文)
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象或者直接getServletContext()获取对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
作用:获取全局初始化参数,资源共享(servlet通信),获取资源文件
创建:服务器启动的时候会为每个项目创建一个servletContext上下文对象,servleContext是项目的一个引用。
销毁:在服务器关闭或者移除项目的时候servletContext销毁。
常用方法:
InputStream getResourceAsStream(String filepath) //以流的方式返回一个文件
String getMimeType(String 文件名) //获取一个文件的mime类型 text/html image/gif
setAttribute(String name,Object value) //设置
getAttribute(String name) //获取指定的属性值
removeAttribute(String name) //移除指定的属性
4、response(响应)
响应行状态码分类:
302:重定向 配置响应头location使用
304:读缓存
常用方法:
setHeader(String name,String value) //设置一个字符串形式的响应头
setIntHeader(String name,int value) //设置一个整型的响应头
setDateHeader(String name,long value) //设置一个时间的响应头
addHeader(String name,String value) //追加一个字符串形式的响应头 若无设置则设置,若已设置则追加
addIntHeader(String name,int value) //追加一个整型的响应头
addDateHeader(String name,long value) //追加一个时间的响应头
常见的响应头:
location:重定向:response.sendRedirect("/hello");
refresh:定时刷新:<meta http-equiv="refresh" content="3;url=/hello">
content-type:设置文件的mime类型; 设置响应流的编码,通知浏览器用什么编码打开
响应体:
常用方法:
PrintWriter getWriter() //字符流
getOutputStream() //字节流
响应中文乱码:
response.setContentType("文件的mime类型;charset=utf-8");
response.setHeader("content-type","文件的mime类型;charset=utf-8");
文件下载:
两个头一个流:
设置文件的mime类型 response.setContentType(Stirng 文件的mime类型)
设置文件下载头 response.setHeader("content-disposition","attachment;filename="+文件名称)
输出流 response.getOutputStream()
注意事项:
火狐浏览器要求对中文编码成base64格式
其他浏览器要求对中文编码成utf格式
5、request
请求行常用方法:
String getMethod():获取请求的方式
String getContextPath():获取项目动态路径 /servletstudy
String getRemoteAddr() 获取请求者的ip
String getRequestURI():获取的是请求的资源(不带get请求的参数)
String getQueryString():获取的get请求参数 username=sidadiao&password=123
String getProtocol():获取协议和版本
请求头常用方法:
String getHeader(String name):获取的一个请求头(返回值为string)
int getIntHeader(String name)
long getDataHeader(Stirng name)
Enumeration getHeaders(String name)
请求体(操作请求参数get或者post):
String getParameter(String name):获取的单值的请求参数
String[] getParameterValues(String name):获取的指定请求参数(多值)
Map<String,String[]> getParameterMap():获取的所有的参数名称和值
请求的中文乱码:浏览器向服务器发送的数据存在中文乱码
get/post通用 new String(乱码.getBytes("iso8859-1"), "utf-8");
针对post请求: request.setCharacterEncoding("utf-8")
转发和重定向:
转发:request.getRequestDispatcher("/内部路径").forward(request,response);
重定向:resp.sendRedirect(“/外部路径”);
重定向发送两次请求 请求转发发送一次请求
重定向地址栏变化 请求转发地址栏不变
重定向是响应发起的 请求转发是请求发起
重定向路径不带协议和主机的绝对路径 请求转发是内部路径
重定向不能使用request的属性操作 请求转发可以使用request属性操作