Lesson10:ServletAPI详解(HttpServlet、HttpServletRequest、HttpServletResponse)

目录

一、HttpServlet

1.1 核心方法

1.2 servlet的生命周期

注意事项:

1.3 如何构造请求

Postman

二、HttpServletRequest

2.1 核心方法

2.2 获取请求中传来的参数

2.2.1 获取query String

2.2.2 获取body

①如果body里的内容格式,是按照x-www-form-urlencoded也是使用 getParameter来进行处理。

②如果body里的内容格式,是json ,此时需要借助第三方库来处理。

三、HttpServletResponse

3.1 核心方法

3.2 练习

3.2.1 设置状态码

3.2.2 设置header头—自动刷新

 3.2.3 重定向

四、Cookie和Session

4.1 Cookie的引入

4.2 Cookie的优点

4.3 Cookie和Session的区别

4.4 核心方法

4.4.1 HttpServletRequest类中提供的相关方法

4.4.2 HttpServletResponse类中提供的相关方法

4.4.3 HttpSession类中提供的相关方法

 4.5 案例:登录功能,记录访问次数。

五、上传文件

5.1 核心方法

5.1.1 HttpServletRequest类方法

5.1.2 Part类方法

5.2 上传文件案例

5.2.1前端代码

5.2.2 后端代码

当响应中返回中文的时候,就会出现乱码,原因是,处理数据的各个环节编码方式不统一

六、表白墙(交互数据为Json)

6.1搭建项目文件

6.2 约定前后端交互的接口

6.3 编写代码

6.3.1 前端代码

6.3.2 数据库代码

6.3.3 Servlet代码

一、HttpServlet

我们写Servlet代码的时候,首先第一步就是先创建类继承自HttpServlet,并重写里面的某些方法

1.1 核心方法

方法名称调用时机
doGet()收到get请求的时候调用
doPost()收到post请求的时候调用
doPut()、doDelete、doOptions收到其他请求时调用
init在HttpServlet实例化后调用一次
destroy在HttpServlet实例不再使用的时候调用
service收到HTTP请求的时候调用

在实际开发中,主要是重写doXXX方法。init、destroy、service方法很少被重写。

1.2 servlet的生命周期

Servlet对象是由Tomcat来进行实例化的,并且在实例化完毕之后调用init方法

Tomcat收到的每个请求,都是通过对应Servlet的service方法来处理。

Tomcat在结束之前,会调用servlet的destroy方法来进行回收资源。

注意事项:

init和service能够保证在各自合适的时机被Tomcat调用到,但destroy不一定。destroy能不能被调用到,取决于Tomcat是如何被结束的。

①直接杀死进程,直接强制把进程给关了,此时就来不及调用destroy,就没了。

②通过Tomcat的管理端口进行关闭,默认是8005,这种是可以调用的。

1.3 如何构造请求

①在浏览器里直接通过url发送的请求是一个get请求

②构造一个post请求:form、ajax、Java(socket api)。这三种方法都是开发的时候使用的,如果想更方便的测试功能,这几种方法就有点麻烦了。可以使用第三方工具来构造HTTP请求,非常知名的工具—Postman。

Postman

下载地址:Postman

二、HttpServletRequest

Tomcat会按照HTTP协议的格式将HTTP请求(字符串)解析成HttpServletRequest对象

2.1 核心方法

使用HttpServletRequest的方法,能获得HTTP请求里面的一些信息。但是这些方法使用频率不高,因此,就通过一段代码简单的演示一下各种方法的使用方法。

@WebServlet("/try1")
public class try1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getProtocol(); // 协议名称
        req.getMethod(); // 获取方法
        req.getRequestURL(); // 获取URL
        req.getContextPath();
        req.getQueryString();
        // 获取请求头
        Enumeration<String> headers = req.getHeaderNames();
        while(headers.hasMoreElements()){
            String headerName = headers.nextElement();
            String headerValue = req.getHeader(headerName);
        }
    }
}

2.2 获取请求中传来的参数

2.2.1 获取query String

采用getParameter方法。

2.2.2 获取body

①如果body里的内容格式,是按照x-www-form-urlencoded也是使用 getParameter来进行处理。

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        resp.setContentType("text/html;utf-8");
        resp.getWriter().write("username="+username+"  password="+password);
    }

②如果body里的内容格式,是json ,此时需要借助第三方库来处理。

step1 引入依赖Jackson这个库在在中央仓库中获取(搜索 Jackson databind)。

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.1</version>
        </dependency>

将这段代码复制到pom.xml里面就可了。

