#day10Servlet
##Servlet的概述
* 运行在WEB服务器上的小的java程序用来接收和响应从客户端发送过来的请求,通常使用HTTP协议
* 是SUN公司提供的一个动态网页开发技术
* 作用: 处理从客户端浏览器发送的请求,并对请求做出响应
* 使用
* 定义一个类实现servlet的接口/继承HttpServlet
* 去web.xml中配置虚拟路径
* Servlet `servlet-name servlet-class`
* Servlet-mapping `servlet-name url-pattern`
##配置:
```
<!-- 配置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
```
##使用Servlet接收参数
* `String getParameter(String name);`---用于接收一个名称对应一个值的数据.
* `String[] getParameterValues(String name);`---用于接收一个名称对应多个值的数据.
* `Map getParameterMap();`---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
* `Enumeration getParameterNames()`---用于获取表单中提交的所有的参数的名称.
##Servlet的声明周期
* 生命周期就是一个对象从创建到销毁的过程
```
* Servlet
* 何时创建:用户第一次访问Servlet 创建 Servlet的实例(对象)
* 何时销毁:当项目从服务器中移除的时候 ,或者关闭服务器的时候
* 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中 init 方法就会执行,任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法,在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).
* 当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
```
#Servlet的相关配置
* 启动时创建Servlet
* 在web.xml中在在web.xml中在<servlet></servlet>标签中配置:
* ` <load-on-startup>2</load-on-startup> ` --- 传入正整数,整数越小,被创建的优先级就越高.注意从2开始
* url-pattern虚拟路径的配置
* 方式一: 完全路径
* 方式二: 目录匹配
* 方式三: 扩展名匹配 不能使用/开头
##开发中的路径的编写:
* 绝对路径----建议使用绝对路径---/开头/项目资源/
* 相对路径----不能使用/开头
##ServletContext 域对象:(重要)-被多个用户共享.
###ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象.
* 在服务器启动的时候ServletContext就会被创建.一个WEB项目创建一个ServletContext对象.在服务器关闭的时候销毁`.ServletContext context = this.getServletContext();`
* 域对象-存的数据有作用范围.
* 功能:
* 1.获得文件的MIME的类型.
* 2.获得全局初始化参数.
* 3.存取数据-作为域对象来使用.
* 4.读取WEB项目的文件:
###1.获得文件的MIME的类型.
* `this.getServletContext().getMimeType("1.html") 返回string`
### 2.获得全局初始化参数.
```
配置全局初始化参数:
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
String username = this.getServletContext().getInitParameter("username");
String password = this.getServletContext().getInitParameter("password");
```
###3.存取数据-作为域对象来使用.**
* `setAttribute(String name,String value);用来存取数据:`
* `getAttribute(String name);用来向ServletContext中存入数据.`
* `removeAttribute(String name);用来从ServletContext中获取数据.`
###4.读取WEB项目的文件:
* `getResourceAsStream(String path);根据提供路径读取文件返回一个文件的输入流.`
* `getRealPath(String path);返回一个路径的磁盘绝对路径.`
##Http协议中的Response信息
* Response 代表响应的对象,从服务器向浏览器输出内容
* 响应行
* `setStaus(int) 状态码`
* 响应头
* `setHeader(String name,String value);`--- 针对一个key对应一个value的响应头.
* `setDateHeader(String name,long date);`
* `setIntHeader(String name,int value);`
* 响应体
* 做出响应的时候只能使用其中的一种流响应
* `getOutputStream()`
* `gerWriter()`
##文件下载
* 方式一: 超链接下载,直接将文件路劲写到超链接写到href中 前提 文件类型浏览器支持
* 方式二: 手动编写代码下载
* 设值两个头和一个流
* `Content-Type Mime类型 文件的MIME的类型`
* `Content-Disposition 以下载的形式打开文件\`
* `InputStream 文件的输入流 `
##接收参数的中文乱码的处理:
* GET :`new String(“”.getBytes(“ISO-8859-1”),”UTF-8”)`
* POST :`request.setCharacterEncoding(“UTF-8”); `
##服务器向浏览器输出中文的时候乱码解决???
```
设置响应头
响应头的编码是固定的ISO-8859-1,所有我们需要给浏览器能看懂的东西
if(header.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
设置响应体
方式1 response.setContentType("text/html;charset=UTF-8)"
```
##Http协议中的Request信息
* 使用request获得客户机的信息. `getRemoteAddr(),getMethod(),getRequestURL()`
* 获得请求参数`:getParameter(),getParameterValues(),getParameterMap()`
* 作为域对象存取数据: ` setAttribute(),getAttribute(),removeAttribute();`
* 获取项目名`request.getContextPath()`
* request何时创建和销毁的?
* 创建:从客户端向服务器发送请求.那么服务器创建一个request对象.
* 销毁:服务器为这次请求作出了响应之后,服务器就会销毁request对象.
* 作用范围:一次请求.
##重定向和转发的区别:(redirect和forward的区别)
* 1.重定向的地址栏会发生变化,转发的地址栏不变.
* 2.重定向两次请求两次响应,转发一次请求一次响应.
* 3.重定向路径需要加工程名,转发的路径不需要加工程名.
* 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
* 转发` request.getRequestDispatcher("/路径 不需要项目名").forward(request, response);`
* `重定向response.sendRedirect("/路径 需要项目名");`
##向浏览器要东西用request 给东西用response
|
|