package servlet; import java.io.IOException; import java.io.PrintWriter; import java.text.MessageFormat; import java.util.Enumeration; import java.util.Map; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletResearch extends HttpServlet{ private static final long serialVersionUID = 1409758076949342597L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { try { //1、解决接收数据中文乱码问题 //POST请求解决中文乱码 request.setCharacterEncoding("UTF-8"); //客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码 //GET请求解决中文乱码 //对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白), //默认的还是使用ISO8859-1这个字符编码来接收数据, //客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据, //服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1 //字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。代码如下: String name = request.getParameter("name");//接收数据 name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题 System.out.println("name:"+name); response.setCharacterEncoding("UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码 response.setHeader("content-type", "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //HttpServletRequest详解 //2、获取客户端的信息 System.out.println("客户端的完整请求路径:" + request.getRequestURL()); System.out.println("客户端请求行中的资源名部分:" + request.getRequestURI()); System.out.println("请求行中的参数部分:" + request.getQueryString()); System.out.println("请求URL中的额外路径信息。" + "额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头:"+ request.getPathInfo()); System.out.println("发出请求的客户机的IP地址:" + request.getRemoteAddr()); System.out.println("发出请求的客户机的完整主机名:" + request.getRemoteHost()); System.out.println("客户机所使用的网络端口号:" + request.getRemotePort()); System.out.println("返回WEB服务器的IP地址:" + request.getLocalAddr()); System.out.println("返回WEB服务器的主机名:" + request.getLocalName()); System.out.println("返回WEB服务器的端口号:" + request.getLocalPort()); out.write("获取到的客户机信息如下:"); out.write("<hr/>"); out.write("请求的URL地址:"+request.getRequestURL()); out.write("<br/>"); out.write("请求的资源:"+request.getRequestURI()); out.write("<br/>"); out.write("请求的URL地址中附带的参数:"+request.getQueryString()); out.write("<br/>"); out.write("来访者的IP地址:"+request.getRemoteAddr()); out.write("<br/>"); out.write("来访者的主机名:"+request.getRemoteHost()); out.write("<br/>"); out.write("使用的端口号:"+request.getRemotePort()); out.write("<br/>"); out.write("remoteUser:"+request.getRemoteUser()); out.write("<br/>"); out.write("请求使用的方法:"+request.getMethod()); out.write("<br/>"); out.write("pathInfo:"+request.getPathInfo()); out.write("<br/>"); out.write("localAddr:"+request.getLocalAddr()); out.write("<br/>"); out.write("localName:"+request.getLocalName()); out.write("<br/>"); out.write("localPort:" + request.getLocalPort()); //3、获取请求头信息 Enumeration<String> enumerations = request.getHeaderNames(); out.write("<br/>"); while (enumerations.hasMoreElements()) { out.write("请求头" + enumerations.nextElement() + ": " + request.getHeader(enumerations.nextElement())); out.write("<br/>"); } //4、获取客户端请求的数据 // getParameter(String)方法(常用) // getParameterValues(String name)方法(常用) // getParameterNames()方法(不常用,提交的为字符串组的时候会丢失数据) // getParameterMap()方法(编写框架时常用) // 在服务器端使用getParameterMap方法接收表单参数,request对象封装的参数是以Map的形式存储的,代码如下: Map<String, String[]> paramMap = request.getParameterMap(); for(Map.Entry<String, String[]> entry :paramMap.entrySet()){ String paramName = entry.getKey(); String paramValue = ""; String[] paramValueArr = entry.getValue(); for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) { if (i == paramValueArr.length-1) { paramValue+=paramValueArr[i]; }else { paramValue+=paramValueArr[i]+","; } } System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue)); } //5、请求转发 //(1)通过ServletContext的getRequestDispatcher(String path)方法 //该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发 //RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp"); //reqDispatcher.forward(request, response); //(2)通过request对象提供的getRequestDispatche(String path)方法 //该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。 //request.getRequestDispatcher("/test.jsp").forward(request, response); //重定向 //response.sendRedirect("www.baidu.com"); //6、request对象作为一个域对象(Map容器)使用时,主要是通过以下的四个方法来操作 //setAttribute(String name,Object o)方法,将数据作为request对象的一个属性存放到request对象中,例如:request.setAttribute("data", data); //getAttribute(String name)方法,获取request对象的name属性的属性值,例如:request.getAttribute("data") //removeAttribute(String name)方法,移除request对象的name属性,例如:request.removeAttribute("data") //getAttributeNames方法,获取request对象的所有属性名,返回的是一个,例如:Enumeration<String> attrNames = request.getAttributeNames(); } catch (IOException e) { e.printStackTrace(); } } @Override public void doPost(HttpServletRequest req, HttpServletResponse res){ } }