【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
...

常见的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

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...

一、状态码大类

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

<Connector
port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/

注: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>
    <!--Tomcat插件-->
        <plugin>
        <groupld>org.apache.tomcat.maven</groupld>
        <artifactld>tomcat7-maven-plugin</artifactld>
        <version>2.2</version>
            <port>80<port><!--访问端口号-->
<path>/<path><!--项目访问路径-->
        </plugin>
    </plugins>
</build>

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.servlet</groupld>
    <artifactld>javax.servlet-api</artifactld>
    <version>3.1.0</version>
    <scope>provided</scope>依赖范围
</dependency>

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

public class ServletDemo1 implements Servlet{
public void service(){}}

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

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

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");
}

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

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

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("<h1>"+name+"</h1>");
        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);
    }

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>demo5</servlet-name>
    <servlet-cLass>com.itheima.web.servlet.ServLetDemo5</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>demo5</servlet-name>
    <url-pattern>/demo5</url-pattern>
</servlet-mapping>

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<String,String[]> = 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);
    }

记得修改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-io</groupld>
    <artifactld>commons-io</artifactld>
    <version>2.6</version>
</dependency>

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;

编写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);

编写对应usermapper.xml

导入mybatis和MySQL-connector包

 <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

编写mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!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>
        <!--扫描mapper-->
        <package name="com.web.mapper"/>
    </mappers>
</configuration>

编写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.用户填写用户名、密码等信息,点击注册按钮,提交到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);

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);
    }

同理在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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值