【后端】Request和Response

【后端】Request和Response,第1张

【后端】Request和Response 一、Request 1. 获取请求
  • getMethod();获取请求方式
  • getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)
  • getContextPath(); 获得当前应用工程名(部署的路径);
  • getRequestURI();获得请求地址,不带主机名
  • getRequestURL();获得请求地址,带主机名
2. 获取请求头

  • getHeader(String name);
    • User-Agent: 浏览器信息
    • Referer:来自哪个网站(防盗链)
3. 获取请求参数 3.1 获取参数
  • getParameter(name):获取指定单个参数

  • getParameterValues(name):同时指定多个参数

  • getParameterMap():获取所有参数

  • setCharacterEncoding(“UTF-8”):解决请求乱码问题

@WebServlet("/request_01")
public class HttpRequest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //获取一个请求参数
        String username = request.getParameter("username");
        System.out.println(username);
        //获取多个请求参数
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        //获取所有请求参数
        Map parameterMap = request.getParameterMap();
        for (Map.Entry entry : parameterMap.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(Arrays.toString(entry.getValue()));
        }
    }
}
3.2 使用BeanUtils封装

将获取的参数封装成一个类的成员属性

参数类

public class User implements Serializable {
    private String username;
    private String password;
    private String[] hobby;
    private String age;
	
