JavaWeb~ 学习Servlet常见方法与生命周期( HTTP Request、HTTP Response、 Servlet Cookies、Servlet Session)

Servlet处理Http请求的生命周期

  • Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
  1. Servlet 通过调用 init () 方法进行初始化。

它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化.

  1. Servlet 调用 service() 方法来处理客户端的请求。

Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类
型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

  1. Servlet 通过调用 destroy() 方法终止(结束)。

destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收

  1. 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

操作 HTTP Request头的方法

在这里插入图片描述

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

public class HttpServletTest1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");

        String encoding = req.getCharacterEncoding();
        String contentType = req.getContentType();
        String contextPath = req.getContextPath();
        String ua = req.getHeader("User-Agent");
        String host = req.getHeader("Host");
        String method = req.getMethod();
        String protocol = req.getProtocol();
        String queryString = req.getQueryString();
        String url = req.getRequestURI();
        int contentLength = req.getContentLength();

        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("encoding: " + encoding);
        writer.write("<br/>");
        writer.write("contentType: " + contentType);
        writer.write("<br/>");
        writer.write("contextPath: " + contextPath);
        writer.write("<br/>");
        writer.write("ua: " + ua);
        writer.write("<br/>");
        writer.write("host: " + host);
        writer.write("<br/>");
        writer.write("method: " + method);
        writer.write("<br/>");
        writer.write("protocol: " + protocol);
        writer.write("<br/>");
        writer.write("queryString: " + queryString);
        writer.write("<br/>");
        writer.write("url: " + url);
        writer.write("<br/>");
        writer.write("contentLength: " + contentLength);
        writer.write("<br/>");
        writer.write("</html>");
    }
}

  • form表单静态页面访问
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome</title>
</head>
<body>
<form method="post" action="test2">
    <input type="text" name="firstName" placeholder="firstName">
    <input type="text" name="secondName" placeholder="secondName">
    <input type="password" name="password" placeholder="password">
    <input type="submit" value="join">
</form>
</body>
</html>
  • 实现代码
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

public class HttpServletTest2 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String firstName = req.getParameter("firstName");
        String secondName = req.getParameter("secondName");
        String password = req.getParameter("password");
        resp.setContentType("text/html; charset=utf-8");

        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("<h1>firstName: " + firstName + "</h1");
        writer.write("<br/>");
        writer.write("<h1>secondName: " + secondName + "</h1>");
        writer.write("<br/>");
        writer.write("<h1>password: " + password + "</h1>");
        writer.write("</html>");
    }
}

  • 获取header部分
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;

public class HttpServletTest3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //resp.setContentType("text/html; charset=utf-8");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        //返回的是一个枚举
        Enumeration<String> enumeration = req.getHeaderNames();

        Writer writer = resp.getWriter();
        writer.write("<html>");

        while (enumeration.hasMoreElements()) {
            String header = enumeration.nextElement();

            writer.write("<h1>" + header + ": " + req.getHeader(header) + "</h1>");
        }
        writer.write("</html");
    }
}

操作HTTP Response头的方法

在这里插入图片描述

  • 返回一个404
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpServletTest5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 得到一个 Tomcat 内置的错误页面.
        resp.sendError(404);
    }
}

  • 返回时间并设置一秒刷新一次
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.Date;

public class HttpServletTest4 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 每秒自动刷新
        // 返回的页面中, 填写上当前时间.
        // 获取当前时间
        // System.currentTimeMillis();
        // new Date();
        // new Calender();
        resp.setContentType("text/html; charset=utf-8");
        //设置header部分 1 表示每间隔一秒
        resp.setIntHeader("Refresh", 1);
        Date date = new Date();

        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("<h1>" + date.toString() + "</h1>");
        writer.write("</html>");
    }
}

  • 返回重定向
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpServletTest6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //重定向到一个网页 这个方法自动帮我们设置了respond的状态码和状态描述等相关信息
        resp.sendRedirect("https://blog.csdn.net/Shangxingya/article/details/107295800");
    }
}