step2 前后端需要约定HTTP的请求格式:

客户端按照这个格式发HTTP请求,服务器按照这个格式解析HTTP请求。 

step3 程序逻辑

版本1:

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

@WebServlet("/try1")
public class try1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 1.先把整个请求的body都读出来
        String body = readBody(req);
        // 2.再按照json的格式进行解析。(对于json的解析,Java标准库里没有内置的方法,Servlet也没有现成的方法,就需要使用第三方库)
        // 想拿到的是用户名和密码,就需要针对这里的json数据进行解析,变成一个键值对结构或者变成一个对象
        // 创建ObjectMapper对象,这个是Jackson的中心类
        ObjectMapper objectMapper = new ObjectMapper();
        // 通过readValue方法把body这个字符串转为类对象
        // objectMapper遍历UserInfo中的每个成员的名字,去json字符串的key中查找,找到的结果就会赋值给UserInfo对象中
        UsrInfo usrInfo = objectMapper.readValue(body,UsrInfo.class);
        resp.getWriter().write("username:" + usrInfo.username + " password:" + usrInfo.password);
    }
    // 通过这个方法来读取整个请求中的body。
    // 核心操作是req.getInputStream这个方法,通过这个方法可以获得getInputStream对象,然后就可以进一步的读取里面的内容了
    public String readBody(HttpServletRequest req) throws IOException {
        // 1.先拿到body的长度,单位是字节
        int contentLength = req.getContentLength();
        // 2.准备一个字节数组,来存放body的内容
        byte[] buffer = new byte[contentLength];
        // 3.获取到InputStream对象
        InputStream inputStream = req.getInputStream();
        // 4. 读取数据,从InputStream对象中,读到数据,放到buffer这个数组中
        inputStream.read(buffer);
        // 5.将得到的结果构成一个String并返回
        return new String(buffer,"utf-8");
    }
}
// 创建一个类表示JSON数据,属性的名字要和JSON字符串的key一致
class UsrInfo{
    public String username;
    public String password;
}

注意:Jackson库的核心类为ObjectMapper。 

readValue方法:把一个JSON字符串转成JAVA对象。readValue的第二个参数为JsonData的类对象,通过这个类对象,在readValue的内部就可以借助反射机制来构造出JsonData对象,并且根据JSON中key的名字,把对应的value赋值给JsonData的对应字段。

writeValueAsString方法:把一个Java对象转成JSON格式字符串。

版本2:

三、HttpServletResponse

Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应,然后把响应的数据设置到HttpServletResponse 对象中。然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器。

3.1 核心方法

方法描述
void setStatus(int a)为该响应设置状态码
void setHeader(String name.String value)设置报头,如果name已经存在,就覆盖旧的值
void addHeader(String name,String value)设置报头,如果name已经存在,不覆盖,并列添加新的键值对
void setContentType(String type)设置响应的内容类型
void setCharacterEncoding(String charset)设置相同的字符编码
void sendRedirect(String location)使用指定的重定向位置URL发送临时重定向响应到客户端
PrintWriter getWriter()用于向body中写入文本格式数据
OutputStream getOutputStream()用于向body中写入二进制格式数据

注意:对于状态码/响应头的设置要放到 getWriter / getOutputStream 之前,否则可能设置失效。

3.2 练习

3.2.1 设置状态码

@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        int status = 200;
        resp.setStatus(status);
        resp.getWriter().write("status:"+status);
    }
}

3.2.2 设置header头—自动刷新

每隔一秒钟,自动刷新一下页面

@WebServlet("/autoRefresh")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.setHeader("Refresh","1");
        resp.getWriter().write("currentTime:"+ System.currentTimeMillis());
    }
}

 3.2.3 重定向

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        resp.setHeader("Location","https://www.baidu.com");
        // 由于重定向是一个常见操作,因此,还有一个简单的方法来完成这里的重定向
        resp.sendRedirect("https://www.baidu.com");
    }
}

四、Cookie和Session

4.1 Cookie的引入

Lesson7:HTTP协议_刘减减的博客-CSDN博客

的5.3.6小节中指出,Cookie是浏览器提供的一种程序员在本地存储信息的机制,Cookie里面存的是键值对,并且键值对都是程序员自定义的。关于Cookie的一个非常典型的使用场景是:用Cookie来保存用户的登录信息。当登录成功后,后续再访问该网站时,就不用再重新输入用户名和密码。

但是,在实际生活中,和用户强相关的数据非常多,以电商网站为例,和用户相关的信息除了用户名密码,还有浏览记录、爱好、购物车、历史订单等等属性。这些和用户强相关的数据都是需要保存的。

