一.介绍
在 Web 开发中,HttpServletRequest
和 HttpServletResponse
是两个非常重要的类,它们分别用于处理客户端的请求和服务器的响应。以下是它们的详细说明和使用方法:
1. HttpServletRequest
HttpServletRequest
是一个接口,用于封装客户端的请求信息。它提供了多种方法来获取请求的详细信息,例如请求头、请求体、参数等。
2. HttpServletResponse
HttpServletResponse
是一个接口,用于封装服务器的响应信息。它提供了多种方法来设置响应的内容、状态码、响应头等。


java
package com.itheima.web.request;
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.BufferedReader;
import java.io.IOException;
/**
* request 获取请求数据
*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String getMethod():获取请求方式: GET
String method = req.getMethod();
System.out.println(method);//GET
// String getContextPath():获取虚拟目录(项目访问路径):/request-demo
String contextPath = req.getContextPath();
System.out.println(contextPath);
// StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
StringBuffer url = req.getRequestURL();
System.out.println(url.toString());
// String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
String uri = req.getRequestURI();
System.out.println(uri);
// String getQueryString():获取请求参数(GET方式): username=zhangsan
String queryString = req.getQueryString();
System.out.println(queryString);
//------------
// 获取请求头:user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post 请求体:请求参数
//1. 获取字符输入流
BufferedReader br = req.getReader();
//2. 读取数据
String line = br.readLine();
System.out.println(line);
}
}





java
package com.itheima;
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.PrintWriter;
/**
* 响应字符数据:设置字符数据的响应体
*/
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
//content-type
//response.setHeader("content-type","text/html");
writer.write("你好吗");
writer.write("<h1>aaa</h1>");
//细节:流不需要关闭
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
展示图片
java
package com.itheima;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 响应字符数据:设置字符数据的响应体
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.读取文件
FileInputStream fis = new FileInputStream("C:\\Users\\zhaoming\\Downloads\\archive1\\ac6\\train\\images\\032.png");
//2.获取字符输出流
ServletOutputStream os = response.getOutputStream();
//3.完成输出
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1){
os.write(bytes,0,len);
//全自动:
IOUtils.copy(fis,os);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
二.案例
用户登录



流程
1. 前端发送请求
用户在网页的登录表单中输入用户名和密码,然后点击"登录"按钮。这个动作会触发前端代码(通常是 JavaScript 或 HTML 表单)向服务器发送一个请求。请求中包含了用户输入的用户名和密码。
2. 后端接收请求
服务器端的 LoginServlet
接收到前端发送的请求。LoginServlet
是一个 Java Web 应用中的 Servlet,专门用来处理登录相关的逻辑。
3. 提取用户名和密码
LoginServlet
从请求中提取用户输入的用户名和密码。这是通过调用 request.getParameter("username")
和 request.getParameter("password")
来实现的。这两个方法会从请求中获取表单字段对应的值。
4. 调用 MyBatis 查询
接下来,LoginServlet
要通过 MyBatis 来查询数据库,检查用户输入的用户名和密码是否正确。
4.1 加载 MyBatis 配置
首先,需要加载 MyBatis 的配置文件(通常是 mybatis-config.xml
)。这个文件包含了数据库连接信息、事务管理方式、环境配置等内容。通过加载这个文件,可以创建一个 SqlSessionFactory
对象,它是用来生成 SqlSession
的工厂。
4.2 创建 SqlSession
SqlSessionFactory
用来创建 SqlSession
对象。SqlSession
是 MyBatis 的核心对象,它提供了执行 SQL 命令、获取映射器和管理事务的方法。你可以把它理解为一个数据库会话,通过它可以和数据库进行交互。
4.3 获取 Mapper 接口
SqlSession
提供了一个方法 getMapper()
,通过它可以获取到一个 Mapper 接口的实例。Mapper 接口是 MyBatis 中用来定义数据库操作方法的接口,比如 UserMapper
,它里面定义了用户相关的数据库操作,比如登录时的查询操作。
4.4 执行查询操作
通过 Mapper 接口调用查询方法,比如 userMapper.select(username, password)
。这个方法会根据传入的用户名和密码去数据库中查询用户信息。如果用户名和密码匹配,就会返回一个用户对象;如果没有匹配的记录,就会返回 null
。
5. 判断查询结果
查询完成后,LoginServlet
会检查查询结果:
-
如果返回的用户对象不为
null
,说明用户名和密码正确,登录成功。 -
如果返回的用户对象为
null
,说明用户名和密码不匹配,登录失败。
6. 返回响应
LoginServlet
根据查询结果向前端返回响应。如果登录成功,可以返回一个"登录成功"的消息;如果登录失败,返回一个"登录失败"的消息。这个响应可以是一个简单的字符串,也可以是一个 JSON 对象,具体取决于前端的实现。
7. 释放资源
最后,LoginServlet
会关闭 SqlSession
,释放数据库连接等资源。这是很重要的一步,因为如果不释放资源,可能会导致数据库连接耗尽等问题。
总结
整个登录流程可以概括为:
-
前端发送包含用户名和密码的请求。
-
后端的
LoginServlet
接收请求并提取用户名和密码。 -
通过 MyBatis 查询数据库,检查用户名和密码是否匹配。
-
根据查询结果判断登录是否成功,并返回相应的响应。
-
释放数据库资源。
这个流程确保了用户输入的信息能够被正确处理,并且能够安全地与数据库交互。
mybatis-config
java
<?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.itheima.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://localhost:3306/db01?useSSL=false&useServerPrepStmts=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描mapper-->
<package name="com.itheima.Mapper"/>
</mappers>
</configuration>
mapper xml
java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.Mapper.UserMapper">
</mapper>
Usermapper
java
package com.itheima.Mapper;
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
/**
* 根据与用户名密码查询对象
* @param username
* @param password
* @return
*/
@Select("select * from tb_user where username=#{username} and password=#{password}")
User select(@Param("username") String username, @Param("password")String password);
}
logservlet
java
package com.itheima.web;
import com.itheima.Mapper.UserMapper;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
@WebServlet("/loginservlet")
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获取sqlsessionfactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.2获取sqlseesion对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3获取mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User user = userMapper.select(username, password);
//2.5释放资源
sqlSession.close();
//字符输出流
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);
}
}
用户注册

registerservlet.java
java
package com.itheima.web;
import com.itheima.Mapper.UserMapper;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.InputStream;
@WebServlet("/registerservlet")
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");
//2.封装对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
//2.1获取sqlsessionfactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.2获取sqlseesion对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3获取mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User u = userMapper.selectByUsername(username);
//是否为null
if(u == null){
//不存在,可添加
userMapper.add(user);
//提交
sqlSession.commit();
//释放资源
sqlSession.close();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("good submit");
}
else{
//存在,不可添加
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("用户名已存在");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
usermapper.java
java
/**
* 根据与用户名查询对象
* @param username
* @return
*/
@Select("select * from tb_user where username = #{username}")
User selectByUsername(@Param("username") String username);
/**
* 添加
*/
@Insert("insert into tb_user values(null,#{username},#{password})")
void add(User user);
测试运行结果良好。

