request和response

一,Request

1,tomcat服务器接收到客户端发来的HTTP协议请求(行头体)后,解析出里面的信息,封装成对象发送给Servlet

里面的Request方法

​ Request的作用:

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

​ Request获取请求行的作用的相关方法

​ 在继承了HttpServlet 类的类中重写doGet方法,方法中调用以下方法

​ 1,获取请求方式 :getMethod() 浏览器地址栏直接访问发送的是get请求

​ 2,获取请求的url地址:getRequestURL() 浏览器输入的url(互联网访问该资源的地址)地址

​ 3,获取请求的uri地址:getRequestURI() uri同意资源标识符(项目名+当前资源名)标识在服务器中可以使用这个地址来标识一个资源

​ 4,获取请求的项目名:getContextPath()

​ 5,获取请求的客户端的ip:getRemoteAddr()

​ 6,获取请求的协议:getProtocle() http版本

​ 获取请求头的作用的相关方法

​ 在继承了HttpServlet 类的类中重写doGet方法,方法中调用以下方法

​ 1,getHeader(key) key=user-agent是获取客户端的系统和浏览器的信息

获取请求体(请求参数)的方法(重要)

​ 在继承了HttpServlet 类的类中重写doGet方法,方法中调用以下方法

​ 1,根据一个参数名获取一个参数值 getParameter(name);

​ 2,根据一个参数名获取多个参数值 getParameterValues(name); 返回一个包含多个value的数组

​ 3,获取所有的请求参数 getParameterMap(); 返回一个map集合,参数名是map的key,参数值是map的value(string[])

​ 遍历map集合:parameterMap.entrySet().for使用增强for循环拿到每一个键值对

​ 然后stringEntry.getKey()拿到key,stringEntry.getValue()拿到value,value是个数组,可以Arrays.toString(value[])

post方式提交请求参数乱码的问题:在获取请求参数之前doGet方法中调用request.setCharacterEncoding("UTF-8"),然后再获取请求体参数值

​ 4,BeanUtils工具封装 将多个请求参数封装到Map集合中有缺点,获取的时候要遍历,不方便,数据转换不够方便

所以我们将数据封装到JO就是对象中,

创建一个User类,实现序列化接口serializable,私有成员变量和浏览器传回的用户名密码等信息对应,添加对应的get/set方法,

doGet方法中获取参数 getParameterMap(); 返回一个map集合,

​ 然后借助BeanUtils将ParameterMap中的数据封装到user对象中(引入BeanUtils的三个jar包,放在WEB-INF里面的lib文件夹里面,添加到图书馆)

​ User user = new User();

​ BeanUtils.populate(user, parameterMap) 有异常try/catchy一下

​ 此时User中就存储了parameterMap中的数据,而且BeanUtils底层会自动进行数据类型的转换

Request请求转发:就是跳转到其他页面,添加完数据或删除完数据跳转到展示页面,底层也是map集合

​ doGet方法中

​ request.getRequestDispatcher("要跳转的相对或绝对路径").forward(request , response);

相对路径:不以/开头,以目标资源相对于当前资源的路径

绝对路径:以/开头,对于请求转发而言在完整的url基础之上省略"项目路径",对于非请求转发而言,在完整的url基础之上省略服务器路径

完整的url:http://服务器路径/项目名/资源名

​ Request作为域对象存数据(Request域对象的作用只在一次请求之间)

​ doGet方法中

​ String str="周杰伦";

​ 将str存入域对象

​ request.setAttribute("str"= str);

​ 跳转到另外一个request 使用请求转发

​ 另外一个request中使用 String str = (String) request.getAttribute("str"); 就可以从域对象中获取str可以强转成String类型

二,Response

Response是响应,由服务器发给客户端,把需要传回的数据封装到Response对象,tomcat底层会自动把信息解析到http协议里面

​ response的作用1,设置响应行的数据

​ 设置响应状态码:常见的状态码 200:ok 302:重定向 304:从缓存中获取 403:拒绝处理 404:资源未找到 500:服务器异常

