request和response复习总结

package com.request_response;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RR extends HttpServlet {

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //重要的参数方法
        try {
            importantFun(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }

        /**
         * request对象相关
         *
         */
        // 1. 获取请求方式 post get
        String method = request.getMethod();
        
        // 2. 获取协议
        String protocol = request.getProtocol();
        
        // 3. 获取请求资源
        String requestUrl = request.getRequestURL().toString();
        
        // 4. 获取工程名
        String projectName = request.getContextPath();
        
        // 5. 获取请求资源路径
        String projectResource = request.getRequestURL().substring(request.getContextPath().length());
        
        // 6. 获取请求的IP地址
        String requestIp = request.getRemoteAddr();
        
        // 7. 获取请求的端口
        int requestPort = request.getRemotePort();
        
        // 8. 获取请求的主机
        String requestHost = request.getRemoteHost();
        
        // 9.
        String requestUser = request.getRemoteUser();
        
        System.out.println("\n\n\nRemoteUser = " + requestUser);
        
        
        
        
        
        
        
        
        
        
        
        
        
        /*response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the POST method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();*/
    }
    
    /**
     * 重要的方法
     * @param request
     * @param response
     * @throws Exception
     */
    public void importantFun(HttpServletRequest request, HttpServletResponse response) throws Exception{
        
        //response对象常用方法
        
        //1. 设置状态码
        response.setStatus(302); //重定向状态码
        
        //2. 设置响应头信息
        response.setHeader("Location", request.getContextPath()+"/login.html"); //配合方法1 设置重定向路径
        
        //3. 重定向
        try {
            response.sendRedirect(request.getContextPath()+"/login.html"); //方法1 和 方法2的综合
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        //4. 通过response对象设置响应头信息, 设置5秒中自动跳转到新页面
        response.setHeader("refresh", "5; url="+request.getContextPath()+"/login.html");
        response.setHeader("content-type", "text/html;charset=utf-8");
        
        
        //5. response获取字符输出流
        PrintWriter out = response.getWriter();
        
        //6. response获取字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
        
        //7. 设置响应文件类型  MIME
        response.setContentType("text/html;charset=utf-8"); //代替 response.setCharacterEncoding("utf-8");
        
        //8. 设置输入编码方式
        response.setCharacterEncoding("utf-8");
        
        
        //request对象的常用方法
        
        //1. 获取页面传值
        String name = request.getParameter("name");
        
        //2. 获取多选框传过来的值
        String[] values = request.getParameterValues("interest");
        
        //3. 获取页面上所有的数据
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (Entry<String, String[]> string : parameterMap.entrySet()) {
            //将数组转换为字符串
            Arrays.toString(string.getValue());
        }
        
        //4. 获取请求方式
        String method = request.getMethod();
        
        //5. 获取协议
        String protocol = request.getProtocol();
        
        //6. 获取请求资源路径
        StringBuffer requestURL = request.getRequestURL();
        String requestURI = request.getRequestURI();
        String requestResource = request.getRequestURI().substring(request.getContextPath().length());
        
        //7. 获取主机ip
        String ip = request.getRemoteAddr();
        
        //8. 获取工程虚拟路径名
        String contextPath = request.getContextPath();
        
        //9. 获取执行的请求头信息, 获取请求头信息
        String referer = request.getHeader("referer"); //防盗链设置, 可以跟去头信息是否以服务器ip作为请求头信息来判断、该请求的链接地址
        if(referer != null && referer.startsWith("http://localhost")){
            //有效
        }
        
        //10. 获取客户端浏览器类型
        String agent = request.getHeader("User-Agent");
        
        //11. post方式请求乱码处理
        request.setCharacterEncoding("utf-8");
        
        //12. get方式请求乱码处理 编码转换/ 服务器默认解码类型为 iso-8859-1
        String parameter = request.getParameter("name");
        // 方法1
        parameter = URLEncoder.encode(parameter, "iso-8859-1"); //先编码
        parameter = URLDecoder.decode(parameter, "utf-8"); //再按照utf-8解码
        
        //方法2 利用字符串提供的编码设置**********************
        parameter = new String(parameter.getBytes("iso-8859-1"), "utf-8");
        
        request.setAttribute("key", "value");
        
        request.getRequestDispatcher("url").forward(request, response);
        
        //转发可以通过request携带数据, 重定向为什么不能携带数据?
        //因为重定向response是通知浏览器,进行的二次访问服务器。此时请求对象已经销毁了。
        
        /**
         * 转发:属于服务器内部跳转  路径不需要写工程名
         * 重定向:属于二次请求,请求路径需要添加工程名
         */
        
    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}

你可能感兴趣的:(java)