本帖最后由 小石姐姐 于 2018-5-23 15:01 编辑
day13-Tomcat与Servlet入门
### 【HTTP的协议的概述】
协议:
\* 什么是协议:规定双方需要遵守的规则.
HTTP协议:
* HTTP协议的作用:规范浏览器和服务器之间的数据传递
HTTP协议的特点:
\* 基于请求和响应的模型.
* 必须先有请求后有响应.
* 请求和响应必须成对出现.
* 默认的端口号是80.
HTTP协议的版本:
* 1.0 :每次响应后即刻关闭了连接.
* 1.1 :现在使用.不是每次响应后挂断,等待长时间以后没有请求会挂断.
###【HTTP协议的详解】
**请求部分**
***** **请求行**
* 提交方式:
* 提交方式有很多,常用的GET和POST:
* GET和POST的区别:
* GET的提交的参数会显示到地址栏上,而POST不显示.
* GET往往是有大小限制的,而POST没有大小的限制.
* GET没有请求体,而POST有请求体.
* 提交路径:
* 协议版本:
***** **请求头**
* 都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.
* User-Agent :代表浏览器的类型. --- 文件下载:下载中文文件:IE使用URLEncodor进行编码,而Firefox使用Base64编码.
* Referer :代表的是网页的来源.--- 防盗链.
* If-Modified-Since :通常与响应中的头Last-Modified一起使用查找本地缓存.
***** **请求体**
* 就是POST提交方式的提交的参数
**响应部分**
***** **响应行:**
* 协议版本
* 状态码
* 200 :成功
* 302 :重定向
* 304 :查找本地缓存
* 404 :资源不存在
* 500 :服务器内部错误
* 状态码描述
* **响应头:键值对,一般一个key对应一个value,也有一个key对应多个value.**
* Last-Modified :与请求中的If-Modified-Since一起使用查找本地缓存.
* Content-Dispostion :文件下载的使用使用的一个头信息.
* Location :重定向的跳转的路径.
* Refresh :定时刷新 / 定时跳转
* **响应体:显示浏览器的页面的内容**
###【Servlet的概述】
* 什么是Servlet:
* 就是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.
* Servlet就是SUN公司提供的一个动态网页开发技术.
* Servlet的作用:用来处理从客户端浏览器发送的请求,并且可以对请求作出响应
* 使用Servlet:
* 编写一个类实现Servlet接口.
* 将编写的这个类配置到服务器中
```html
* 配置:
<!-- 配置Servlet -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>test1</servlet-name>
<!-- SErvlet的全路径 -->
<servlet-class>com.itheima.a_servlet.ServletDemo1</servlet-class>
</servlet>
<!-- Servlet的映射 -->
<servlet-mapping>
<!-- Servlet的名称 -->
<servlet-name>test1</servlet-name>
<!-- Servlet的访问路径 -->
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
* 访问:
http://localhost:8080/day09/ServletDemo1
```
###【使用ServletRequest接收参数】
* String getParameter(Stringname); ---用于接收一个名称对应一个值的数据.
* String[]getParameterValues(String name);---用于接收一个名称对应多个值的数据.
* Map getParameterMap(); ---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
* Enumeration getParameterNames() ---用于获取表单中提交的所有的参数的名称
### 【Servlet的实现的关系】
```html
Servlet :接口
|
GenericServlet :通用的Servlet
|
HttpServlet :HttpServlet
* 编写一个类继承HttpServlet,重写doGet和doPost方法.
* 配置
```
###Servlet的生命周期
```tex
* 生命周期:就是一个对象从创建到销毁的过程.
* Servlet生命周期:Servlet从创建到销毁的过程.
* 何时创建:用户第一次访问Servlet创建Servlet的实例
* 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
* 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
```
### Servlet的相关的配置:
**【启动时创建Servlet】**
Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在< servlet > < /servlet>标签中配置:
*< load-on-startup>2< /load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高.
**【url-pattern的配置】**
url-pattern配置方式共有三种:
1.完全路径匹配 :以 / 开始 例如: /ServletDemo4, /aaa/ServletDemo5 /aaa/bbb/ServletDemo6
2.目录匹配 :以 / 开始需要以 * 结束. 例如: /* ,/aaa/* ,/aaa/bbb/*
3.扩展名匹配 :不能以 / 开始 以 * 开始的. 例如: *.do , *.action *
* 错误的写法 : /*.do
如果访问地址:
<http://localhost:8080/day09/ServletDemo4> :第一个
<http://localhost:8080/day09/aaa.do> :第二个
***** 完全路径匹配 > 目录匹配 > 扩展名匹配
### 开发中的路径的编写
相对路径:都是需要找位置相对关系.不能以 / 开始的.
* ./ 当前路径 ../上一级目录
* 使用相对路径访问:
* <http://localhost:8080/day09/demo4-url/demo1.html>
* http://localhost:8080/day09/ServletDemo6
绝对路径:不需要找位置相对关系. 以 / 开始的.
* 绝对路径中分为客户端路径和服务器端路径:
* 客户端路径一定要加工程名. /day09/ServletDemo6
* 服务器端路径不需要加工程名 . /ServletDemo6
**【response中设置响应头】**
* addHeader(String name,String value); --- 针对一个key对应多个value的响应头.
addDateHeader(String name,long date);
addIntHeader(String name,int value);
*** setHeader(Stringname,String value); ---** **针对一个key对应一个value的响应头.**
*** setDateHeader(String name,long date);**
*** setIntHeader(String name,int value);**
**【ServletContext对象】**
ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象
用来存取数据:
void setAttribute(String name, Onject object)
用来向ServletContext中存入数据
object getAttribute(String name)
用来从ServletContext中获取数据.
void romove Attribute(String name)
**用来从ServletContext中移除数据.**
ServletContext:重要
* ServletContext的作用:
* 1.用来获得全局初始化参数.
* 2.用来获得文件的MIME的类型.
* **3.作为域对象存取数据.**
* **ServletContext是一个域对象.**
* **作用范围:整个web工程.**
* **创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象**.
* **销毁:服务器关闭的时候,或者项目从服务器中移除的时候.**
* **4.用来读取web项目下的文件.**
* **getResourceAsStream(Stringpath);**
* **getRealPath(Stringpath);**
### 【response处理中文乱码】
* 字节流:
设置浏览器默认打开编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
中文转成字节数组编码
response.getOutputStream().write("王守义".getBytes("UTF-8"));
* 字符流:
设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
设置浏览器默认打开的编码.
response.setHeader("Content-Type","text/html;charset=UTF-8");
**response.setContentType("text/html;charset=UTF-8");相当于上面两句**
### 【文件下载】
一种:超链接方式.(不推荐)
* < ahref=”aa.zip”>下载</a>
* < ahref=”1.jpg”>下载</a>
二种:手动编码方式完成文件下载.
* 设置两个头和一个流:
*Content-Type:文件MIME的类型.
*Content-Dispostion:
* 文件的输入流:
### 中文文件名下载
```html
中文文件在不同的浏览器中编码方式不同:
IE :URL编码
Firefox :Base64编码
if(agent.contains("Firefox")){
// 火狐浏览器
filename = base64EncodeFileName(filename);
}else{
// IE,其他浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}
```
### 【请求对象-request对象】
getMethod(); ---获得请求方式.
* getQueryString(); ---获得请求路径后的参数.
* getRemoteAddr(); ---获得客户机的IP地址.
* getRequestURI(); ---获得请求的路径
* getRequestURL(); ---获得请求的路径
* getContextPath(); ---获得工程名
### 转发和重定向的区别
【重定向】
response.sendRedirect(String path); -- 完成重定向
【转发】
request.getRequestDispatcher(Stringpath).forward(request,response);
【区别】
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名
**重定向的路径需要加工程名**
使用request域保存一个值:在一次请求范围内有效的.
登录失败就可以保存一个错误信息到request中在动态页面中取出这个值${msg}
|
|