由于这些信息太多了,传输过程中太占资源,因此不适合保存在客户端,保存在服务器最合适。保存方式就是通过session(会话)的方式来保存的。

服务器这边,根据当前用户登录成功后,就会生成一个键值对,key是sessionId,是一个随机不重复唯一的字符串,value就是要保存的身份信息。服务器以键值对的方式把这些会话管理起来(每个用户的登录都会生成一个会话)客户端只需要保存这个sessionID即可,在后续的请求中也是带上sessionID,然后服务器根据sessionID来查找,找到详细信息。

4.2 Cookie的优点

客户端很轻量,不用保存太多资源。

客户端和服务器之间传输的数据量小,节省带宽 。

数据都在服务器存储,如果客户端出现问题,数据不会丢失。

4.3 Cookie和Session的区别

cookie:是客户端存储数据的一种机制,可以存储身份信息,也可以存储其他,由程序员自己定义session:是服务器存储数据的一种机制,也是键值对结构,主要用来存储身份相关的信息

一个网站的登录功能,往往是结合这两个机制,共同实现。

4.4 核心方法

Servlet里面对Cookie和Session的操作提供了一些封装。

4.4.1 HttpServletRequest类中提供的相关方法

方法描述
HttpSession getSession()在服务器中获取会话
Cookie[] getCookies()返回一个数组,包含客户端发送该请求的所有的Cookie对象,会自动把Cookie中的格式解析成键值对。

注意:

getSession参数为true:先看当前请求中是否有sessionID和sessionID是否合法,如果有sessionID,就根据这个sessionID找到对应的HttpSesson对象。如果没有,就生成一个sessionID,并创建一个HttpSession对象,将这一组键值对插入到服务器管理session的hash表中,同时把sessionID通过Set-Cookie在响应中返回给客户端。

getSession参数为false:先看当前请求中是否有sessionID和sessionID是否合法,如果有sessionID,就根据这个sessionID找到对应的HttpSesson对象。如果没有,就直接返回null。

4.4.2 HttpServletResponse类中提供的相关方法

方法描述
void addCookies()把指定的cookie添加到响应中

4.4.3 HttpSession类中提供的相关方法

一个HttpSession对象里面包含多个键值对,可以往HttpSession对象存任何我们需要的信息。

方法描述
Object getAttribute(String name)在HttpSession对象中,根据key获取value
void setAttribute(String name,Object value)在HttpSession对象中,根据key设置value
boolean isNew()判断当前是否创建出新的对象

 4.5 案例:登录功能,记录访问次数。

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="username" >
        <input type="text" name="password" >
        <input type="submit" value="提交">
    </form>
</body>
</html>

后端代码:

1. 登录页面的实现逻辑

①从HTTP请求中读出登录信息,即得到用户名的密码。

采用的时from表单发送请求,body的格式是application/x-www-form-urlencoded,即username=XX&password=XX。可以使用getParameter方法获取。

②对用户名和密码进行校验。

③判断是否登录成功

④登录成功后就创建一个会话

⑤重定向到一个新页面。

2. 代码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 1.从请求中拿到用户名和密码 .form表单,利用getParameter方法
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //2.校验是否用户名和密码是否合法
        if("".equals(username) || "".equals(password) || password == null || username == null){
            resp.getWriter().write("<h3>输入不合法</h3>");
            return;
        }
        //3. 判断是否登录成功.此处假设用户名叫做 admin, 密码叫做 123
        if(!username.equals("admin") || !password.equals("123")){
            resp.getWriter().write("<h3>用户名或者密码错误</h3>");
            return;
        }
        // 4.登录成功,创建新会话,来保存当前用户的信息
        HttpSession session = req.getSession(true);
        // 通过这个操作就给会话中保存了一个程序员自定义的信息
        session.setAttribute("visitCount",0);
        // 5. 将登录成功的结果返回给客户端,不能只是简单的提示登录成功,而是跳转到指定页面
        // 重定向的网站主页的servletpath是showIndex 
        resp.sendRedirect("showIndex");
    }
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/showIndex")
public class ShowIndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf8");
        // 1.先拿到session对象
        HttpSession session = req.getSession(false);
        if(session == null){
            resp.getWriter().write("<h3>您当前未登录</h3>");
            return;
        }
        // 2. 显示登录次数
        int count = (Integer)session.getAttribute("visitCount");
        count++;
        // 3. 将新的登录次数写回到session对象里
        session.setAttribute("visitCount",count);
        resp.getWriter().write("<h2>登录次数:" + count + "</h2>");
    }
}