    getter();
    setter();
    
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + ''' +
                ", password='" + password + ''' +
                ", hobby=" + Arrays.toString(hobby) +
                ", age='" + age + ''' +
                '}';
    }
}

Servlet

@WebServlet("/beanutils")
public class UtilsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map parameterMap = request.getParameterMap();
        User user = new User();
        try {
            //调用接口进行封装
            BeanUtils.populate(user, parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println(user);
    }
}
4. 请求转发 4.1 跳转

在当前页面显示要跳转页面的内容,但只访问了当前Servlet一次

getRequestDispatcher("/路径").forward(request, response);
4.2 作为域对象

设置和获取属性,但只能访问一次。因此若再一个Servlet1中使用了设置,再访问另一个Servlet1中是无法获得值的,因为相当于Servlet1和Servlet各访问了一次共访问了两次

因此当request作为域对象时,需要与跳转相结合

void setAttribute(String name, Object o);	
Object getAttribute(String name);

设置值

@WebServlet("/dispatcher")
public class DispatcherServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name", "jay");
        request.getRequestDispatcher("/getattr").forward(request, response);
    }
}  

获取值

@WebServlet("/getattr")
public class GetAttrServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = (String) request.getAttribute("name");
        System.out.println(name);
    }
}
二、Response 1. 响应行

响应行代表客户端访问的结果状态,常见的响应状态码

  • 200 成功
  • 302 重定向
  • 304 读缓存
  • 404 客户端错误
  • 500 服务器错误

相关API:public void setStatus(int sc);:设置响应状态码

response.setStatus(403);
2. 响应头 2.1 常见响应头

响应头是服务器指示浏览器去做什么

public void setHeader(String name, String value);:设置响应头

  • 一个Key对应一个Value

  • 一个Key对应多个Value

常用的响应头

  • Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)
  • Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)
  • Content-Disposition: 告诉浏览器下载
  • Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)

**response.setHeader(“refresh”,“秒数;url=跳转的路径”); **:几秒之后跳转到指定的路径上

response.setHeader("Refresh","3;url=https://www.baidu.com");	//3s后跳转到百度
2.2 重定向

response.setHeader(“Location”, 重定向地址)

//1.设置状态码
response.setStatus(302);
//2.设置重定向的路径(绝对路径,带域名/ip地址的,如果是同一个项目里面的,域名/ip地址可以省略)	
response.setHeader("Location","http://localhost:8080/day28/demo08");
response.setHeader("Location","/day28/demo08");
response.setHeader("Location","http://www.baidu.com");

response.sendRedirect(“重定向地址”);:封装了设置状态码和重定向两个功能

response.sendRedirect("http://localhost:8080/day28/demo08");
2.3 重定向与请求转发
  • 重定向的跳转是由浏览器发起的,且会发起两次请求,因此浏览器地址栏会变;请求转发是由服务器发起的,浏览器只请求了一次,因此浏览器地址栏不会变。
  • 重定向时浏览器可以跳转到任意服务器资源,但不能访问服务器的WEB-INF中的资源;请求转发时浏览器可以访问包括web-INF中的任意资源,但无法跳转到别的服务器
  • 重定向是response行为,无法使用request的域对象;请求转发是request行为,可以直接使用域对象。
3. 响应体

相应 *** 作体的API,页面输出只能使用其中的一个流实现,两个流是互斥的.

3.1 字符输出流

public PrintWriter getWriter() throws IOException;

  • getWriter().write()输出字符串
  • getWriter().print()既能输出字符串也能输出非字符串
@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
	...

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置服务器的响应字符集,避免乱码
        response.setContentType("text/html;charset=UTF-8");

        //要向浏览器输出响应体的信息,需要通过流来进行 *** 作
        //第一种:字符串,输出文本内容
        PrintWriter writer = response.getWriter();
        //使用字符流往浏览器输出文本
        //1. writer()方法,只能输出字符串,如果输出int、float等等类型的话,则会有问题
        writer.write("你好世界");

        //2. print()方法,可以输出数字、字符串
        writer.print(8);
    }
}
3.2 字节输出流

字节输出流可以向浏览器输出任意类型资源

public ServletOutputStream getOutputStream() throws IOException;

@WebServlet("/demo05")
public class ServletDemo05 extends HttpServlet {
	...
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 读取b.jpg图片,将其转换成字节输入流,使用ServletContext
        ServletContext servletContext = getServletContext();
        InputStream is = servletContext.getResourceAsStream("b.jpg");

        //2. 使用字节输出流,将is中的字节都输出到浏览器
        ServletOutputStream os = response.getOutputStream();

        
		
        //注意:需要引入commons-io的jar包
        IOUtils.copy(is,os);

        os.close();
        is.close();
    }
}
三、路径问题 1. URL

URL组成部分

  1. 协议 http://
  2. 服务器主机地址 localhost
  3. 服务器端口号 :8080
  4. 项目的虚拟路径(部署路径) responseDemo
  5. 项目上的具体资源路径 /pages/hello.html或/demo02(servlet映射路径)

使用完整URL场景

  1. 浏览器地址栏直接访问
  2. 当前项目访问另一个项目的资源
2. 绝对路径和相对路径

绝对路径:

  • 请求转发只能访问项目内资源,因此即便写绝对路径也可以省略项目路径,如"/hello.html"
  • 非请求转发的绝对路径写法"/项目部署路径/资源路径" 例如"/responseDemo/hello.html"

相对路径:

不以"/"开头的路径写法,它是以目标路径相对当前文件的路径,如

四、文件下载实例

通过超链接方式下载(不推荐)

即将要下载的文件路径写到href属性中,如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了

通过响应头指定浏览器下载

Content-Disposition: 告诉浏览器下载

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
	...
        
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取要下载的文件名
        String filename = request.getParamter("filename");
        //2.获取下载文件的流信息
        InputStream is = request.getServletContext().getResourceAsStream("file/"+filename);
        //2.设置mimetype文件头
        String mimetype = request.getServletContext().getMimeType(file);
        response.setHeader("Content-Type",mimeType);
        //4.设置下载的响应头
        //对文件名进行utf8编码避免乱码
        String ecodeFIlename = URLEcoder.encode(filename, "UTF-8");
        response.setHeader("Content-Disposition","attachment;filename="+encodeFileName);
        //5.输出流数据
        ServletOutputStream os = response.getOutputStream();
       	IOUtils.copu(is, os);
        //6.关闭资源
        is.close();
        os.close();
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5482901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存