Servlet学习(二)--HttpServletRequest

Posted on 2019-11-04 18:17  GLLegolas  阅读(155)  评论(0编辑  收藏  举报
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){
        
    }
}