​ doGet方法中

​ response.setStatus(403); 设置响应行

​ response的作用2,设置响应头的数据

​ 常用的响应头

​ Refresh : 定时跳转

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

​ Content- Disposition : 告诉浏览器下载

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

​ 通过设置响应头实现3秒钟跳转百度 response.setHeader("Rafresh","3 ; url = 百度一下,你就知道");

​ 重定向跳转

​ response.setStatus(302);

​ response.setHeader("Location"," 百度一下,你就知道");

​ 重定向跳转的简单方式

​ response.sendRedirect("百度一下,你就知道");

​ 有时重定向内部资源时项目路径有时被更改就定向失败了,需要动态获取项目名request.getContexPath()

​ response.sendRedirect(request.getContexPath()+"/资源名");

​ 重定向跳转和请求转发的区别

1,重定向跳转是浏览器发起的,请求转发跳转是服务器发起的

2,请求转发只能跳转到本项目资源,重定向可以跳转到外部资源

​ 3,请求转发可以访问WEB-INF中的资源,重定向没办法访问WEB-INF中的资源

​ 4,请求转发浏览器只发起一次请求,重定向浏览器会发起两次请求

​ 5,请求转发地址栏不变,重定向地址栏会变化

​ 6,请求转发能和request域对象存取值一起使用,重定向不能

​ 通过response的字符输出流,向浏览器输出内容,write();方法只能输出字符串,print();方法既能输出字符串又能输出非字符串

​ response.getWriter().write("helloworld"); 输出中文会乱码

​ 解决乱码

​ 在输出流之前写: response.setContentType("text/html;charset=UTF-8");

​ 通过response将图片显示到客户端浏览器

​ 1,设置响应数据类型为:图片的mime-type

​ String mimeType = getServletContext().getMimeType("mm.jpg");

​ response.setHeader("Content-type",mimeType);

​ 2,使用字节输入流,将图片读到内存中

​ InputStream is = getServletContext().getResourceAsStream("mm.jpg");

​ 3,使用字节输出流,将图片输出到浏览器

​ ServletOutputStream os = response.getOutputStream();

​ 4,循环读写

// byte[] buffer = new byte[1024];

​ int len=0;

​ while((len=is.read(buffer))!=-1){

​ os.write(buffer,0,len);

​ } //

//中间的代码不用自己写,可以给WEB-INF包的lib文件夹中添加io 的jar包 然后 IOUtils.copy(is,os);

​ os.close();

​ is.close();

注意:有可能报空指针异常,是因为复制过来的图片,没有在编译后的out文件夹中存在,造成读不到,需要复制图片到项目目录下,或者重新打包部署

下载文件案例

html文件

<!--设置跳转到ServletDownLoad页面进行增强下载,告诉Servlet要下载的文件名称用:?+filename-->
<a href="download?filename=mm.jpeg">下载mm.jpeg</a>

java文件

@WebServlet("/download")
public class ServletDownLoad extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //读取客户端想下载的文件名
        String filename = request.getParameter("filename");
        System.out.println(filename);
        //设置下载的文件的mime-type
        String mimeType = getServletContext().getMimeType(filename);
​
        response.setHeader("Content-type",mimeType);
        //使用字节输入流读取客户端想要下载的文件
        InputStream is = getServletContext().getResourceAsStream(filename);
        //使用字节输出流将图片输出到浏览器
        ServletOutputStream os = response.getOutputStream();
        //下载中文文件乱码问题需要将filename进行url编码,使用UERLEncoder
        String encodeFileName = URLEncoder.encode(filename, "UTF-8");
        //输出之前,通过设置响应头的方式提示客户端下载文件
        response.setHeader("Content-Disposition","attachment;filename=" +encodeFileName);
​
        byte[] buffer = new byte[1024];
​
        int len=0;
​
        while((len=is.read(buffer))!=-1){
​
            os.write(buffer,0,len);
​
        }
​
        os.close();
​
        is.close();
​
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值