请求行
请求头
请求体
GET方式
POST方式
注意:只有post的请求方式才有请求体
2.HTTP请求的三个组成请求行
请求头
请求体
1.请求方发:GTE和POST
2.URI 统一资源标识符
3.协议和版本号(HTTP/1.1)
请求头由多个键和值组成
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("/demo1")
public class Demo1RequestLineServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//3.输出到浏览器:请求对象的实现类:org.apache.catalina.connector.RequestFacade@4ad64f2b
//public class RequestFacade implements HttpServletRequest
//结论:请求和响应对象由Tomcat实现,并且由Tomcat创建请求和响应对象,传入Servlet()方法中
out.print("请求对象:" + request + "
");
out.print("获取请求的方式:" + request.getMethod() + "
");
out.print("获取请求的URI:" + request.getRequestURI() + "
");
out.print("获取请求的URL:" + request.getRequestURL() + "
");
//得到url问号后面的数据
out.print("获取查询字符串:" + request.getQueryString() + "
");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
6.请求的方法:与请求头有关的方法
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/demo2")
public class Demo2RequestHeaderServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("请求对象:" + request + "
");
//通过请求头的名字获取到请求头的值
String header = request.getHeader("Host");
out.print("host请求对象的值:" + header + "
");
//获取所有请求头的名字
Enumeration headerNames = request.getHeaderNames();
//遍历所有的名字
while (headerNames.hasMoreElements()) {
//获取一个请求头的名字
String s = headerNames.nextElement();
//获取一个请求头的值
String headerValue = request.getHeader(s);
out.print("请求头的名字:" + s + ",请求头的值是:" + headerValue+"
");
}
String URI = request.getRequestURI();
out.print("请求对象的URI是:" + URI + "
");
StringBuffer URL = request.getRequestURL();
out.print("请求对象URL为:" + URL + "
");
String queryString = request.getQueryString();
out.print("请求对象的值:" + queryString + "
");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//3.输出到浏览器:请求对象的实现类:org.apache.catalina.connector.RequestFacade@4ad64f2b
//public class RequestFacade implements HttpServletRequest
//结论:请求和响应对象由Tomcat实现,并且由Tomcat创建请求和响应对象,传入Servlet()方法中
out.print("请求对象:" + request + "
");
out.print("获取请求的方式:" + request.getMethod() + "
");
out.print("获取请求的URI:" + request.getRequestURI() + "
");
out.print("获取请求的URL:" + request.getRequestURL() + "
");
//得到url问号后面的数据
out.print("获取查询字符串:" + request.getQueryString() + "
");
}
}
7.请求头应用案例:判断浏览器的类型
案例:判断用户使用的是什么浏览器
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo3")
public class Demo3BrowserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//获取user-agent这个请求头的值
String header = request.getHeader("user-agent");
//判断这个值是否包含指定的字符串"Edg,OPR,Chrome,Safari,Firefox,IE"或者其他
if (header.contains("Edg")) {
out.print("您的浏览器是微软自带的");
} else if (header.contains("OPR")) {
out.print("您的浏览器是OPR");
} else if (header.contains("Chrome")) {
out.print("您的浏览器是谷歌浏览器");
} else if (header.contains("Safari")) {
out.print("您的浏览器是苹果浏览器");
} else if (header.contains("Firefox")) {
out.print("您的浏览器是火狐浏览器");
} else {
out.print("您的浏览器是IE浏览器或者其他浏览器");
}
}
}
8.请求的方法:得到客户端提交的参数值【重点】
获取请求数据
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
@WebServlet("/demo4")
public class Demo4ParameterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//获取打印流
PrintWriter out = response.getWriter();
//1.获取用户名,参数的字符串必须与表单的name相同,获取一个参数值
String name = request.getParameter("name");
out.println("用户名是:" + name + "
");
String gender = request.getParameter("gender");
out.println("性别是:" + gender + "
");
//2.通过一个参数名获取一组参数值
String[] hobbys = request.getParameterValues("hobby");
out.println("你的爱好是:" + Arrays.toString(hobbys) + "
");
//3.获取所有参数名
Enumeration parameterNames = request.getParameterNames();
//遍历所有键的名字
while (parameterNames.hasMoreElements()){
//获取一个键的名字
String s = parameterNames.nextElement();
String headervalue = request.getParameter(s);
out.println("参数名:"+s+"参数值:"+headervalue+"
");
}
//4.获取整个表单所有的参数名和值 键:参数名,值:参数值(字符串数组)
Map parameterMap = request.getParameterMap();
//遍历map
parameterMap.forEach((k,v)->out.println("键:"+k+",值:"+Arrays.toString(v)));
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
9.BeanUtils工具类的使用【重点】
BeanUtils工具类封装数据
Demo5BeanUtilsServlet.java文件
package com.itheima;
import com.itheima.entity.User;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/demo5")
public class Demo5BeanUtilsServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//设置汉字编码为utf-8
request.setCharacterEncoding("utf-8");
//获取表单所有的键和值
Map parameterMap = request.getParameterMap();
User user = new User();
//使用工具类封装数据,两个参数(目标对象(没有数据),源对象(有数据))
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//输出
out.println(user);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
User.java文件
package com.itheima.entity;
public class User {
private String name;
private String gender;
private String city;
private String hobby;
@Override
public String toString() {
return "User{" +
"name='" + name + ''' +
", gender='" + gender + ''' +
", city='" + city + ''' +
", hobby='" + hobby + ''' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public User() {
}
public User(String name, String gender, String city, String hobby) {
this.name = name;
this.gender = gender;
this.city = city;
this.hobby = hobby;
}
}
register.html文件
这是登录页面
用户注册
记得放类库
在WEB_INF的包下新建lib存储
10.请求参数值汉字乱码的问题【重点】 解决post提交中文数据乱码设置请求体汉字乱码
//设置请求体的编码
//1.1 必须放在所有获取参数方法的前面
//1.2 必须与页面编码相同
//1.3 get方法没有乱码的问题,这个方法用于post方法
request.setCharacterEncoding("utf-8");
11.请求域有关的方法【重点】
request是一个作用域对象
三个作用域
在Servlet中一共有三个作用域从小到大为:请求域,会话域,上下文域.
One.java页面
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/one")
public class OneServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//像请求域中添加键和值(向上转型)
request.setAttribute("user", "NewBoy");
//什么是转发:在服务器端进行的页面跳转
//1.获取转发器(参数:要跳转的地址)2.通过转发器跳转(请求,响应)
//用一句话简写
request.getRequestDispatcher("/two").forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
two.java页面
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/two")
public class TwoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求域的值
String user = (String) request.getAttribute("user");
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//打印到浏览器
out.println("Two请求域中的对象:"+user);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
13.页面的跳转:重定向
//重定向:在浏览器端进行页面跳转:一次请求两次跳转:无数据
//request.getContextPath()获取模块的访问地址,如:/day28
response.sendRedirect(request.getContextPath()+"/two");
//重定向:在浏览器端进行页面跳转:一次请求两次跳转:无数据
response.sendRedirect("/two");
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/one")
public class OneServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//像请求域中添加键和值(向上转型)
request.setAttribute("user", "NewBoy");
//什么是转发:在服务器端进行的页面跳转
//1.获取转发器(参数:要跳转的地址)2.通过转发器跳转(请求,响应)
//用一句话简写
//request.getRequestDispatcher("/two").forward(request,response);
//重定向:在浏览器端进行页面跳转:一次请求两次跳转:无数据
//request.getContextPath()获取模块的访问地址,如:/day28
response.sendRedirect(request.getContextPath()+"/two");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
two.java页面
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/two")
public class TwoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求域的值
String user = (String) request.getAttribute("user");
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//打印到浏览器
out.println("Two请求域中的对象:"+user);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
转发和重定向的区别
14.登录案例
分析
https://blog.csdn.net/anyi2351033836/article/details/login1.html(HTML登录页面)
登录页面
Login1Servlet文件(Servlet控制器处理数据)
package com.itheima;
import com.itheima.entity.Users;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login1")
public class Login1Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置汉字编码
response.setCharacterEncoding("utf-8");
//获取用户名和密码
String username = (String) request.getParameter("username");
String password = (String) request.getParameter("password");
//比较用户名和密码,判断是否登录成功(以后访问数据库)
if ("NewBoy".equals(username)&&"123456".equals(password)){
//给对象封装属性
Users users = new Users();
users.setUsername(username);
users.setPassworld(password);
//登录成功以后将用户的信息保存在请求域中
request.setAttribute("users",users);
//转发到SuccessServlet中显示出来
request.getRequestDispatcher("/success").forward(request,response);
}else {
//登陆失败,重定向到failure.html
response.sendRedirect(request.getContextPath()+"/failure.html");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
SuccessServlet页面(登录成功显示浏览器)
package com.itheima;
import com.itheima.entity.Users;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/success")
public class SuccessServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Users users = (Users) request.getAttribute("users");
//1.设置响应类型和编码
response.setContentType("text/html;charset=utf-8");
//2.获取打印流
PrintWriter out = response.getWriter();
//显示在页面上
out.println("欢迎您登录成功:"+users.getUsername()+"");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
failure.html文件(登录失败页面)
跳转失败
登陆失败
点击跳转重新登录
总结
能够理解HTTP协议内容
能够使用Request对象获取HTTP协议的请求内容
获取请求数据
能够处理HTTP请求参数的乱码问题
能够使用request域对象
能够使用请求和转发
什么是HTTP响应
服务器端发送给浏览器端的数据,称为响应 1.响应的组成部分 响应行(状态行) 响应头 响应空行 响应体
200:表示服务器正常的响应
302:跳转/重定向
304:使用缓存
400:表示请求参数有问题
404:请求资源没找到
405:没有重写doGET或doPOST方法
500:服务器错误
package com.itheima;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo1")
public class Demo1ResponseServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("响应对象:"+request);
//设置状态码:这个方法很少单独使用(了解)
//response.sendError(220);
//发送错误码
response.sendError(510,"你熬夜了吗?");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.响应头相关方法
4.能够使用Request对象操作HTTP响应内容
5.能够处理响应乱码
6.能够完成文件下载案例
7.能够使用ServletContext域对象


