一,什么是请求和响应?
request:请求对象封装了请求信息,通过这个对象获取请求信息,是ServletRequest的子接口。
response:响应对象封装了响应信息,通过这个对象将Servlet的的响应信息响应给浏览器,是ServletResponse的的子接口。
二,请求和响应分别有哪些方法?
response:( 前两方法常用)
- getParameter(String)方法根据表单名称获取输入的值
- getParameterValues(String)方法根据名字获取一组相关的数据,返回String []
- getParameterNames()方法获取所有参数的名字,返回类型为Enumeration(枚举)
- getParameterMap()方法获取所有数据,返回Map类型
- 例:
@WebServlet("/oneServlet") public class OneServlet extends HttpServlet { private static final long serialVersionUID = 1L; public OneServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * request:封装了http请求信息,就是通过这个对象获取请求信息,是ServletRequest的子接口,(常用的两个方法) * response:封装了响应信息 * 这两个接口在每次访问时都会被创建,由Servlet容器创建,并且在服务器调用service方法时传入 */ //4.getWriter()方法,把结果响应给浏览器 PrintWriter writer = response.getWriter(); //1.getParameter(String) 根据表单name获取输入的值 String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8"); //输出到页面 writer.write("<h1>"+username+"</h1>"); System.out.println("姓名:"+username); //2.getParameterValues(String)根据名字获取一组相关的数据,返回String[] String[] hobby = request.getParameterValues("hobby"); System.out.print("爱好:"); for(String h : hobby){ System.out.print(h+" "); } //获取性别 String sex = request.getParameter("sex"); System.out.println("\n性别:"+sex); //3.getParameterNames ()方法 获取所有参数的名字,返回类型为Enumeration Enumeration<String> names = request.getParameterNames(); System.out.print("每个参数的名字为:"); while (names.hasMoreElements()) { String name = names.nextElement(); System.out.print(name+" "); } System.out.println(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="oneServlet" method="post"> 姓名:<input type="text" name="username" id="username"> <br> <input type="checkbox" name="hobby" value="read"/>读书 <input type="checkbox" name="hobby" value="run"/>跑步 <input type="checkbox" name="hobby" value="football"/>踢足球 <br> 性别:<input type="radio" name="sex" value="nan"/>男 <input type="radio" name="sex" value="nv"/>女 <br> <input type="submit" value="提交"/> </form> </body> </html>
页面结果:控制台结果:
response:( 两个方法互斥,只能使用一种)
- getWriter()方法用于输出html信息,文本信息。
- getOutputSteam()用于下载文件,如* .avi等。
- 例
@WebServlet("/twoServlet") public class TwoServlet extends HttpServlet { private static final long serialVersionUID = 1L; public TwoServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取字符输出流对象 PrintWriter out = response.getWriter(); //获取姓名 String username = request.getParameter("username"); //打印 out.write("姓名:"+username); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="twoServlet" method="post"> 姓名:<input type="text" name="username" id="username"> <br> <input type="submit" value="提交"/> </form> </body> </html>
页面结果:打印结果:
三,为什么会出现请求或响应乱码?
如图,用户通过浏览器向Servlet发出请求与Servlet向浏览器做出响应都要经过Tomcat服务器,而Tomcat服务器的编码格式为ISO-8859-1,而页面与Servlet是utf-8,页面和Servlet的编码与Tomcat服务器的编码不同,所以会产生乱码。
四,如何处理请求乱码与响应乱码?
第一种方法:可以处理请求乱码与响应乱码
PrintWriter out = response.getWriter();
//获取姓名
String username = request.getParameter("username");
//第一种:可以处理get和post请求
byte[] byte1 = username.getBytes("iso-8859-1");//把获取的name值(iso-8859-1)转成字节码
String username1 = new String(byte1, "utf-8");
System.out.println(username1);
out.write("姓名:"+username);
先将值转换成字节码,而字节码可以进行编码转换,从而避免乱码
第二种方法:
针对post请求,直接使用 HttpServletRequest 的 setCharacterEncoding("编码") 方法进行转换
request.setCharacterEncoding("utf-8");
针对get请求,且Tomcat版本为8.0以下 :可以修改Tomcat的server.xml文件,在connector节点添加useBodyEncodingForURI="true"。(Tomcat8.0及以上已经默认添加)