zoukankan      html  css  js  c++  java
  • Servlet第三天Request

    1.HttpServletRequest

      1.获取客户机信息:

    •getRequestURL方法返回客户端发出请求时的完整URL。
    •getRequestURI方法返回请求行中的资源名部分。
    •getQueryString 方法返回请求行中的参数部分。
    •getRemoteAddr方法返回发出请求的客户机的IP地址
    •getRemoteHost方法返回发出请求的客户机的完整主机名
    •getRemotePort方法返回客户机所使用的网络端口号
    •getLocalAddr方法返回WEB服务器的IP地址。
    •getLocalName方法返回WEB服务器的主机名
    //获取请求信息
    public class RequestTest extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取请求方式
            System.out.println(request.getMethod());
            // 获取请求URI
            System.out.println(request.getRequestURI());// /day06/RequestTest
            // 获取URL
            System.out.println(request.getRequestURL());// http://localhost/day06/RequestTest
            // 获取web应用名
            System.out.println(request.getContextPath());// /day06
            // 获取访问者IP
            System.out.println(request.getRemoteAddr());
            // 访问主机
            System.out.println(request.getRemotePort());
            // 获取端口号
            System.out.println(request.getRemotePort());
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    2.获取客户机请求头

    •getHeader(string name)方法
    •getHeaders(String name)方法
    •getHeaderNames方法  获得所有的头的key
    public class RequestTest2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            test_1(request);
        }
    
        // 获取头相关方法
        private void test_1(HttpServletRequest request) {
            String headValue = request.getHeader("Accept-Encoding");
            System.out.println(headValue);
            System.out.println("-------分隔符----------");
            Enumeration<String> e = request.getHeaders("Accept-Encoding");
            while (e.hasMoreElements()) {
                System.out.println(e.nextElement());
            }
            System.out.println("-------分隔符----------");
            // 获取所有头的名字
            e = request.getHeaderNames();
            while (e.hasMoreElements()) {
                String name = e.nextElement();
                String value = request.getHeader(name);
                System.out.println(name + "=" + value);
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    }
    3.获得客户机请求参数(客户端提交的数据)
    •getParameter方法
    •getParameterValues(String name)方法
    •getParameterNames方法   内省  BeanUtils
    •getParameterMap方法

    上传文件使用流获取数据在后面将会学习到

    注意使用BeanUtils需要导入commons-beanutils-1.8.jar和commons.logging-1.1.1.jar两个包
    /**
     * 获取提交数据 获取数据时,要先检查再再使用
     * 
     * @author malinkang
     * 
     */
    public class RequestTest3 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取数据方式1:根据名字获取值
            String value = request.getParameter("username");
            // 判断是否为空或空格
            if (value != null && !value.trim().equals("")) {
                response.getWriter().write(value + "<br/>");
            }
    
            // 获取数据方式2:
            Enumeration<String> e = request.getParameterNames();
            while (e.hasMoreElements()) {
                String name = e.nextElement();
                String value_2 = request.getParameter(name);
                response.getWriter().write(value_2 + "<br/>");
            }
            // 获取数据方式3:
            // 当有多个username使用getParameterValues方法
            String[] values = request.getParameterValues("username");
            // 获取数据时,要先检查再再使用
            for (int i = 0; values != null && i < values.length; i++) {
                response.getWriter().write(values[i] + "<br/>");
            }
            // 获取数据方式4:
            Map<String, String[]> map = request.getParameterMap();
            User user = new User();
            try {
                // 用map数据填充Bean
                BeanUtils.populate(user, map);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            System.out.println(user);
            // User [password=dasfas, username=[asdf, sadfasd]]
    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
    
        }
    
    }

    JavaBean

    public class User {
        private String[] username;
        private String password;
    
        public String[] getUsername() {
            return username;
        }
    
        public void setUsername(String[] username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User [password=" + password + ", username="
                    + Arrays.toString(username) + "]";
        }
    }

    获取数据中文乱码解决方案:

    提交数据两种方式1.Post方式提交(表单提交):设置字符编码

    2.Get方式提交(超链接提交):不能采用设置字符编码来解决;可通过以下方式解决:1.将获取数据先编码再解码;2.修改服务器配置(不建议)3.通过URLEncoding编码解决

    <a href="/.../Servlet?username<%=URLEncoder.encode("李四","UTF-8")%">提交</a>

    /**
     * 中文乱码问题
     * 
     * @author malinkang
     * 
     */
    public class RequestTest6 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            String username = request.getParameter("username");
            // Get解决方案1
            // System.out.println(new String(username.getBytes("iso8859-1"),
            // "utf-8"));
            // 解决方案2使用URLEncoder.encode进行编码
            System.out.println(URLEncoder.encode(username, "utf-8"));
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // post提交可以通过设置字符编码解决
            request.setCharacterEncoding("UTF-8");
            String username = request.getParameter("username");
            System.out.println(username);
        }
    
    }


    4.请求转发

    Request对象实现请求转发:一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
     
    request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
    request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

    setAttribute方法   设置或添加数据

    getAttribute方法          获取数据

    removeAttribute方法       删除数据

    getAttributeNames方法  获取名称,用于迭代

    /**
     * 请求转发
     * 
     * @author malinkang mvc (modle (javabean) view(jsp) cotroller(Servlet))
     */
    public class ServletTest6 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            String data = "hello";
    
            request.setAttribute("hello", data);
    
            RequestDispatcher dispatcher = request
                    .getRequestDispatcher("/index.jsp");
            PrintWriter out = response.getWriter();
            out.write(data);
            dispatcher.forward(request, response);
    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    请求转发的一些细节:

    • 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到客户端,forward方法将抛出异常
    • 如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行。原来写入到输出缓冲区的内容将被清空,但是,已经写入的响应头字段信息保持有效。

    5.请求包含

     

    6.防盗链

    /**
     * 防盗链
     * 
     * @author malinkang
     * 
     */
    public class RequestTest7 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取头
            String referer = request.getHeader("referer");
            if (referer == null || referer.startsWith("http://localhost")) {
                // 跳转到首页
                response.sendRedirect("/day06/index.jsp");
                return;
            }
            response.getWriter().write("hello");
    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
  • 相关阅读:
    关于nginx稳定版1.20.1 4层负载 stream模块失效
    Docker 容器内分析 java程序占用 cpu 高问题排查分析
    分组排序查第一第二的差值
    【album】语音合成技术
    8.juery
    7.dom
    6.对象
    5.函数
    4.数组
    3.JS
  • 原文地址:https://www.cnblogs.com/malinkang/p/2709536.html
Copyright © 2011-2022 走看看