servlet的生命周期,servlet时多线程单实例的对象
    在TOMCAT中每个servlet都只有一个唯一的实例,该实例可以被多个线程之间进行同时访问!

    1. publicinterfaceServlet{
    2. void init(ServletConfig var1)throwsServletException;
    3. ServletConfig getServletConfig();
    4. void service(ServletRequest var1,ServletResponse var2)throwsServletException,IOException;
    5. String getServletInfo();
    6. void destroy();
    7. }

    servlet生命周期:编译—加载—实例化—初始化—服务化—销毁
    (1)、实例化,由Tomcat完成,并且只实例化一次!
    (2)、初始化,Tomcat调用每个Servlet实例上的init(),完成一次初始化!
    (3)、服务化,可以接收用户的请求,调用Servet实例上的service(),服务多次!
    (4)、当停止Tomcat时,调用Servlet实例上destroy()该方法,销毁实例!
    URL地址匹配规则
    web-xml配置方式:
    注解配置方式:@webservlet(urlPatterns={“”})
    精准配置,非常明确的地址,使用最多
    @webServlet(name=”ls”,urlPatterns=”/login”)

    Servlet的核心API

    web.xml配置用法

    1. ac
    2. com.woniuxy.web01.servlet.AddClassServlet
    3. encoding
    4. utf-8
    5. ac
    6. /addClass

    ———————————————————————————————————————————————-
    编码集

    1. privateString encoding;
    2. @Override
    3. publicvoid init(ServletConfig config)throwsServletException{
    4. // TODO Auto-generated method stub
    5. encoding = config.getInitParameter(“encoding”);
    6. System.out.println(encoding);
    7. }

    注解配置

    1. @WebServlet(name=”ac”,urlPatterns=”/addClass”,initParams={
    2. @WebInitParam(name =”encoding”, value =”utf-8”)
    3. })

    二、ServletContext
    概念:Servlet的上下文对象,由TOMCAT提供,每一个JavaWeb都有一个独立的ServletContext,他的生命周期和TOMCAT同步,作用范围有限,也叫作“作用域对象”
    作用:1、用于servlet之间数据的交互
    2、用于设置一些全局参数
    12.28Java学习总结 - 图1
    1、用于Servlet的数据交互
    在某一个Servlet中,添加如下内容:
    //班级名字,转交给老师的ServletServletContext context = req.getServletContext();context.setAttribute(“className”, className);
    在另外一个Servlet中,获得对应的内容:
    //获得到上下文对象ServletContext context = req.getServletContext();String className = (String)context.getAttribute(“className”);System.out.println(className);
    2、用于设置一些全局参数
    1)、在web.xml中添加如下内容
    encoding utf-8
    (2)、在所有Servlet中使用上下文对象获取参数
    ServletContext context = req.getServletContext();String encoding = context.getInitParameter(“encoding”);req.setCharacterEncoding(encoding);
    API方法

    1. ServletContext context = req.getServletContext();
    2. System.out.println(context.getServletContextName());//项目名称
    3. System.out.println(context.getServerInfo());//服务器的信息
    4. System.out.println(context.getRealPath(“files”));//得到files目录的真实路径
    5. Properties props =newProperties();
    6. InputStream is = context.getResourceAsStream(“WEB-INF/db.properties”);
    7. props.load(is);
    8. System.out.println(props.get(“jdbc.url”));

    HttpServletRequest:实际上TOMCAT针对Http请求,封装的请求对象!
    作用:代表用户发起的Http请求

    二、接收页面数据
    方法中的name,就代表时页面表单踢脚线中name属性
    image.png

    1. @Override
    2. protectedvoid doPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{
    3. // TODO Auto-generated method stub
    4. ServletContext context = req.getServletContext();
    5. String encoding = context.getInitParameter(“encoding”);
    6. req.setCharacterEncoding(encoding);

    7. Map params = req.getParameterMap();

    8. System.out.println(params.get(“userName”)[0]);
    9. System.out.println(params.get(“gender”)[0]);
    10. System.out.println(Arrays.toString(params.get(“hobbies”)));

    乱码处理
    前后端交互的过程中可能出现中文乱码
    post乱码:多半时前后端不是同一编码集
    解决方法:req.setCharacterEncoding(utf-8);
    get的乱码,几乎都是TOMCAT服务器造成的
    req.setCharacterEncoding(encoding);//第一种方(如果不能解决:使用第二种)String userName = req.getParameter(“userName”);userName = new String(userName.getBytes(“ISO-8859-1”),”UTF-8”);//第二种方案
    四、获得HTTP头数据
    业务需求:统计下 系统中不同浏览器的使用人群比例!
    String userAgent = req.getHeader(“User-Agent”);//根据请求头名称,获得对应的值// System.out.println(userAgent); //获得所有请求头
    Enumeration enums = req.getHeaderNames();
    while(enums.hasMoreElements()) {
    System.out.println(enums.nextElement()); }


    五、获得URL地址信息

    1. @Override
    2. protectedvoid doGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{
    3. // TODO Auto-generated method stub
    4. System.out.println(req.getRequestURL());//返回请求的完整路径 URL
    5. System.out.println(req.getRequestURI());//返回请求的资源路径 URI
    6. System.out.println(req.getQueryString());//返回请求路径中的请求参数
    7. System.out.println(req.getRemoteAddr());//远程地址
    8. System.out.println(req.getRemoteHost());//远程IP
    9. System.out.println(req.getRemotePort());//远程的端口
    10. System.out.println(req.getRemoteUser());//远程的用户信息
    11. }

    六、跳转界面
    Request也是一个作用域
    作用范围:只在当次的HTTP请求范围内有效!

    HttpServletResponse
    Response是响应对象,每个HTTP请求都有独立的HttpServletResponse对象
    1、响应文本
    image.png
    响应网页信息
    image.png
    请求转发和重定向
    请求转发;服务器只发送一次请求,请求转发共享同一个request对象

    重定向:重定向是当某个路径无法实现功能时,可以请求在服务器外部完成重定向,重定向到另外一个地址去处理该请求,特点是浏览器发起了两次请求

    三、响应添加响应头
    默认的响应头:https://www.runoob.com/http/http-header-fields.html

    1. /添加一个头/
    2. resp.addHeader(“author”,”shenzhen second class!”);
    3. /修改一个头/
    4. resp.setHeader(“Server”,”Jetty”);