Request
在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象
1.get和post的区别
- get请求
- get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
- get方式明文传递,数据量小,不安全
- 效率高,浏览器默认的请求方式就是get
- 对应的Servlet方法就是doGet
- post请求
- post方法是把提交的数据放在HTTP包的Body中
- 密文传递数据,数据量大,安全
- 效率相对没有GET高
- 对应的Servlet方法是foPost
2.request对象的主要方法
- String getParameter(String name) : 根据表单组件名称获取提交的数据
- void setCharacterEncoding(String charset) : 指定每个请求的编码
3.Request应用
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/ServletDemo_war_exploded/rs" method="get">
用户名:<input type="text" name = "username">
<br>
密码:<input type="password" name = "password">
<input type="submit" value="注册">
</form>
</body>
</html>
Servlet
package cn.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.IOException;
@WebServlet("/rs")
public class registerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取提交的数据
String name = req.getParameter("username");
String pwd = req.getParameter("password");
System.out.println("提交的数据:"+name+"\t"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.get乱码问题
产生乱码是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收
在Tomcat7及以下版本,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此产生中文乱码的
解决方法:在接收数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
Tomcat8的版本中get不会出现乱码问题,因为服务器对url的编码格式可以进行自动转换
4.1 解决方案
package cn.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.IOException;
@WebServlet("/rs")
public class registerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取提交的数据
String name = req.getParameter("username");
// 重新编码,解决乱码问题
name = new String(name.getBytes("ISO_8859_1"),"UTF-8");
String pwd = req.getParameter("password");
System.out.println("提交的数据:"+name+"\t"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.Post乱码问题
由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收
解决方案: 使用从ServletRequest接口继承而来的setCharacterEncoding(charset)方法进行统一的编码设置
5.1 解决方案
package cn.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.IOException;
@WebServlet("/rs")
public class registerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 对request请求对象设置统一的编码
req.setCharacterEncoding("utf-8");
// 获取提交的数据
String name = req.getParameter("username");
String pwd = req.getParameter("password");
System.out.println("提交的数据:"+name+"\t"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注: 两种中文乱码问题都可以通过setCharacterEncoding(charset) 设置服务端解析数据的编码格式来解决
Response
response对象用于响应客户端请求并向客户端输出信息
1.response对象的主要方法
- setHeader(name,value) : 设置响应信息头
- setContentType(String) : 设置响应文件类型,响应式的编码格式
- setCharacterEncoding(String) : 设置服务端响应内容的编码格式
- getWrite() : 获取字符输出流
2.Response应用
HTML部分与Request一致
Servlet
package cn.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.IOException;
import java.io.PrintWriter;
@WebServlet("/rs")
public class registerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 对request请求对象设置统一的编码
req.setCharacterEncoding("utf-8");
// 获取提交的数据
String name = req.getParameter("username");
String pwd = req.getParameter("password");
// 获取response对象的字符输出流
PrintWriter out = resp.getWriter();
// 向网页输出 "注册成功!"
out.println("注册成功!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
中文会出现乱码问题
3.解决输出中文乱码
- 设置服务器端响应的编码格式
- 设置客户端响应内容的头内容的文件类型及编码格式
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 对request请求对象设置统一的编码
req.setCharacterEncoding("utf-8");
// 获取提交的数据
String name = req.getParameter("username");
String pwd = req.getParameter("password");
resp.setCharacterEncoding("utf-8"); // 设置服务端的响应的编码格式
resp.setHeader("Content-Type","text/html;charset=utf-8"); // 设置客户端的头内容文件类型及编码格式
// 获取response对象的字符输出流
PrintWriter out = resp.getWriter();
// 向网页输出 "注册成功!"
out.println("注册成功!");
}
同时设置服务端的编码格式和客户端响应的文化类型及响应时的编码格式(推荐使用)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 对request请求对象设置统一的编码
req.setCharacterEncoding("utf-8");
// 获取提交的数据
String name = req.getParameter("username");
String pwd = req.getParameter("password");
resp.setContentType("text/html;charset=utf-8");
// 获取response对象的字符输出流
PrintWriter out = resp.getWriter();
// 向网页输出 "注册成功!"
out.println("注册成功!");
};