【Javaweb 1】带你搞懂request,respond,servlet
🌈博客主页:屠一乐的博客
📅 发文时间:2022.08.09
🎈 一定存在只有你才能做成的事
🌹 博主水平有限,如有错误,欢迎指正
欢迎各位👍收藏💎评论✉
Javaweb
什么是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
二、常见的响应状态码
状态码 | 英文描述 | 解释 |
---|---|---|
200 | OK | 客户端请求成功,即处理成功,这是我们最想看到的状态码 |
302 | Found | 指示所请求的资源已移动到由Location 响应头给定的 URL,浏览器会自动重新访问到这个页面 |
304 | Not Modified | 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
404 | Not Found | 请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
429 | Too Many Requests | 太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用 |
431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
405 | Method Not Allowed | 请求方式有误,比如应该用GET请求方式的资源,用了POST |
500 | Internal Server Error | 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
503 | Service Unavailable | 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |
511 | Network 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。响应体:
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;
}
}