文章目录
1 HttpServletRequest
每当有请求进入Tomcat时,Tomcat就会把请求的HTTP协议信息解析并封装到Request对象中,然后在doGet/doPost中就可以获取请求的所有信息
想要处理来自客户端的请求,可以用请求对象来处理
1.1 请求常用方法
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符(绝对路径)
getRemoteHost() 获取客户端的IP地址
getHeader() 获取请求头
getMethod() 获取请求的方式(GET/POST)
setAttribute(key, value) 设置域数据
getAttribute(key) 获取域数据
使用示例:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
// 获取请求的资源路径
System.out.println("URI: " + request.getRequestURI());
// 获取请求的资源的统一资源定位符(绝对路径)
System.out.println("URL: " + request.getRequestURL());
// 获取发起请求的客户端的IP地址
System.out.println("Client IP: " + request.getRemoteHost());
// 获取本次请求的某个请求头
System.out.println("Request Header: " + request.getHeader("User-Agent"));
// 获取请求的方式
System.out.println("Request Type: " + request.getMethod());
}

1.2 获取请求参数
getParameter() 获取请求的参数
getParameterValues() 获取请求的参数(多个值)
使用示例:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符集为UTF-8 避免中文乱码的情况
request.setCharacterEncoding("UTF-8");
System.out.println("doPost");
System.out.println(request.getParameter("userName"));
System.out.println(request.getParameter("password"));
System.out.println(request.getParameter("male"));
String[] hobbies = request.getParameterValues("hobby");
for(String hobby : hobbies) {
System.out.println(hobby);
}
}

1.2.1 POST请求乱码的处理
注意 当客户端向服务器发起POST请求时,POST请求中的中文内容可能出现中文乱码的问题,这是因为服务器不知道请求中的信息是哪种字符集,因此在处理POST请求中的参数前,需要设置请求的字符集
// 避免POST请求中的中文出现乱码
request.setCharacterEncoding("UTF-8");
1.3 请求转发
指服务器收到请求后,从一个资源跳转到另一个资源再响应的过程
如果一个业务由两个Servlet程序负责共同完成,Servlet1负责上半部分业务A,Servlet2负责下半部分业务B,当开始处理这个业务时,这时需要Servlet1完成A后将数据交给Servlet2开始处理B,Servlet2处理完B后,返回到Servlet1,Servlet1再完成对客户端的响应

请求转发的实现:
/**
* @author 雫
* @date 2021/4/28 - 16:07
* @function 处理业务的A部分 处理完后跳转到MyServlet3
* MyServlet3处理完回到MyServlet2后 MyServlet2完成响应
*/
public class MyServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyServlet2--doGet");
String userName = request.getParameter("userName");
System.out.println("userName: " + userName);
// 将参数存储到域数据
request.setAttribute("userName", userName);
System.out.println("MyServlet2上半部分业务处理完毕,即将跳转到MyServlet3处理下半部分数据");
// 获取请求转发的对象 请求转发(目的地)必须以 / 开头 /代表http://ip:port/工程名
// 并将请求和响应作为参数一并传递
request.getRequestDispatcher("/MyServlet3").forward(request, response);
System.out.println("全部数据处理完毕,即将响应");
}
}
/**
* @author 雫
* @date 2021/4/28 - 16:08
* @function 处理业务的B部分 处理完后回到MyServlet2
*/
public class MyServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyServlet3--doGet");
// MyServlet3从域数据中取得MyServlet2存储的userName
System.out.println(request.getAttribute("userName"));
System.out.println("成功从MyServlet2跳转到了MyServlet3,MyServlet3处理完了下半部分业务");
}
}
请求转发的特点:
1,请求转发中Servlet程序共享一个HttpServletRequest对象
可以获取同样的参数和操作一份域数据
2,虽然访问了两个Servlet程序,但还是只有一次请求一次响应
3,可以使用请求转发跳转到WEB-INF目录下的文件
绕开Tomcat对WEB-INF目录下的文件的保护
4,请求转发的范围是当前工程内的资源
2 HttpServletResponse
当服务器处理完请求后,需要对客户端回传数据,做出响应,HttpServletResponse对象和HttpServletRequest对象相似,每当一个新请求进入Tomcat后,就会创建一个HttpServletResponse对象以供后续响应客户端
想要回传给客户端的数据,都可以通过响应对象来设置
2.1 响应流
响应对象通过响应流回传数据给客户端,响应流分为两种:
1,字节流 通过getOutputStream()获取
常用于回传二进制数据
2,字符流 通过getWriter()获取
常用于传递字符串
使用字符流响应客户端:
/**
* @author 雫
* @date 2021/4/28 - 17:06
* @function 字符流响应
*/
public class MyServlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyServlet4-doGet");
String userName = request.getParameter("userName");
// 同时设置服务器和客户端都使用UTF-8字符集和响应头
// 此方法要在获取流对象之前调用才有效
response.setContentType("text/html charset=UTF-8");
// 向客户端回传字符串数据
PrintWriter printWriter = response.getWriter();
printWriter.write(userName);
}
}
2.1.1 响应数据乱码的处理
注意 在回传数据时,中文可能出现乱码,这可能是两种原因,
1,响应的数据编码不对
2,浏览器解析响应数据采用了默认的编码
为了避免响应数据的中文乱码,可以使用
// 同时设置服务器和客户端都使用UTF-8字符集和响应头
// 此方法要在获取流对象之前调用才有效
response.setContentType("text/html charset=UTF-8");
2.2 请求重定向
指客户端向服务器请求资源A,但A可能已经被废弃或移到了其它目录,现在该资源称为B,或需要跳转到新页面,这时服务器会给客户端响应302并在Location响应头中告知B的地址,客户端收到后再访问资源B
如一个业务原先由程序A负责处理,但随着系统迭代,A程序逐渐被废弃,由新的程序B处理,当需要处理业务时,会先访问程序A,程序A将响应客户端,告知302状态码和B的地址,客户端收到后会重新向B发起请求

请求重定向的实现:
/**
* @author 雫
* @date 2021/4/28 - 17:58
* @function 废弃程序A 会进行请求重定向
* 先响应客户端 告知302和负责业务的新程序B的地址
*/
public class MyServlet5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// MyServlet5已经被废弃 不能处理相关业务 交给MyServlet6处理 采用请求重定向
// 请求重定向 响应客户端302并告知新地址
response.sendRedirect("http://localhost:8080/MyServlet6");
}
}
/**
* @author 雫
* @date 2021/4/28 - 17:59
* @function 负责业务的新程序B
*/
public class MyServlet6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("发生了请求重定向");
}
}
请求重定向的特点:
1,发生了两次请求和两次响应
故HttpServletRequest对象都是独立的
2,不能访问WEB-INF目录下的资源
3,可以访问工程外的资源
本文详细介绍了Servlet如何处理HTTP请求,包括HttpServletRequest的常用方法,如获取请求参数、处理POST请求乱码及请求转发。同时,讲解了HttpServletResponse的响应流、设置响应头防止乱码以及请求重定向的实现。通过对HttpServletRequest和HttpServletResponse的使用,可以有效地在服务器端与客户端间传递和响应数据。

被折叠的 条评论
为什么被折叠?



