request&response笔记

request:用来封装HTTP请求消息

request作用

  • 操作请求三部分(行,头,体)

  • 请求转发

  • 作为域对象存数据

获取客户机信息(操作请求行)

请求方式 请求路径(URI) 协议版本

GET /day17Request/WEB01/register.htm?username=zs&password=123456 HTTP/1.1

  • getMethod();获取请求方式

  • getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)

  • getContextPath();获得当前应用工程名(部署的路径);

  • getRequestURI();获得请求地址,不带主机名

  • getRequestURL();获得请求地址,带主机名

  • getServerPort();获得服务端的端口

  • getQueryString();获的请求参数(get请求的,URL的?后面的. eg:username=zs&password=12345

操作请求头

  • getHeader(String name);

    • User-Agent: 浏览器信息

    • Referer:来自哪个网站(防盗链)

操作请求体:

一、操作请求参数:

方法名描述
String getParameter(String name) 获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack
String[] getParameterValues(String name) 获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒&hobby=敲代码
Map<String,String[]> getParameterMap() 获得所有的请求参数。key为参数名,value为key对应的所有的值。
//解决post方式乱码问题,get方式优化了,不会有乱码问题
        request.setCharacterEncoding("utf-8");
        //获得一个值的情况(获得用户名和密码)
        String usname = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(usname + ":" + password);

        System.out.println("---------------------------");
        //获取多个值的情况
        String[] hobbyArray = request.getParameterValues("hobby");
        String hobbyStr = Arrays.toString(hobbyArray);
        System.out.println(hobbyStr);

        //获得所有key和值,得到Map
        Map<String, String[]> map = request.getParameterMap();
        Set<String> keySets = map.keySet();
        for (String keySet : keySets) {
            String[] strings = map.get(keySet);
            System.out.println(keySet+":"+Arrays.toString(strings));
        }
使用java包的方式:
public
class User implements Serializable { private String username; private String password; private String gender; private String[] hobby; ..... ----------------------- //获得所有的请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); //将请求参数封装到User对象中 User user = new User(); //使用BeanUtils框架自动将map中的数据封装到对象中 try { BeanUtils.populate(user,parameterMap); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
//注意:java包放在WEB-INF中

requet作为域对象存取值:

相比ServletContext: 

  • ServletContext:的范围是整个应用的,(无论请求多少次,只要在这个应用里就可以)
  • requte:只能在同一次请求中进行数据共享
发送
String username = "周杰";
        request.setAttribute("name", username);
        //请求跳转到ServletDemo03
        request.getRequestDispatcher("demo22").forward(request,response);
----------------------------------
取
System.out.println(request.getAttribute("name"));

response:

常用状态码:

  • 200 成功

  • 302 重定向

  • 304 读缓存

  • 404 客户端错误

  • 500 服务器错误

常用的响应头

Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)

Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)

Content-Disposition: 告诉浏览器下载

Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)

重定向:
response.setStatus(302); response.setHeader("Location", "https://www.baidu.com");

解决字符流输出中文乱码问题

response.setContentType("text/html;charset=utf-8");

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得客户端要下载的那个文件名
        String fileName = request.getParameter("fileName");
        //设置下载文件的mime-type
        String mimeType = getServletContext().getMimeType(fileName);
        response.setHeader("Content-Type",mimeType);
        //使用字节输入流读取客户端要下载的那个文件
        InputStream resourceAsStream = getServletContext().getResourceAsStream("file/" + fileName);
        //使用字节输出流,将图片输出到浏览器
        ServletOutputStream outputStream = response.getOutputStream();
        //输出前,通过响应头的方式,只是客户端下载文件
        String encode = URLEncoder.encode(fileName, "UTF-8");
        //我们先将fileName进行URL编码:
        response.setHeader("Content-Disposition","attachment;filename="+encode);
        IOUtils.copy(resourceAsStream, outputStream);
        resourceAsStream.close();
        outputStream.close();
    }
原文地址:https://www.cnblogs.com/YwhsR0129/p/13816376.html