注意:再提醒,在调试网页时,务必要注意浏览器有缓存记录,所以在调试的时候需要注意,减少不该有的困扰,别浪费时间~
HttpServletRequest:封装了客户端提供过来的一切数据.
- 可以获取客户端的请求头信息
- 获取客户端提交的数据
- 获取中文数据
但是在处理中文的数据过程中,有可能会出现乱码,这里根据get和post请求两种不同的情况进行讲解。
1)get请求时:
get请求过来的数据,在url地址栏上已经经过编码了,所以我们得到的是乱码;
tomcat收到了数据,getParameter默认使用ISO- 8859-1 去编码;
所以我们先让文字回到ISO-8859-1对应的字节数组,然后再按utf-8组拼字符串。
我们也可以可以在tomcat里面做配置,使get请求过来的数据永远都是UTF-8编码,在conf->server.xml 加URIEncoding="UTF-8"
<Connector connectionTimeout="20000" port="9000" protocol="Http/1.1" redirectPort="8843" URIEncoding="UTF-8" />
2)post请求时:需要在取数据之前设置指定的编码
测试参考代码如下:HServlet.java
package cw.Servlet;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HServlet
*/
public class HServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.可以获取客户端的请求头信息
Enumeration<String> headerNames=request.getHeaderNames(); //得到一个枚举集合
while(headerNames.hasMoreElements()){
String name=(String)headerNames.nextElement();
String value=request.getHeader(name);
System.out.println(name+"="+value);
}
//2.获取客户端提交的数据
//http://localhost:9000/JavaWeb_1/HServlet?name=aa&&age=18
String name2=request.getParameter("name");
String age=request.getParameter("age");
System.out.println("name="+name2); //null
System.out.println("age="+age);
//Enumeration<String> parameterNames=request.getParameterNames(); //获取所有的参数,得到一个枚举集合
Map<String,String[]> map=request.getParameterMap();
Set<String> keySet=map.keySet();
Iterator<String> iterator=keySet.iterator();
while(iterator.hasNext()){
String key=(String)iterator.next();
String va=map.get(key)[0];
System.out.println(key+":"+va);
}
//3.获取中文数据
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println(username+"..."+password);
username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username+"..."+password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求过来的数据乱码
// 需要在取数据之前设置指定的编码
request.setCharacterEncoding("UTF-8"); //这里设置的是请求体里的文字编码
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println(username+"..."+password);
}
}
HttpServletResponse:负责返回数据给客户端
- 以字符流的方式写数据
- 以字节流的方式写数据
以下是关于HttpServletResponse常用的一些方法
设置当前这个请求的处理状态码 response.setHeader(arg0, arg1);
设置一个头 response.setHeader(name, arg1);
设置响应的内容类型,以及编码 response.setContentType(arg0);
与HttpServletRequest类似,在返回数据给客户端时,也存在着中文乱码的问题,所以需要解决有可能存在的中文乱码问题。中文乱码分为两种。
第一种是以字符流的方式写数据
如果用的是字符流,这里写出去的是默认ISO-8859-1,所以我们需要设置
response.setCharacterEncoding("UTF-8"); //指定输出到客户端的时候,这些文字使用UTF-8编码
response.setHeader("Content-Type","text/html;charset=UTF-8"); //直接规定浏览器看这个数据时,就是用UTF-8
response.getWriter().write("大家好!");
第二种是以字节流的方式写数据
//直接规定浏览器看这个数据时,就是用UTF-8,且响应的数据类型是html文本
response.setContentType("text/html;charset=UTF-8");
//默认情况下getOutputStream方法使用的是UTF-8的编码//如果想指定具体编码,可以获取byte数组时指定.getBytes("UTF-8")
response.getOutputStream().write("大家好!2".getBytes());
代码实现:
HServlet.java
package cw.Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HServlet2
*/
public class HServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//以字符流的方式写数据
response.getWriter().write("hello");
response.getWriter().write("<h1>hello</h1>");
//以字节流的方式写数据
//response.getOutputStream().write("hello2....".getBytes());
//响应的数据包含中文,可能出现导致乱码
//如果用的是字符流,这里写出去的是默认ISO-8859-1,所以我们需要设置
response.setCharacterEncoding("UTF-8"); //指定输出到客户端的时候,这些文字使用UTF-8编码
response.setHeader("Content-Type","text/html;charset=UTF-8"); //直接规定浏览器看这个数据时,就是用UTF-8
response.getWriter().write("大家好!");
//如果是用的是以字节流的方式
//直接规定浏览器看这个数据时,就是用UTF-8,且响应的数据类型是html文本
response.setContentType("text/html;charset=UTF-8");
//默认情况下getOutputStream方法使用的是UTF-8的编码,如果想指定具体编码,可以获取byte数组时,指定。getBytes("UTF-8")
response.getOutputStream().write("大家好!2".getBytes());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
在使用servlet时,定义了一个login.html进行调试
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>请输入登陆信息</h2>
<!-- <form action="LoginServlet" method="get"> -->
<!-- <form action="HServlet" method="get"> -->
<form action="HServlet" method="post">
账号:<input type="text" name="username" />
密码:<input type="text" name="password" />
<input type="submit" name="登陆" />
</form>
</body>
</html>
web.xml配置文件中在新建Servlet中的自动配置情况:
好好学,慢慢来,坚持~