Servlet之RequestReponse 学习笔记
创始人
2024-01-21 12:29:16

1 Request

1.1 Request继承关系

ServletRequest     Java提供的请求对象根接口
HttpServletRequest Java提供的对Http协议封装的请求对象接口
RequestFacade	   Tomcat定义的实现类
@WebServlet("/demo2")
public class Servlet2Demo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet req = " + req);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");}
}

请求http://localhost:8080/tomcat-demo/demo2后,输出日志

doGet req = org.apache.catalina.connector.RequestFacade@1184683

所以继承关系为

RequestFacade extends HttpServletRequest extends ServletRequest

1.2 Request请求数据

1.2.1 获取请求行数据

@WebServlet("/demo2")
public class Servlet2Demo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();System.out.println("method = " + method);String path = req.getContextPath();System.out.println("path = " + path);StringBuffer url = req.getRequestURL();System.out.println("url = " + url);String uri = req.getRequestURI();System.out.println("uri = " + uri);String queryString = req.getQueryString();System.out.println("queryString = " + queryString);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");}
}

请求地址: http://localhost:8080/tomcat-demo/demo2?username=zhangsan&pwd=123
输出结果

method = GET
path = /tomcat-demo
url = http://localhost:8080/tomcat-demo/demo2
uri = /tomcat-demo/demo2
queryString = username=zhangsan&pwd=123

1.2.2 获取请求头数据

代码示例

String agent = req.getHeader("user-agent");
System.out.println("agent = " + agent);

输出结果

agent = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36

1.2.3 获取请求体数据

1 在webApp包下创建req.html



Title

2 在Servlet#doPost()方法中获取数据

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader bufferedReader = req.getReader();String line = bufferedReader.readLine();System.out.println(line);}}

3 启动服务,通过浏览器请求

http://localhost:8080/tomcat-demo/req.html

4 在html页面中输入内容后提交后,可看到日志输出

username=zhang&password=1123

1.2.4 获取请求参数的通用方式

1 doGet()和doPost()方法获取到的参数相同时

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String result = req.getQueryString();System.out.println(result);//和doPost()方法的代码相同}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader bufferedReader = req.getReader();String line = bufferedReader.readLine();System.out.println(line);//和doGet()方法中的代码相同}}

2 处理上述问题方式1
直接在doPost()方法中调用doGet()方法

 @WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String params = "";String method = req.getMethod();if ("GET".equals(method)) {params = req.getQueryString();} else if("POST".equals(method)) {BufferedReader reader = req.getReader();params = reader.readLine();}System.out.println(params);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}

3 方式二
html代码



Title

跑步 骑车

Servlet代码

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获得所有参数Map map = req.getParameterMap();for (String key : map.keySet()) {System.out.println("key ---> "  + key);String [] values = map.get(key);for (String value : values) {System.out.println("value ---> " + value);}System.out.println();}// 获得单个参数String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("单个参数值 username = " + username + ", password = " + password);//数组值String[] hobbies = req.getParameterValues("hobby");for (String hobby: hobbies) {System.out.println(hobby);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

访问http://localhost:8080/tomcat-demo/req.html 后
日志输出

key ---> username
value ---> lisikey ---> password
value ---> 432key ---> hobby
value ---> 1
value ---> 2单个参数值 username = lisi, password = 432
1
2

1.3 乱码问题

//=================乱码问题//post方式设置解码格式
//        req.setCharacterEncoding("UTF-8");//get/post设置解码格式username = new String(username.getBytes("ISO-8859-1"), "UTF-8");System.out.println("username = " + username);

日志输出

单个参数值 username = å¼ ä¸‰, password = 321
1
2
username = 张三

1.3 请求转发

@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("req3 doGet ---> ");req.setAttribute("key_req", "value from req3");//转发req.getRequestDispatcher("/req4").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("req4 doGet ---> value = " + req.getAttribute("key_req"));}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

访问http://localhost:8080/tomcat-demo/req3后
日志输出

req3 doGet ---> 
req4 doGet ---> value = value from req3

2 Response

2.1 Response设置响应数据

1 设置响应行

resp.setStatus(200);

2 设置响应头

resp.setHeader("Content-type", "text/json")

3 设置响应体

getWritter();
getOutPutStream();

2.2 Response请求重定向

定义两个Servlet

@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(302);resp.setHeader("location", "/tomcat-demo/resp2");System.out.println("Resp1 doGet() ");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(200);System.out.println("Resp2 doGet() ");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

请求地址
ocalhost:8080/tomcat-demo/resp1
日志打印