设置 HTTP 状态代码的方法

在这里插入图片描述

Servlet 操作cookie方法

在这里插入图片描述

  • 设置cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpServletTest7 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //构建一个Cookie
        Cookie name = new Cookie("userName", "listen");
        Cookie password = new Cookie("password", "listenY");
        //把cookie写到respond中
        resp.addCookie(name);
        resp.addCookie(password);
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("<h1>设置Cookie成功</h1>");
    }
}

  • 或得cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

public class HttpServletTest8 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获得Cookie字段
        Cookie[] cookies = req.getCookies();
        //将所有的cookie输出到响应报文中
        resp.setContentType("text/html; charset=utf-8");
        Writer writer = resp.getWriter();
        writer.write("<html>");
        for (Cookie c : cookies
             ) {
            writer.write("<h1>" + c.getName() + ": " + c.getValue() + "</h1>");
        }
        writer.write("</html>");
    }
}

  • 删除cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

public class HttpServletTest10 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //删除现有的cookie
        //获取所有cookie 然后将这些cookie的生命时间设置为0
        //将这些cookie保存在响应报文中
        Cookie[] cookies = req.getCookies();
        // 设置响应内容类型
        resp.setContentType("text/html; charset=utf-8");

        if (cookies != null) {
            for (Cookie c : cookies
                 ) {
                c.setMaxAge(0);
                resp.addCookie(c);
            }

            Writer writer = resp.getWriter();
            writer.write("<html>");
            writer.write("<h1>删除cookie成功</h1>");
        } else {
            Writer writer = resp.getWriter();
            writer.write("<html>");
            writer.write("<h1>当前没有cookie</h1>");
        }
    }
}

Servlet 操作session方法

在这里插入图片描述

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.Writer;

public class HttpServletTest9 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 先获取 Session. 如果用户曾经没有访问过, 此时将创建新的 session
        //    如果用户已经访问过了, 就获取到曾经的 Session
        //    新用户访问:
        //    这个操作就会自动生成一个 sessionId, 同时创建一个 httpSession 对象
        //    把这个键值对放到内置的 hash 表中. 同时把 sessionId 写回到浏览器的
        //    Cookie 中
        //    老用户访问:
        //    根据请求中 Cookie 里的 sessionId, 在 hash 表中查, 找到对应的 session 对象
        HttpSession session = req.getSession(true);
        // 2.判断是否为新用户
        Integer count = 1;
        if (session.isNew()) {
            //新用户
            // 把 count 值写入到 session 对象中.
            // httpSession 也可以当成是一个 hash 表.
            session.setAttribute("count", count);
        } else {
            // 老用户
            // 从 httpSession 中读取到 count 值
            count = (Integer) session.getAttribute("count");
            count++;
            session.setAttribute("count", count);
        }
        resp.setContentType("text/html; charset=utf-8");
        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("<h1>" + session.getAttribute("count").toString() + "</h1>");
        writer.write("</html>");

    }
}

Servlet文件上传理解

  • 前端表单
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件表单</title>
</head>
<body>
<h1>选择上传的文件</h1>
<form method="post" action="upload" enctype="multipart/form-data">
    <input type="file" name="file" size="50">
    <br/>
    <input type="submit" name="上传文件">
</form>
</body>
</html>
  • 文件传输代码
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.Writer;

//必须要有这个字段表示文件上传
@MultipartConfig
public class HttpServletTest11 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String loadPath = "D:\\java\\test\\";
        //获取文件,文件在html中的name是“file”
        Part imag = req.getPart("file");
        //制作文件全路径
        String path = loadPath + imag.getSubmittedFileName();
        imag.write(path);
        //如果上传成功就制作响应报文
        resp.setContentType("text/html; charset=utf-8");
        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("<h1>写入成功</h1>");
        writer.write("<h1>路径为: " + path + "</h1>");
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值