• 【Javaweb 1】带你搞懂request,respond,servlet


    🌈博客主页:屠一乐的博客
    📅 发文时间:2022.08.09
    🎈 一定存在只有你才能做成的事
    🌹 博主水平有限,如有错误,欢迎指正
    欢迎各位👍收藏💎评论✉
    在这里插入图片描述


    什么是JavaWeb?
    Web:全球广域网,也称为万维网(Www),能够通过浏览器访问的网站
    JavaWeb:是用Java技术来解决相关web互联网领域的技术栈

    JavaWeb技术栈
    B/S架构:Browser/Server,浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器瑞。浏览器只雲要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可

    好处:易于维护升级:服务器端升级后,客户端无需任何部署就可以使用到新的版本
    静态资源:HTML、CSS、JavaScript、图片等。负责页面展现
    动态资源:Servlet、JSP等。负责逻辑处理
    ●数据库:负责存储数据
    HTTP协议:定义通信规则
    Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据

    HTTP

    概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则

    HTTP协议特点:
    1.基于TCP协议:面向连接,安全
    2.基于请求-响应模型的:一次请求对应一次响应
    3.HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
    。缺点:多次请求间不能共享数据。Java中使用会话技术(Cookie、Session)来解决这个问题
    。优点:速度快

    HTTP-请求数据格式

    请求数据分为3部分:
    1.请求行:请求数据的第一行。其中GET表示请求方式,表示请求资源路径,HTTP/1.1表示协议版本
    2.请求头:第二行开始,格式为key:value形式。
    3.请求体:POST请求的最后一部分,存放请求参数

    GET /HTTP/1.1
    Host:www.itcast.cn
    Connection:keep-alive
    Cache-Control:max-age=0 Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    常见的HTTP请求头:
    Host:表示请求的主机名
    User-Agent:浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0.
    Chrome/79,IE浏览器的标识类似Mozilla/5.0(Windows NT)like Gecko;
    Accept:表示浏览器能接收的资源类型,如text/ *,image/*或者*/*表示所有;
    Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
    Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等。

    GET请求和POST请求区别:
    1.GET请求请求参数在请求行中,没有请求体。
    POST请求请求参数在请求体中
    2.GET请求请求参数大小有限制,POST没有

    POST HTTP/1.1
    Host:www.itcast.cn
    Connection:keep-alive
    Cache-Control:max-age=0 Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
    
    username=superbaby&password=123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    HTTP-响应数据格式

    ●响应数据分为3部分:
    1.响应行:响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
    2.响应头:第二行开始,格式为key:value形式
    3.响应体:最后一部分。存放响应数据

    HTTP 1.1 200 OK
    Server:Tengine
    Content-Type:text/html
    Transfer-Encoding:chunked...
    
    • 1
    • 2
    • 3
    • 4

    一、状态码大类

    p状态码分类说明
    1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
    2xx成功——表示请求已经被成功接收,处理已完成
    3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
    4xx客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
    5xx服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等

    状态码大全:https://cloud.tencent.com/developer/chapter/13553

    二、常见的响应状态码

    状态码英文描述解释
    200OK客户端请求成功,即处理成功,这是我们最想看到的状态码
    302Found指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
    304Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
    400Bad Request客户端请求有语法错误,不能被服务器所理解
    403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
    404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
    428Precondition Required服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
    429Too Many Requests太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用
    431 Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
    405Method Not Allowed请求方式有误,比如应该用GET请求方式的资源,用了POST
    500Internal Server Error服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
    503Service Unavailable服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好
    511Network Authentication Required客户端需要进行身份验证才能获得网络访问权限

    Web服务器

    Web服务器是一个应该程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”

    Tomcat

    概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP
    ●少量JavaEE规范。
    ●JavaEE:Java Enterprise Edition,Java企业版。指ava企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDl、EJB、RMl、JSP、Servlet、.XML、JMS、Java IDL、JTS、JTA、JavaMail、.JAF
    ·Tomcat也被称为Web容器、Servlets容器。Servlet需要依赖于Tomcat才能运行
    ●官网:https://tomcat.apache.org

    Tomcat-基本使用

    bin可执行文件存放目录
    conf配置文件存放目录
    lib tomcat依赖的jar包
    temp临时文件
    webapps应用发布目录
    work工作目录

    下载:官网下载
    安装:绿色版,直接解压即可
    卸载:直接删除目录即可
    启动:双击:bin\startup.bat

    控制台中文乱码:修改conf/logging.properties
    java.util.logging.ConsoleHandler.encoding UTF-8 为GBK
    关闭:
    1.直接×掉运行窗口:强制关闭
    2.bin\shutdown.bat:正常关闭
    3.Ctrl+C:正常关闭

    Tomcat-基本使用
    ●配置:
    1.修改启动端口号:conf/server.xml

    • 1
    • 2
    • 3
    • 4

    注:HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号
    ·启动时可能出现的问题:
    1.端口号冲突:找到对应程序,将其关闭掉
    at org.apache.catalina.startup.Bootstrap.Ioad (Bootstrap.Java
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.Java
    Caused by:java.net.BindException:Address already in use:bind
    at sun.nio.ch.Net.bind0 (Native Method)
    at sun.nio.ch.Net.bind (Net.java:433)
    2.启动窗口一闪而过:检查JAVA_HOME环境变量是否正确配置

    Tomcat部署项目:
    将项目放置到webapps目录下,即部署完成
    一般JavaWeb.项目会被打成war包,然后将war包放到webapps目录下,Tomcat会自动解压缩war文件

    IDEA中创建Maven Web项目

    ·使用骨架

    骨架:项目模板
    1.选择web项目骨架,创建项目
    2.删除pom.xml中多余的坐标
    3.补齐缺失的目录结构

    不使用骨架
    1.选择web项目骨架,创建项目
    2.pom.xml中添加打包方式为war
    3.补齐缺失的目录结构:webapp

    IDEA中使用Tomcat-Tomcat Maven插件
    1.pom.xml添加Tomcat插件

    <build>
        <plugins>
        
            <plugin>
            <groupld>org.apache.tomcat.mavengroupld>
            <artifactld>tomcat7-maven-pluginartifactld>
            <version>2.2version>
                <port>80<port>
    <path>/<path>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.使用Maven Helper插件快速启动项目,选中项目,右键->Run Maven->tomcat7:run

    Servlet

    Servlet是Java提供的一门动态web资源开发技术
    Servlet是JavaEE规范之一,其实就是一个接口,将来web我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

    Servlet快速入门

    1.创建web项目,导入Servlet依赖坐标

    <dependency>
        <groupld>javax.servletgroupld>
        <artifactld>javax.servlet-apiartifactld>
        <version>3.1.0version>
        <scope>providedscope>依赖范围
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

    public class ServletDemo1 implements Servlet{
    public void service(){}}
    
    • 1
    • 2

    3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

    @WebServlet("/demo1")
    public class ServletDemo1 implements Servlet
    
    • 1
    • 2

    4.访问:启动Tomcat,浏览器输入URL访问该Servlet
    http://localhost:8080/web-demo/demo1

    Servlet执行流程

    http://localhost:8080/web-demo/demo1
    web服务器/web项目/类
    1.Servlet由谁创建?Servlet方法由谁调用?
    Servlet由web服务器创建,Servlet方法由web服务器调用。
    2.服务器怎么知道Servlet中一定有service方法?
    因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法

    Servlet生命周期

    对象的生命周期指一个对象从被创建到被销毁的整个过程

    Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
    1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

    @WebServlet(urlPatterns =“/demo”,loadOnStartup 1)
    负整数:第一次被访问时创建Servlet)对象
    0或正整数:服务器启动时创建Servlet对象
    数字越小优先级越高

    2.初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次

    /**
     * 初始化
     * 调用时机:当Servlet第一次被访问时
     * 调用次数:1次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    
    }
    
    /**
     * 提供服务
     * 调用时机:当Servlet第一次被访问时
     * 调用次数:多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
    4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收

    /**
         * 销毁方法
         * 调用时机:内存释放或者服务器关闭时,Servlet对象被销毁,调用
         * 调用次数:1
         */
        @Override
        public void destroy() {
            System.out.printf("destory");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Servlet方法介绍

    void init(ServletConfig config) 初始化方法,在Servleti被创建时执行,只执行一次
    void service(ServletRequest req,ServletResponse res)提供服务方法,每次Servlet被访问,都会调用该方法
    void destroy()销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
    ServletConfig getServletConfig()获取ServletConfig对象
    String getServletInfo()获取Servlet信息

    1.HttpServlet使用步骤
    ①继承HttpServlet
    ②重写doGet和doPost方法
    2.HttpServlet原理
    获取请求方式,并根据不同的请求方式,调用不同的doXxx方法

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String name = req.getParameter("name");
            resp.setHeader("content-type","text/html;charset=utf-8");
            resp.getWriter().write("

    "+name+"

    "
    ); String header = req.getHeader("user-agent"); System.out.println(header); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { BufferedReader br = req.getReader(); String line = br.readLine(); System.out.println(line); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Servlet urlPattern配置

    Servlet要想被访问,必须配置其访问路径(urlPattern)
    1.一个Servlet,可以配置多个urlPattern
    @Webservlet(urlPatterns {“/demo1”,“/demo2”})
    2.urlPattern配置规则
    ①精确匹配
    ②目录匹配
    ③扩展名匹配
    ④任意匹配

    Servlet urlPattern配置
    2.urlPattern配置规则:
    ①精确匹配: 配置路径:@WebServlet("/user/select") 访问路径:localhost:8080/web-demo/user/select ②目录匹配: 配置路径:@WebServlet("/user/**") localhost:8080/web-demd/user/aaa 访问路径:localhost:8080/web-demo/user/bbb ③扩展名匹配: 配置路径:@WebServlet("*.do") localhost:8080/web-demd/aaa.do 访问路径:localhost:8080/web-demo/bbb.do ④任意匹配:@Webservlet("/") 配置路径:@Webservlet("/*") 访问路径: localhost:8080/web-demd/hehe localhost:8080/web-demo/haha

    /和/**区别: 当我们的项目中的Servlet配置了“/*",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet当我们的项目中配置了“/*”,意味着匹配任意访问路径 优先级: 精确路径>目录路径>扩展名路径>/*>W

    *XML配置方式编写Servlet

    Servlet从3.0版本后开始支持使用注解配置,3.0版本前只支持XML配置文件的配置方式
    步骤:
    1.编写Servlet类
    2.在web.xml中配置该Servlet

    <servlet>
        <servlet-name>demo5servlet-name>
        <servlet-cLass>com.itheima.web.servlet.ServLetDemo5servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>demo5servlet-name>
        <url-pattern>/demo5url-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    request和response

    Request获取请求数据
    Response:设置响应数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wfaw1oQE-1660058742146)(D:\BRILIANT\Documents\图片\image-20220708163047873-16572690499201.png)]

    1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
    2.使用request对象,查阅JavaEE APl文档的HttpServletRequest接口

    Request获取请求数据

    ●请求数据分为3部分:
    1.请求行:GET/request-demo/req1?username=zhangsan HTTP/1.1
    String getMethod():获取请求方式:GET
    String getContextPath():获取虚拟目录(项目访问路径):/request-.demo
    String Buffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
    String getRequestURI():获取URI(统一资源标识符):/request-demo/req1
    String getQueryString0:获取请求参数(GET方式):username:=zhangsan&password=123
    2.请求头:User-Agent:Mozilla/5.0Chrome/91.0.4472.106
    String getHeader(String name):根据请求头名称,获取值
    3.请求体:username=superbab&password=123
    ·ServletInputStream getlnputStream():获取字节输入流
    ·BufferedReader getReader():获取字符输入流

    思考:
    GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet和doPost方法内的代码?

    ·Map = getParameterMap():获取所有参数Map集合
    ·String[] = getParameterValues(String name):根据名称获取参数值(数组)
    String getParameter(String name):根据名称获取参数值(单个值)

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Map<String, String[]> parameterMap = req.getParameterMap();
            for (String s : parameterMap.keySet()) {
                System.out.print(s + ":");
    
                String[] value = parameterMap.get(s);
                for (String v : value) {
                    System.out.print(v + " ");
                }
    
                System.out.println();
            }
            String[] hobbies = req.getParameterValues("hobby");
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    记得修改action

    使用new->Servlet模板快速创建。设置:project structure->models->dependencies勾选servletAPI

    get和post获取中文乱码问题

    post方式传输[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILRryUuk-1660058742148)(D:\BRILIANT\Documents\图片\image-20220709105925075-16573355667531.png)]

    URL编码
    1.将字符串按照编码方式转为二进制
    2.每个字节转为2个16进制数并在前边加上%

    解决方案:
    POST:设置输入流的编码
    req.setCharacterEncoding(“UTF-8”);
    通用方式(GET/POST):先编码,再解码
    new String(username.getBytes(“ISO-8859-1”),“UTF-8”);

    Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8

    请求转发

    请求转发(forward):一种在服务器内部的资源跳转方式
    实现方式:
    req.getRequestDispatcher(“资源B路径”).forward(req,resp);
    请求转发资源间共享数据:使用Request对象
    void setAttribute(String name,Object o):存储数据到request域中
    Object getAttribute(String name);根据key,获取值
    void removeAttribute(String name);根据key,删除该键值对

    请求转发特点:

    浏览器地址栏路径不发生变化
    只能转发到当前服务器的内部资源
    一次请求,可以在转发的资源间使用request共享数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxWZz8Ep-1660058742148)(D:\BRILIANT\Documents\图片\image-20220709163628377-16573557903702.png)]

    Response设置响应数据功能介绍

    响应数据分为3部分:
    1.响应行:
    HTTP/1.1 200 OK
    ·void setStatus(int sc):设置响应状态码
    2.响应头:Content-Type:text/html
    ·void setHeader(String name,String value):设置响应头键值对
    3。响应体:

    head> PrintWriter getWriter(:获取字符输出流 ServletOutputStream getOutputStream():获取字节输出流

    Response完成重定向

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKWOAFsx-1660058742149)(D:\BRILIANT\Documents\图片\image-20220709165100096-16573566620313.png)]

    重定向(Redirect):一种资源跳转方式
    实现方式:
    resp.setStatus(302);
    resp.setHeader(‘location’”,“资源B的路径");

    resp.sendRedirect(“资源B的路径”);

    重定向特点:

    浏览器地址栏路径发生变化
    可以重定向到任意位置的资源(服务器内部、外部均可)
    两次请求,不能在多个资源使用request共享数据

    路径问题
    ●明确路径谁使用?
    浏览器使用:需要加虚拟目录(项目访问路径)
    服务端使用:不需要加虚拟目录
    //动态获取虚拟目录
    String contextPath=request.getcontextPath();

    Response响应字符数据

    使用:
    1.通过Response对象获取字符输出流
    PrintWriter writer resp.getWriter();
    2.写数据
    writer.write(“aaa”);
    注意:
    该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
    中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
    resp setContentType(“text/html;charset=utf-8”);

    Response响应字节数据

    使用:
    1.通过Response对象获取字符输出流
    ServletOutputStream outputStream = resp.getOutputStream();
    2.写数据
    outputStream.write(字节数据);

    IOUtils.工具类使用
    1.导入坐标

    <dependency>
        <groupld>commons-iogroupld>
        <artifactld>commons-ioartifactld>
        <version>2.6version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.使用
    IOUtils.copy(输入流,输出流);

    用户登录

    流程说明:
    1.用户填写用户名密码,提交到LoginServlet
    2.在LoginServlet中使用MyBatisi查询数据库,验证用户名密码是否正确
    3.如果正确,响应“登录成功”,如果错误,响应“"登录失败”

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mHBVoa5r-1660058742150)(D:\BRILIANT\Documents\图片\image-20220709200156552-16573681186134.png)]

    编写静态网页

    创建用户表

    -- 创建用户表
    CREATE TABLE tb_user(
    	id int primary key auto_increment,
    	username varchar(20) unique,
    	password varchar(32)
    );
    
    -- 添加数据
    INSERT INTO tb_user(username,password) values('zhangsan','123'),('lisi','234');
    
    SELECT * FROM tb_user;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    编写user类:get,set,toString方法

    编写mapper接口

    @Select("select * from tb_user where username = #{username} and password = #{password};")
    User select(@Param("username") String username,@Param("password") String password);
    
    • 1
    • 2

    编写对应usermapper.xml

    导入mybatis和MySQL-connector包

     <dependency>
                <groupId>org.mybatisgroupId>
                <artifactId>mybatisartifactId>
                <version>3.5.10version>
            dependency>
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>8.0.29version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    编写mybatis-config.xml

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        
        <typeAliases>
            <package name="com.web.pojo"/>
        typeAliases>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/db14"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                dataSource>
            environment>
        environments>
        <mappers>
            
            <package name="com.web.mapper"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    编写LoginServlet,注意login表中action和method

    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //1、接收用户名密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //2.调用Mybatis完成查询
            //2.1获取seqSessionFactory
            String resource = "Mybatis-config.xml";
            InputStream inputstream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    
            //2.2获取sqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //2.3获取mapper
            User user = mapper.select(username, password);
            sqlSession.close();
            //2.4调用方法
            //2.5释放资源
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            //3.判断user是否为null
            if (user != null) {
                //成功
                writer.write("登录成功");
            } else {
                writer.write("失败");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    用户注册

    流程说明:
    1.用户填写用户名、密码等信息,点击注册按钮,提交到RegisterServlet
    2.在RegisterServlet中使用MyBatis保存数据
    3.保存前,需要判断用户名是否已经存在:根据用户名查询数据库

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIWSe0Cc-1660058742150)(D:\BRILIANT\Documents\图片\image-20220709225849005-16573787307075.png)]

    mapper接口

    /**
         * 根据用户名查询用户对象
         *
         * @param username
         * @return
         */
        @Select("select * from tb_user where username = #{username};")
        User selectByUsername(String username);
    
        /**
         * 增加用户
         *
         * @param user
         */
        @Insert("insert into tb_user  values (null,#{username},#{password});")
        void add(User user);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    RegisterServlet类

    @WebServlet("/reg")
    public class RegisterServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //1、接收用户名密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
    
            //对用户封装
            User user1 = new User();
            user1.setUsername(username);
            user1.setPassword(password);
    
            //2.调用Mybatis完成查询
            //2.1获取seqSessionFactory
            String resource = "Mybatis-config.xml";
            InputStream inputstream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    
            //2.2获取sqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //2.3获取mapper
            User user = mapper.selectByUsername(username);
    
            //2.4调用方法
    
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            //3.判断user是否为null
            if (user == null) {
                //用户名不存在,可以注册
                mapper.add(user1);
                //提交事务
                sqlSession.commit();
                writer.write("注册成功");
                //2.5释放资源
                sqlSession.close();
            } else {
                writer.write("用户名已存在");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    同理在register.html中action修改

    代码优化

    ·创建SqlSessionFactory代a码优化
    //2.1获收SqlSessionFactory对象
    String resource “mybatis-config.xml”;
    Inputstreaminputstream Resources.getResourceAsStream(resource);
    SqlSessionFactorysqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);
    ●问题:
    1.代码重复:工具类
    2.SqlSessionFactory工厂只创建一次,不要重复创建:静态代码块

    public class SqlSessionFactoryUtil {
    
        private static SqlSessionFactory sqlSessionFactory;
        static {
    
            try {
                String resource = "Mybatis-config.xml";
                InputStream inputstream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public static SqlSessionFactory getSqlSessionFactory() {
            return sqlSessionFactory;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

  • 相关阅读:
    报错:Error: The project seems to require yarn but it‘s not installed解决方案
    阿里云大学Apache Flink大数据学习笔记
    微服务之间调用的安全认证-jwt
    如何快速水出人生中的第一篇SCI,SCI收割器。
    Pandas常用操作命令(四)——数据切片、筛选
    移动通信目前的频段信息
    git 泄露
    Java 快速入门
    tiup cluster clean
    phantomjs插件---实现通过链接生成网页截图
  • 原文地址:https://blog.csdn.net/m0_67563237/article/details/126257483