Resp1 doGet() 
Resp2 doGet() 

在这里插入图片描述

2.3 路径问题

重定向时

resp.setHeader("location", "/tomcat-demo/resp2");

转发时

req.getRequestDispatcher("/req4").forward(req, resp);

问题: 为什么转发是不需要加路径?
转发是相对于相对于服务端,重定向时相对于浏览器。

2.4 Response响应字符数据

@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html, charset=utf-8");PrintWriter writer = resp.getWriter();writer.write("hello");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

在这里插入图片描述

2.5 Response响应字节数据

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//响应字节数据FileInputStream stream = new FileInputStream("/Users/yl/Desktop/image.png");ServletOutputStream os = resp.getOutputStream();byte[] buff = new byte[1024];int len = 0;while ((len = stream.read(buff)) != -1) {os.write(buff, 0, len);}stream.close();
}

在这里插入图片描述
使用工具类简化形式
添加依赖

 commons-io commons-io2.6
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//响应字节数据FileInputStream stream = new FileInputStream("/Users/yl/Desktop/image.png");ServletOutputStream os = resp.getOutputStream();//简化方式IOUtils.copy(stream, os);stream.close();}

3 示例

3.1 登录示例

3.1.1 登录页面


login

LOGIN IN

Username:

Password:

3.1.2 添加依赖

在pom中添加mysql和mybatis依赖

mysqlmysql-connector-java5.1.46
org.mybatismybatis3.5.5 

3.1.3 mybatis-config.xml配置

在resources目录下添加mybatis-config.xml配置
文件内容




3.1.4 创建servlet实现类

@WebServlet(urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {private String TAG = getClass().getSimpleName();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(TAG + ": doGet() ---> ");String username = req.getParameter("username");String password = req.getParameter("password");String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.select(username, password);sqlSession.close();resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();if (user != null) {writer.write("登录成功");} else {writer.write("登录失败");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(TAG + ": doPost() ---> ");this.doGet(req, resp);}
}

3.1.5 添加mybatis查询语句

public interface UserMapper {@Select("select * from tb_user where username = #{username} and password= #{password}")User select(@Param("username") String username, @Param("password") String password);
}

3.1.6 mysql添加测试数据

//tb_user表
mysql> desc tb_user;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | YES  |     | NULL    |                |
| password | varchar(20) | YES  |     | NULL    |                |
| gender   | char(1)     | YES  |     | NULL    |                |
| addr     | varchar(30) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+//添加测试数据
mysql> insert into tb_user(username, password) values('zhangsan', '123'), ('lisi', '125');
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

3.1.5 测试请求

请求地址: http://localhost:8080/tomcat-demo/login.html
当username与pwd输入正确的用户名和密码时,提示登录成功

3.2 注册示例

3.2.1 注册页面



欢迎注册


欢迎注册

已有帐号? 登录
用户名
用户名不太受欢迎
密码
密码格式有误

3.2.2 注册Servlet

@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet extends HttpServlet {private String TAG = getClass().getSimpleName();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(TAG + ": doGet() ---> ");//请求数据String username = req.getParameter("username");String password = req.getParameter("password");username = new String(username.getBytes("ISO-8859-1"), "UTF-8");User userRegister = new User();userRegister.setUsername(username);userRegister.setPassword(password);//创建UserMapperString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//查询本地user是否存在User user = userMapper.selectByUsername(username);resp.setContentType("text/html;charset=utf-8");if (user == null) {userMapper.add(userRegister);sqlSession.commit();sqlSession.close();resp.getWriter().write("注册成功!");} else {resp.getWriter().write("用户名已存在!");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(TAG + ": doPost() ---> ");this.doGet(req, resp);}
}

3.2.3 sql语句

public interface UserMapper {@Select("select * from tb_user where username = #{username} and password= #{password}")User select(@Param("username") String username, @Param("password") String password);@Insert("insert into tb_user values(null, #{username}, #{password}, null, null)")void add(User user);@Select("select * from tb_user where username = #{username}")User selectByUsername(String username);
}

3.2.4 测试请求

请求http://localhost:8080/tomcat-demo/register.html地址后
输入用户名和密码,当musql中不存在此用户名时,即可注册成功

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
1和0什么意思网络用语 0和1... 最近,有网友给大家出了份考卷,卷面是几位“00后”的QQ对 话:dbq、xswl、nss、nbcs、...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
七大洲八大洋 七大洲简易图三角... 一、北美洲(中北美和加勒比海)北美洲面积约2471万平方公里,居世界第三。人口约5.79亿(2016...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...