今天学习了request和respone,这是web基础刚开始学,最难理解的是他的执行流程也是最重要的,代码是次要的可以后期整理然后直接粘贴复制就好,主要是要弄懂其中的逻辑
时间: 20225/10
首先要理解什么是request和respone,也就是请求和相应,如图所示
接下来详细学习
*Request对象代表客户端的请求,用户通过浏览器访问服务器时,HTTP请求中所有的信息都封装在这个对象中。
*Request对象是由Tomcat创建,开发者可以直接使用这个对象提供的方法获取客户端的请求信息(行 头 体)。
体系结构
ServletRequest 接口
↓
HttpServletRequest 接口
↓
org.apache.catalina.connector.RequestFacade 实现类(由tomcat提供的)
Request获取请求
请求行(了解)
- 请求行例子:
GET /day04/xxx.html HTTP/1.1 - 方法:
- String getMethod() 获取请求方式
- String getRequestURL() 获取请求完整路径(URL)
- String getRequestURI() 获取请求资源部分(URI)
- String getContextPath() 获取项目虚拟目录 [记住]
@WebServlet("/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. String getMethod() 获取请求方式
String method = request.getMethod();
System.out.println("请求的方式" + method);
// 2. String getRequestURL() 获取请求完整路径(URL)
StringBuffer url = request.getRequestURL();
System.out.println("完整请求路径:" + url);
// 3. String getRequestURI() 获取请求资源部分(URI)
String uri = request.getRequestURI();
System.out.println("请求资源" + uri);
// 4. String getContextPath() 获取项目(模块)虚拟目录 [记住]
String contextPath = request.getContextPath();
System.out.println("虚拟目录" + contextPath);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
请求头(了解)
-
请求头例子:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/78.0.3904.108 -
重要方法:
String getHeader(String name) 以String的形式返回指定请求头的值
使用一个案例说明请求头的使用: 判断发送请求的浏览器的类型
@WebServlet("/Demo02Servlet")
public class Demo02Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取User-agent的请求头,看看浏览器是什么浏览器
//String getHeader(String name):获取请求头
String header = request.getHeader("user-agent");
//Chrome Firefox
if(header.contains("Chrome")){
System.out.println("我知道你用的是谷歌浏览器!");
}else if(header.contains("Firefox")){
System.out.println("我知道你用的是火狐浏览器");
}else{
System.out.println("你用的是杂牌浏览器...");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
请求参数(重点)
这里的请求参数指的是浏览器访问时发来的请求参数
比如登录时候的用户名密码等…
-
请求参数的位置:
get请求: URL上
post请求: 请求体中
不管是哪个方式传来的请求参数,我们获取的写法是一样的 -
重要方法:
- String getParameter(String name) 根据参数名获得参数值(单个)
- String[] getParameterValues(String name) 根据参数名获得参数值(数组)
- Map
getParameterMap() 获得所有的参数,封装到Map集合
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="/day04/Demo03Servlet" method="get">
<table >
<tr>
<td>用户名td>
<td>
<input type="text" name="username">
td>
tr>
<tr>
<td>密码td>
<td>
<input type="password" name="password">
td>
tr>
<tr>
<td>性别td>
<td>
<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女
td>
tr>
<tr>
<td>爱好td>
<td>
<input type="checkbox" name="hobby" value="唱跳"> 唱跳
<input type="checkbox" name="hobby" value="rap"> rap
<input type="checkbox" name="hobby" value="篮球"> 篮球
td>
tr>
<tr>
<td>td>
<td>
<input type="submit" value="注册">
td>
tr>
table>
form>
body>
html>
@WebServlet("/Demo03Servlet")
public class Demo03Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//?username=admin&password=123456&sex=男&hobby=唱跳
// 1. getParameter(String name)根据参数名获得参数值(单个)
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名是" + username);
System.out.println("密码是" + password);
System.out.println("-----------------------------------");
// 2. getParameterValues(String name)根据参数名获得参数值(多个)
String[] hobbies = request.getParameterValues("hobby");
System.out.println("爱好是");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("---------------------------------------------");
// 3. getParameterMap() 获得所有的参数,封装到Map集合
Map<String, String[]> map = request.getParameterMap();
Set<String> set = map.keySet();
for (String s : set) {
//map根据键获取值
String[] strs = map.get(s);
System.out.println(s + "=" + Arrays.toString(strs));
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
将请求参数封装成实体
-
BeanUtils是apache提供的一个工具包
-
它提供了一个方法:populate,使用这个方法可以请求的将Map转成一个实体对象
BeanUtils.populate(Object obj,Map map); -
需要注意的是,map中的key要和实体类中的属性保持一致
请求参数中文乱码处理
-
在请求参数传递过程中,会出现中文乱码的问题
-
get请求:
tomcat8及以上的版本已经解决 (UTF-8) -
post请求:
需要手动解决
乱码原因:
浏览器编码(UTF-8) ------ 服务器解码(ISO-8859-1)
解决方案:
修改服务器的解码方式为UTF-8即可
代码:
request.setCharacterEncoding(“UTF-8”);
注意要在接受参数之前设置编码
请求转发(重点)
请求转发: 一次
请求在服务器项目内部
资源之间跳转方式
req.getRequestDispatcher(“/xxxServlet”).forward(req, resp); //请求转发
请求转发的特点
- 地址栏不发生改变
- 只能转发到服务器当前模块的内部资源
- 转发是一次请求
- 转发时不需要指定虚拟目录
共享数据(重点)
- Request是一个域对象,可以存储数据,用于在一次请求之间进行数据共享
- 常见方法:
void setAttribute(String name, Object value) 向request域放入数据
Object getAttribute(String name) 根据name从向request域获取数据
void removeAttribute(String name) 根据name从request域删除数据
@WebServlet("/Demo05Servlet")
public class Demo05Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//正确的用户名是 "admin"
String u = "admin";
//正确的密码是 "123456"
String p = "123456";
//把数据通过域对象传递
//给域对象添加数据
request.setAttribute("aaa",u);
request.setAttribute("bbb",p);
System.out.println("Demo05被调用了");
//如果有人请求我,我就把请求转发给Demo06
request.getRequestDispatcher("/Demo06Servlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
--------------------------------------------------------
@WebServlet("/Demo06Servlet")
public class Demo06Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo06被访问了");
//获取域对象中的数据
String u = (String)request.getAttribute("aaa");
String p = (String)request.getAttribute("bbb");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
浏览器发请求的途径
资源包含静态资源和动态资源
目前只有form表单的method填写post时是属于post提交
其他的请求默认都属于get提交
比如:
图片
超链接
访问css文件
访问js文件
等等只要访问资源就都是请求
返回响应(了解)
-
响应行
响应行格式例子:
HTTP/1.1 200 OK常见状态码:
200 成功
302 重定向
304 访问缓存
404 找不到资源
500 服务器内异常设置响应行:
void setStatus(int sc) -
响应头
响应头格式例子:
Content-Type:text/html;charset=utf-8
设置响应头:
void setHeader(String name, String value) -
响应体
响应体是服务器要发给浏览器的数据
通过response获取输出流,使用输出流输出
字符流:getWriter()
字节流:getOutputStream()注意:在同一个servlet中,不能既使用字节流又使用字符流
响应重定向(重点)
响应重定向: 服务器通知浏览器去访问另一个地址,即让再发出另一个请求
response.sendRedirect(目标资源位置)
//request.getRequestDispatcher("/xxxServlet").forward(req, resp); //请求转发
响应重定向的特点
- 地址栏发生改变
- 重定向是可以到当前模块之外的资源,也可以是网络资源
- 重定向是两次请求
- 重定向需要指定虚拟目录
@WebServlet("/Demo08Servlet")
public class Demo08Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo08被访问了");
//request域对象
request.setAttribute("aaa","123");
//重定向
response.sendRedirect("/day04/Demo09Servlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/Demo09Servlet")
public class Demo09Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo09被访问了");
//获取数据
Object aaa = request.getAttribute("aaa");
System.out.println(aaa); //null
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
向浏览器输出字符
- 使用字符流输出内容到浏览器
PrintWriter writer = response.getWriter();
writer.write(“字符串”);
解决中文乱码问题
统一设置服务器和浏览器编码格式
response.setContentType("text/html;charset=utf-8");
//request.setCharacterEncoding("UTF-8");
向浏览器输出字节
我们通过向浏览器输出验证码图片的功能演示字节流的返回
即: 在服务器端生成验证码图片,返回到浏览器; 浏览器点击验证码可以切换
总结get请求和post请求的区别
1.get请求参数在地址栏,post请求参数在请求体
2.get请求不太安全,post请求相对安全
3.get请求参数长度有限制,post请求参数长度没限制
转发和重定向的区别
1.转发是一次请求,重定向包含两次请求
2.转发地址栏不变,重定向地址栏会变化
3.转发只能转发到当前项目的资源,重定向可以重定向到任何资源也可以是网络资源
我们这里指的项目就是idea中的模块
idea中叫模块,tomcat中就是叫项目
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)