zoukankan      html  css  js  c++  java
  • Servlet学习(二)--HttpServletRequest

    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){
            
        }
    }
    个人理解,如有错误,欢迎指正!
  • 相关阅读:
    数据结构与算法基础 模块七
    操作系统
    数据结构与算法基础 模块六
    数据库技术
    数据库技术
    数据库 SQL语句
    数据结构与算法基础 模块五
    同源策略和解决
    初识单例模式
    Django—内置用户权限管理
  • 原文地址:https://www.cnblogs.com/gllegolas/p/11793792.html
Copyright © 2011-2022 走看看