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

       拷贝servlet-api.jar
       定义一个servlet类实现servlet接口
       关联源代码 apche-tomcat-7.0.57-src.zip
       配置web.xml文件,使servlet可以在tomcat运行
          <servlet>
	       <servlet-name>HelloServlet</servlet-name>
	      <!--全限定名-->
	       <servlet-class>cn.wjw.servlet.HelloServlet</servlet-class>
	 </servlet>
	 <servlet-mapping>
	       <servlet-name>HelloServlet</servlet-name>
	       <!--资源名称-->
	       <url-pattern>/hello</url-pattern>
	</servlet-mapping>
	  其中url-pattern是资源名称
		```
		
		
		
		<?xml version="1.0" encoding="utf-8"?>
		<web-app xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0"
     metadata-complete="false">
	<servlet>
		<servlet-name>MappingServlet</servlet-name>
		<servlet-class>org.fkjava._01_.mapping.MappingServlet</servlet-class>
		<!-- 
		    load-on-startup 如果小于0 init方法不会随着tomcat启动而执行
			load-on-startup 默认值是 -1
			load-on-startup 如果大于0 init方法就会随着tomcat启动而执行
			值的范围  0-5 ,数值越大,优先级越高
		 -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>MappingServlet</servlet-name>
		<url-pattern>/student/mapping</url-pattern>
	</servlet-mapping>
	</web-app>

**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启动的时候执行,在<servlet>配置一个子元素:
     <load-on-startup>1</load-on-startup>

5.Servlet初始化参数

   web.xml中初始化参数配置;
          <servlet>
          <init-param>
	      <param-name>encoding</param-name>
	      <param-value>GBK</param-value>
	  </init-param>
   </servlet>
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("<html>");
	out.println("<head>");
	out.println("<title>");
	out.println("我是title");
	out.println("</title>");
	out.println("</head>");
	out.println("<body>");
	out.println("我是内容");
	out.println("</body>");
	out.print("</html>");
	//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对象只有一个)

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