1.Servlet就是接口
2.第一个servlet程序

       拷贝servlet-api.jar
       定义一个servlet类实现servlet接口
       关联源代码 apche-tomcat-7.0.57-src.zip
       配置web.xml文件,使servlet可以在tomcat运行
          
           HelloServlet
          
           cn.wjw.servlet.HelloServlet
     
     
           HelloServlet
           
           /hello
    
      其中url-pattern是资源名称
    
    

    MappingServlet
    org.fkjava._01_.mapping.MappingServlet
    
    1


    MappingServlet
    /student/mapping

3.Servlet的生命周期

```servlet生命周期方法:
init(ServletConfig config):初始化方法,获取初始化参数配置
service(ServletRequest req,ServletResponse res):服务方法,用户浏览
每次请求都会执行此方法,所有的业务逻辑全部在此方法完成
destory();servlet的销毁方法
Servlet生命周期执行流程:
创建servlet对象-->init方法-->Service方法-->destory方法(服务器关闭才执行)



**4.Servlet请求流程**

             解析url请求-->在tomcat的conf/server.xml文件找上下文路径,找到项目根路径-->项目根路径的WEB-INF下找web.xml文件中的资源名称url-pattern,找到对应类
      -->第一次请求访问创建servlet对象,非第一次访问从tomcat缓存池获取servlet对象
      -->第一次访问执行init方法-->每次访问都会执行service方法--->响应浏览器一个html```

      将init方法执行的时机放到tomcat启动的时候执行,在配置一个子元素:
         1

**5.Servlet初始化参数**

       web.xml中初始化参数配置;
              
              
              encoding
              GBK
          
       
    ServletConfig读取初始化参数的方法:
         getInitParameter(""):获取指定名称的初始化参数

**6.Servlet的继承体系**

      自定义的servlet-->HttpServlet-->GenericServlet实现Servlet和ServletConfig接口
      重写父类init方法的两种方式:
               重写有参数的init方法,必须调用父类init方法
           重写无参数的init方法(推荐)
      执行业务的三种方法:
            doGet方法中调用doPost方法,让doPost方法执行业务
        doPost方法中调用doGet方法,让doGet方法执行业务
        直接使用service方法(推荐)
**7.HttpServiceRequest常用方法**

     getContextPath():获取当前应用的上下文路径
     getParameter(""):获取请求参数

**8. 解决中文乱码问题;**

        为什么Servlet接收中文会乱码?
             Tomcat默认使用ISO-8859-1编码,单字节编码,不支持中文
        解决乱码的三种方式:
               1.针对GET和POST都有效:
               先将接收的字符串-ISO-8859-1转成字节数组:
                  getBytes("ISO-8859-1");
               再将字节数组-UTF-8的编码转成字符串:
                   new  String(data,"UTF-8");
           2.只对POST有效
                req.setCharacterEoding("utf-8");
           3.只对GET有效:
                 server.xml中71行添加属性URIEnoding="UTF-8"
**9.HttpServletResponse常用方法**

        getWriter():返回字符打印流,向浏览器打印
    getOutputStream():获取字节输出流,用于文件下载
    设置响应编码:
        resp.setCharacterEncoding("utf-8");
    设置响应的MIME类型:
         resp.setContentType("text/html");
     合二为一的方法:
         resp.setContentType("text/html;charset=utf-8");

             public class ResponseServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取字节输出流:用于下载文件
        //ServletOutputStream outputStream = resp.getOutputStream();
        //设置响应编码
        //resp.setCharacterEncoding("utf-8");
        //设置响应的MIME类型
        //resp.setContentType("text/html");
        //和二为一的方法
        resp.setContentType("text/html;charset=utf-8");

        // 获取字符打印流
        PrintWriter out = resp.getWriter();
        out.print("");
        out.println("");
        out.println("");
        out.println("我是title");
        out.println("");
        out.println("");
        out.println("");
        out.println("我是内容");
        out.println("");
        out.print("");
        //Servlet不擅长响应数据,使用JSP(期待)

    }

**10.Servlet的注解配置**

     不忽略servlet的注解:修改web.xml根元素的属性metadata-complete="false"
      @WebServlet("/anno")
            @WebServlet(name="AnnoServlet",urlPatterns={"/anno","/anno1"},loadOnStartup=1,
        initParams={@WebInitParam(name="encoding",value="GBK")}
        )
public class AnnoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException {
        System.out.println(super.getInitParameter("encoding"));
        System.out.println("注解配置的初始化方法执行了");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我是注解配置的servlet");
    }

}
**11.Servlet线程安全问题(selvet对象只有一个)**

       造成多线程并发数据不安全的原因:多个线程同时操作一份数据
       解决方案:不使用成员变量,使用局部变量