Servlet|Tomcat、Servlet、Cookie、Session

Servlet

Servlet项目创建

Tomcat简介

概念

运行在用户态、应用层的软件,沟通浏览器和后台服务的桥梁

Tomcat和浏览器之间通过网络通信,遵从HTTP协议/TCP协议/IP协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SemuKEw-1592151636050)(E:\sust.onedrive\OneDrive - sust.edu.cn\Java复习\tmp图片\image-20200614195133964.png)]

基本机制

在这里插入图片描述

Servlet简介

概念

Java Servlet是运行在web服务器或应用服务器上的程序,它是作为来自Web浏览器或其它HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层

定位

Java Servlet是用Java编写的服务器端程序

作用

交互式地浏览或修改数据,生成动态Web内容

编写Servlet注意事项

HttpServlet与Servlet

HttpServlet是Servlet接口的一个实现类,同时也是抽象类

所以我们自己实现的Servlet继承自HttpServlet,根据具体情况,选择覆写doGet()或者doPost()

Servlet对象的生命周期

init() -> service()(多次) -> destory() -> 由JVM的垃圾回收器进行回收

Servlet对象工作在多线程环境下

tomcat内部是使用线程处理每个请求的,且每个Servlet对象只会存在一个,所以覆写的doGet()等方法,是运行在多线程环境下的,需要考虑线程安全

Servlet代码基本结构

通过req获取用户请求(获取HTTP请求中的信息)

根据业务需要,结合本地存储(MySQL/No-SQL/文件/后端的其他API),满足用户的要求

通过resp把服务结果返回给用户(填充HTTP响应的过程)

关于Servlet的API和HTTP知识

req获取请求信息的API
String method = req.getMethod(); //方法
String path = req.getRequestURI(); //路径
String version = req.getProtocol(); //协议

 //获取请求头
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
     String key = headerNames.nextElement();
     String value = req.getHeader(key);
}

 //获取请求正文
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
     String key = parameterNames.nextElement();
     String value = req.getParameter(key);
}
resp中写入内容的API
resp.setContentType("text/html;charset=utf-8"); //text/html;text/css;application/javascript;application/json
resp.setStatus(200);
resp.sendRedirect("https://www.baidu.com");
HTTP状态码之重定向

301/302:带着GET跳转 resp.sendRedirect("");

307:根据浏览器之前的方法跳转 resp.setStatus(“307”); resp.setHeader(“Location”,“location”);

GET vs POST

GET是查询,因此不带请求正文,具备幂等性

POST是插入,因此可以带请求正文,不具备幂等性

Servlet Cookie

@WebServlet("/set-cookie")
public class SetCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //方式一:手动种
        resp.setHeader("Set-Cookie", "name=x");
        resp.setHeader("Set-Cookie", "age=18");
        resp.setHeader("Set-Cookie", "name=y; age=18");
        resp.getWriter().println("<h3> 手动种cookie </h3>"); //只显示了最后一个的cookie,以及分号后面的内容没有显示

        //方式二
        Cookie namex = new Cookie("namex", req.getParameter("name"));
        resp.addCookie(namex);
        Cookie age = new Cookie("age", req.getParameter("age"));
        resp.addCookie(age);
        Cookie namey = new Cookie("namey", req.getParameter("namey"));
        resp.addCookie(namey);
        resp.getWriter().println("<h3> 法二 </h3>");

    }
}

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

@WebServlet("/get-cookie")
public class GetCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/txt;charset=utf-8");

        //方式一:
        String cookie = req.getHeader("Cookie");
        resp.getWriter().println("从请求的请求体获得cookie值:"+ cookie );

        //方式二:
        Cookie[] cookies =  req.getCookies();
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            resp.getWriter().println("cookie 名称:" + cookie.getName());
            resp.getWriter().println("cookie 值:" + cookie.getValue());
        }
    }
}

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

Servlet Session

@WebServlet("/set-session")
public class SetSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        String now = format.format(date);

        String name = "xxx";

        HttpSession session = req.getSession();
        session.setAttribute("now", now);
        session.setAttribute("name", name);

        resp.getWriter().println("<h3> session 写入成功 </h3>");
    }
}
@WebServlet("/get-session")
public class GetSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("session");

        HttpSession session = req.getSession();
        String now = (String) session.getAttribute("now");
        String name = (String) session.getAttribute("name");

        resp.getWriter().println("<h3> now = " + now + " name = " + name + " </h3>");
    }
}

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

Servlet 文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form method="post" action="upload" enctype="multipart/form-data">
        <input type="file" name="file" multiple>
        <button type="submit">提交</button>
    </form>
</body>
</html>
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        Collection<Part> parts = req.getParts();
        for (Part part : parts) {
            System.out.println(part.getName());
            System.out.println(part.getSubmittedFileName());
            System.out.println(part.getContentType());
            System.out.println(part.getSize());
            Collection<String> headerNames = part.getHeaderNames();
            for (String headerName : headerNames) {
                part.getHeader(headerName);
            }
            InputStream is = part.getInputStream();
            // 使用的是相对路径
            OutputStream os = new FileOutputStream("E:\\uploads\\" + part.getSubmittedFileName());
            byte[] buf = new byte[1024];
            int len;
            while ((len = is.read(buf)) != -1) {
                os.write(buf, 0, len);
            }
            os.close();
            System.out.println("==========================================");
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值