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<String, String[]> 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<String, String[]> properties)[重点]–方法将Map集合中的数据封装JavaBean对象中,后面的该请求中获取和存储数据就直接用实体类进行,非常方便。

①.index.html

<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <body>
  <form action="login" method="post">
    <input type="text" name="username" placeholder="用户名"/><br/>
    <input type="password" name="password" placeholder="密码"/><br/>
    <input type="submit" value="登录"/>
  </form>
  </body>
</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<String, String[]> 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,每个链接后面需要携带要下载的文件的文件名;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <h2>通过超链接的方式下载资源</h2>
    <a href="/downloadServlet?filename=1.zip">1.zip</a><br>
    <a href="/downloadServlet?filename=2.exe">2.exe</a><br>
    <a href="/downloadServlet?filename=3.txt">3.txt</a><br>
    <a href="/downloadServlet?filename=4.jpg">4.jpg</a><br>
</body>
</html>

②:编写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;

/**
 * @author hanzhijian
 * @version v1.0
 * @date 2018/12/11 23:12
 * @description TODO
 **/
@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应用)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值