栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

web知识2(request+response)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

web知识2(request+response)

一:URL(Uniform Resource Locator)
1.概念:是对互联网上资源位置的一种表示,互联网上的每个资源都有一个唯一的URL
2.如图:

①:协议:http、https、ftp
②:域名/ip: 能够帮我们定位到互联网上的某一台服务器
③:端口号:端口号是一个应用程序在一台服务器上的编号。http协议的默认端:80
④:资源位置:用于描述WEB资源在服务器上的位置
⑤:参数: 浏览器和服务器交互传递的数据

二:HTTP请求(Hyper Text Transfer Protocol)
1.概念:超文本传输协议
2.作用:用来浏览器和服务器之间进行网页内容的传输
3.特点:

  • 一问一答
  • 先问后答
  • 问和答是一一对应的
    4.组成:
    ①:请求行:请求方式 URI 协议/版本号
    ②:请求头:多个键值对组成的数据
    ③:请求体:浏览器发送给服务器的实际内容(一般情况是表单数据)
    请求体只在POST出现

三:Request对象
1.获取请求行信息
2.获取请求头信息
3. 获取请求参数[重点]–post方式,请求体中的数据
①:String getParameter(String name)–通过参数名得到参数的值
②:String[] getParameterValues(String name)–通过参数名得到一组参数值,返回是字符串的数组
③:Enumeration getParameterNames()–得到所有参数的名字,返回是枚举的类型
④:Map getParameterMap()–得到表单提交的所有参数名和参数值,封装成一个Map集合
4.参数乱码问题(请求参数乱码问题)
①:GET方式的乱码解决方案
Tomcat 8.5,GET方式无乱码问题
②:POST方式的乱码解决方案
request.setCharacterEncoding(“utf-8”);
5.转发
①:语法:request.getRequestDispatcher("/resourceB").forward(request, response);
②:特点:

  • 地址不变
  • 服务器内部跳转
  • 一次请求
    6.请求域(一次请求中存取数据)
    ①:向作用域中添加键和值,如果之前没有这个键则是添加,如果有就是修改
    ②:从作用域中取出值
    ③:删除指定的键和值

应用案例:能够应用BeanUtils工具类对请求参数数据进行封装
1.先通过request.getParameterMap()获取前端所提交的所有数据
2.而后用BeanUtils工具类中的populate(Object bean, Map properties)[重点]–方法将Map集合中的数据封装JavaBean对象中,后面的该请求中获取和存储数据就直接用实体类进行,非常方便。

①.index.html


  
    
    
  
  
  


②.UserInfo.java

public class UserInfo {
    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;
    }

    public UserInfo() {
    }

    public UserInfo(String username, String password) {
        this.username = username;
        this.password = password;
    }
}

③.LoginServlet.java
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/login")

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        Map parameterMap = request.getParameterMap();
        UserInfo userInfo = new UserInfo();
        try {
            BeanUtils.populate(userInfo, parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        if (userInfo.getUsername().equals("user") && userInfo.getPassword().equals("pass")) {
            request.getRequestDispatcher("/login_success").forward(request, response);
        } else {
            request.getRequestDispatcher("/login_failure").forward(request, response);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

四:response对象
1.HTTP响应报文
①:响应行:协议/版本号 状态码
②:响应头:以key:value的形式给客户端(浏览器)发送响应参数
③:响应体:响应的具体数据

2.HttpServletResponse
①:设置响应行
②:设置响应头(refresh,content-type,location,content-disposition)
③:设置响应体(1.用于向浏览器输出字符数据。【字符流–给浏览器响应数据】,2.用于向浏览器输出二进制数据。【字节流–文件下载】)

3.Servlet中处理请求和响应中文乱码问题:
【请求乱码】
post请求乱码: request.setCharacterEncoding(“utf-8”);
get请求乱码:不需要处理
【响应乱码】
response.setContentType(“text/html;charset=utf-8”);

4.实例:response字节流下载
①:新建download.html页面
书写几个超链接标签,链接地址为downloadServlet,每个链接后面需要携带要下载的文件的文件名;




    
    文件下载


    

通过超链接的方式下载资源

1.zip
2.exe
3.txt
4.jpg

②:编写downloadServlet,处理下载业务逻辑
下载业务逻辑:两个头+两个流(流拷贝)
【两个头】
1. 设置响应头:Content-Disposition 告诉浏览器以附件的形式来处理文件;
2. 设置响应头: response.setContentType(mimeType) 告诉浏览器下载的文件的类型;
【两个流】
1. 将文件读取到流里边: FileInputStream fin = new FileInputStream(file);
2. 将流写给浏览器:response.getOutputStream().write(arr,0,len);

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


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

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //文件下载
        //filename
        String filename = request.getParameter("filename");
        //mimeType
        String mimeType = request.getServletContext().getMimeType(filename);
        //file
        String realPath = request.getServletContext().getRealPath("resource");
        File file = new File(realPath,filename);

        //1、设置两个头信息
        //告诉浏览器以附件的形式打开这个文件
        response.setHeader("content-disposition","attachment;filename="+filename);
        //告诉浏览器下载的文件的mimetype
        response.setContentType(mimeType);

        //2、设置两个流
        //通过response获取输出流
        ServletOutputStream out = response.getOutputStream();
        //将需要下载的文件读取到输入流中
        FileInputStream in = new FileInputStream(file);
        //流拷贝:
        int len = 0;
        byte[] buff = new byte[1024];
        while ((len = in.read(buff)) != -1) {
            out.write(buff,0,len);
        }
        out.close();
        in.close();

    }
}

小结:
1、文件后台下载的本质:流拷贝,将文件以流的形式从服务器发用给浏览器;
2、文件下载的步骤:两个头+两个流
两个头:
设置content-disposition头,告诉浏览器以附件的形式下载当前文件
设置mimeType头,告诉浏览器下载的文件的mimeType
两个流:
输出流:从response中获取输出流
输入流:将文件读取到输入流中
流拷贝:将文件以流的形式发送给浏览器
3、注意事项:
mimeType可以不用设置:现在的浏览器已经很智能了,可自动辨别所下载的文件类型,因此可不用设置此参数

5.四大域对象:
①:page(jsp有效)
②:request(一次请求)
③:session(一次会话)
④:application(当前web应用)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327636.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号