五、上传文件

上传文件也是日常开发中的一类常见需求。

5.1 核心方法

5.1.1 HttpServletRequest类方法

方法描述
Part getPart(String name)获取请求中指定name的文件
Collection<Part> getParts()获取所有文件。

5.1.2 Part类方法

方法描述

String getSubmittedFileName()

获取提交的文件的名字

long getSize()

获取提交的文件的大小

String getContentType()

获取提交的文件的类型

void write(String path)

将提交的文件写入磁盘文件

5.2 上传文件案例

5.2.1前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="cat" >
        <input type="file" name="word" >
        <input type="submit" value="提交">
    </form>
</body>
</html>

enctype="multipart/form-data"。enctype字段就决定了请求的body中的格式。默认是x-www-form-urlencoded,对于上传文件来说,此时固定使用这个multipart/form-data

5.2.2 后端代码

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 1.获取从前端传来的文件
        Part part = req.getPart("cat");
        System.out.println(part.getSubmittedFileName()); // 文件的名字
        System.out.println(part.getSize());  // 大小
        System.out.println(part.getContentType());  //类型
        part.write("C:\\Users\\piyou\\Desktop\\java\\uploadFile\\cat.jpg"); // 文件保存在本地
        Part part1 = req.getPart("word");
        System.out.println(part1.getSubmittedFileName()); // 文件的名字
        System.out.println(part1.getSize());  // 大小
        System.out.println(part1.getContentType());  //类型
        part1.write("C:\\Users\\piyou\\Desktop\\java\\uploadFile\\word1.txt");
        resp.getWriter().write("<h3>上传完毕</h3>");
    }
}

当响应中返回中文的时候,就会出现乱码,原因是,处理数据的各个环节编码方式不统一

IDEA:UTF-8

浏览器:浏览器默认的是跟随系统的编码方式,Win10中文版编码方式是gbk

如何解决:思路:保证数据的构造和解析都是同一种编码方式

浏览器按照utf-8

程序返回的数据是bgk的编码

resp.setContentType("utf-8"); content-Type:描述了HTTP请求、响应正文的数据格式

六、表白墙(交互数据为Json)

6.1搭建项目文件

①创建maven工程文件。

②引入依赖。包括servlet、Jackson、mysql 的依赖。

③新建项目文件。webapp-WEB-INF-web.xml 。并将之前写好的MessageWall.html拷到webapp目录下。

④写代码。先写一个helloServlet的测试代码。

⑤使用SmartTomcat完成打包部署。

⑥验证程序是否正确。

6.2 约定前后端交互的接口

约定好前端发啥请求,服务器对应的返回啥响应。

6.3 编写代码

6.3.1 前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表白墙</title>
</head>
<body>
    <style>
        /* 清空浏览器默认样式 */
        * {
            margin: none;
            padding: none;
            box-sizing: border-box;
        }
        .container {
            width: 300px;
            /* 水平居中 */
            margin: 0 auto;
        }
        h3 {
            text-align: center;
            padding: 10px 0;
        }
        p {
            text-align: center;
            font-size: 15px;
            color: rgb(196, 180, 159);
        }
        .row {
            display: flex;
            width: 100%;
            font-size: 18px;
            justify-content: center;
            align-items: center;
            height: 40px;
        }
        .edit {
            margin: 2px 0;
            height: 38px;
            width: 200px;
        }
        span {
            width: calc(100% - 200px);
        }
        .submit {
            width: 300px;
            height: 35px;
            background-color: pink;
            color: azure;
            font-size: 20px;
            border-radius: 3px;
            border: 0;
        }
        .submit:active {
            background-color: green;
        }
    
    </style>
    <!-- 给外层加个容器,通过这个容器实现对齐的效果 -->
    <div class="container">
        <h3>表白墙</h3>
        <p>输入后点击提交,会将信息显示在表格中</p>  
        <div class="row">
            <span>谁:</span>
            <input type="text" class="edit" id="name1">
        </div>
        <div class="row">
            <span>对谁:</span>
            <input type="text" class="edit" id="name2">
        </div>
        <div class="row">
            <span>说什么:</span>
            <input type="text" class="edit" id="message">
        </div>
        <div class="row">
            <input type="button" value="提交" class="submit">
        </div>
        
    </div> 
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script>
        let submitButton = document.querySelector('.submit');
        submitButton.onclick = function(){
            // 先获取三个输入
            let name1 = document.querySelector('#name1');
            let name2 = document.querySelector('#name2');
            let message = document.querySelector('#message');
            // 判断输入是否合法
            if(name1 =='' || name2 == '' || message == ''){
                return;
            }
            // 创建一个div对象
            let div = document.createElement('div')
            div.innerHTML = name1.value + '对' + name2.value + '说' + message.value;
            div.style.textAlign = 'center';
            let container = document.querySelector('.container');
            // 将div对象加到dom树上
            container.appendChild(div);
            let body = {
                from: name1.value,
                to: name2.value,
                message: message.value
            }
            // 将输入发送给服务器
            $.ajax({
                method: 'post',
                url: 'message',
                contentType: 'application/json;charset=utf8',
                // JSON.stringify相当于Java objectMapper.writeValue
                data: JSON.stringify(body),
                success:function(data,status){
                    console.log(data);
                }
            });
            // 清空输入框
            name1.value = '';
            name2.value = '';
            message.value = '';
        }
        // 1.在页面加载的时候,从服务器拿到消息列表,并显示在网页上
        function load(){
            $.ajax({
                method: 'get',
                // 这里写的是相对路径
                url: "message",
                success:function(data,status){
                    // 此时的data已经被jQuery给转成一个对象数组了。转换的前提是,服务器响应的header设置content-type是application/json
                    let container = document.querySelector('.container');
                    for(let message of data){
                        // 遍历每一个元素,针对每个元素,创建div标签
                        let row = document.createElement('div');
                        row.className = 'row';
                        row.innerHTML = message.from + " 对 " + message.to + " 说 " + message.message;
                        console.log(row);
                        container.append(row);
                    }
                }
            });
        }
        load();
        // 2.当用户点击提交的时候,将当前的消息发送给服务器
    </script>
