黑马程序员技术交流社区

标题: 【石家庄校区】JavaEE个人学习总结4day10Servlet [打印本页]

作者: sun2ice    时间: 2018-2-4 15:56
标题: 【石家庄校区】JavaEE个人学习总结4day10Servlet
#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






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2