</body>
</html>

6.3.2 数据库代码

为了实现持久化存储数据,可以建立一个数据库,将数据存储在数据库中。

create database if not exists messageWall ;
use messageWall;
drop table if exists message;
create table message(
    'from' varchar(50),
    'to' varchar(50),
    'message' varchar(1024)
);

建立一个DBUtil类,封装数据库的相关操作。

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;

public class DBUtil {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/messageWall?characterEncoding=utf8&useSSL=false";
    private static final String userName = "root";
    private static final String password = "1111";
    private static DataSource dataSource = new MysqlDataSource();
    static {
        ((MysqlDataSource)dataSource).setURL(URL);
        ((MysqlDataSource)dataSource).setUser(userName);
        ((MysqlDataSource)dataSource).setPassword(password);
    }
    public static Connection getConnections() throws SQLException {
        return dataSource.getConnection();
    }
    public static void close(Connection connection, PreparedStatement statement , ResultSet resultSet){
        if(resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(statement != null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

6.3.3 Servlet代码

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


class Message{
    public String from;
    public String to;
    public String message;
}
@WebServlet("/message")
public class MessageWallServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get");
        resp.setContentType("applicatipon/json;charset=utf-8");
        ObjectMapper objectMapper = new ObjectMapper();
        // 将java代码中的对象,转成JSON字符串
        // 当前的message是一个List,得到的结果也就是一个JSON数组
        String jsonString = objectMapper.writeValueAsString(GetMessages());
        resp.getWriter().write(jsonString);
    }
    // 从数据库中读数据
    public List<Message> GetMessages(){
        System.out.println("getmessages");
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Message> messages = new ArrayList<>();
        try {
            // 1.和数据建立连接
            connection = DBUtil.getConnections();
            // 2.构造sql语句
            String sql = "select * from message";
            statement = connection.prepareStatement(sql);
            // 3.执行sql
            resultSet = statement.executeQuery();
            // 4.遍历结果集合
            while (resultSet.next()){
                Message message = new Message();
                message.from = resultSet.getString("from");
                message.to = resultSet.getString("to");
                message.message = resultSet.getString("message");
                System.out.println(message.toString());
                messages.add(message);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return messages;
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 读取请求中的JSON字符串,转成Message对象,然后往messages里面添加即可
        System.out.println("post");
        resp.setContentType("text/html;charset=utf-8");
        ObjectMapper objectMapper = new ObjectMapper();
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);
        addMessage(message);
        resp.getWriter().write("insert ok");
    }
    public void addMessage(Message message){
        System.out.println("插入数据");
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1.和数据建立连接
            connection = DBUtil.getConnections();
            // 2.构造sql语句
            String sql = "insert into message values(?,?,?)";
            statement = connection.prepareStatement(sql);
            statement.setString(1,message.from);
            statement.setString(2,message.to);
            statement.setString(3,message.message);
            statement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,null);
        }
    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘减减

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值