小白学习servlet--常用方法

学习servlet

Servlet–>GenericServlet–>HttpServlet

我们常用的就是它的孙子类HttpServlet

一、HttpServletRequest常用方法

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

1.常用方法

String getMethod(): 返回请求方式(GET/POST)
String getRequestURI():返回请求行中资源名字部分: 如/test/index.html
StringBuffer getRequestURL():返回浏览器地址栏的内容
String getContextPath():获取上下文路径(虚拟目录),<Context path=“上下文” …/>
String getRemoteAddr():返回请求服务器的客户端的IP地址
String getHeader(String headName):根据指定的请求头获取对应的请求头的值.

2.获取请求参数的方法

String getParameter(String name):根据参数名称,获取对应参数的值.
String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
Enumeration<String> getParameterNames(): 获取所有请求参数的名字
Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
key:参数名称
value:参数值,封装在String数组中.

3.中文乱码

在tomcat8中已经自己解决get获取参数的乱码问题,post得手动解决

req.setCharacterEncoding(“UTF-8”)

4.请求转发

通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

// 常用方式转发到servlet2资源

req.getRequestDispatcher("/servlet2").forward(req, resp);

特点:

浏览器地址栏路径不发生变化
只能转发到当前服务器内部资源中
转发只发送一次请求

5.共享数据

域对象: 一个有作用范围的对象,可以在范围内共享数据
request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法
void setAttribute(String name,Object obj):在servlet1存储数据
Object getAttitude(String name):就可以在servlet2通过键获取值
void removeAttribute(String name):通过键移除键值对

二、HttpServletResponse常用方法

ServletResponse接口: 响应对象, 封装了获取所有响应信息(状态行, 响应头, 请求实体)的方法
HttpServletResponse接口:是ServletResponse的子接口, 处理HTTP协议响应的方法.

1.常用方法

OutputStream getOutputStream():获取字节输出流对象. :一般输出图片

response.getOutputStream().writer(“你好”.getBytes(“这里面可以指定字符编码”));

Writer getWriter():获取字符输出流对象 :输出内容,一般输出文字

response.getwriter().writer(“Hello,world”)

如果输出内容为中文会乱码

response.setContextType(“text/html;charset=utf-8”);告诉浏览器用什么编码来解码,乱码解决

2.重定向

当访问responseDemo1,会自动跳转到/responseDemo2
---------方式一------------
设置状态码
resp.setStatus(302);
设置响应头 location
resp.setHeader(“location”, “/Servlet/responseDemo2”);

---------方式二------------
resp.sendRedirect("/Servlet/responseDemo2");

1).重定向的特点:redirect
  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据
2).转发的特点:forward
  1. 转发地址栏路径不变

  2. 转发只能访问当前服务器下的资源

  3. 转发是一次请求,可以使用request对象来共享数据

4.常见应用

1).向浏览器输出消息
2).下载文件
  • 获取下载文件路径

  • 下载文件名叫啥

  • 设置想办法让浏览器支持我们下载需要的东西

  • 获取下载文件的输入流

  • 创建缓冲区

  • 获取outputStream对象

  • 将FileOutputStream流写入到buffer缓冲区

  • 使用outputStream将缓冲区的数据输出到客户端

    package com.wangningbo.servlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.URLEncoder;
    /**
     * @author wangningbo
     * @date 2020/6/7 - 12:11
     */
    public class HelloHttpServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取下载文件路径
             String realpath = "E:\\myidea_workspace\\javaweb\\05-study-javaweb\\httpservlertresponse-01\\target\\classes\\老婆.jpg";
            //下载文件名叫啥,截取到文件名
            String fileName = realpath.substring(realpath.lastIndexOf("\\")+1);
            System.out.println(fileName);
            //设置想办法让浏览器支持我们下载需要的东西,一中文命名会存在编码问题,指定URLEncoder.encode(fileName,"UTF-8")
            resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
            //获取下载文件的输入流
            FileInputStream inputStream = new FileInputStream(realpath);
            //创建缓冲区
            byte[] bytes = new byte[1024];
            //获取outputStream对象
            ServletOutputStream outputStream = resp.getOutputStream();
            //将FileOutputStream流写入到buffer缓冲区,使用outputStream将缓冲区的数据输出到客户端
            int i = 0;
            while ((i=inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,i);
            }
            outputStream.flush();
            inputStream.close();
            outputStream.close();
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    三、绝对路径和相对路径

    1.相对路径:通过相对路径不可以确定唯一资源

    如:./index.html

    不以/开头,以.开头路径
    规则:找到当前资源和目标资源之间的相对位置关系

    ./:当前目录

    …/:后退一级目录

    2.绝对路径:通过绝对路径可以确定唯一资源

    如:http://localhost/day15/responseDemo2
    /day15/responseDemo2

    以/开头的路径
    规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出

给客户端浏览器使用:需要加虚拟目录(项目的访问路径)

建议虚拟目录动态获取:String contextpath=request.getContextPath()

contextpath+"/responseDemo2"

例如:<a> , <form> 重定向…

给服务器使用:不需要加虚拟目录

例如:转发路径

四、ServletContext(里面的功能后期用其他的来代替掉,了解)

1.ServletContext概述

ServletContext对象,tomcat为每一个web项目单独创建的一个(ServletContext)上下文(知上知下贯穿全文)对象。服务器启动的时候,为每个WEB应用创建一个单独的ServletContext对象,我们可以使用这个对象存取数据,用这个对象存取的数据,可以在整个WEB应用中获取.

服务器会为每个应用创建一个ServletContext对象:

ServletContext对象的创建是在服务器启动时完成的;
ServletContext对象的销毁是在服务器关闭时完成的。

2.获取ServletContext对象

request.getServletContext();

或者

this.getServletContext();

3.ServletContext常用功能

1)获取MIME类型:在互联网通信过程中的一种文件数据类型

String name = “a.jpg” // 类型为:image/jpeg

String mimeType = this.getServletContext().getMimeType(filname);

2)多个servlet之间共享数据

ServletContext很大一旦创建所有的servlet都可以从其中拿数据,生命周期很长,数据也不安全

this.getServletContext().setAttribute(String name,Object object) 向ServletContext中存数据
this.getServletContext().getAttribute(String name) 从ServletContext中取数据
this.getServletContext().removeAttribute(name) 从ServletContext中移除数据

3)获取文件真实路径

获取文件保存的位置 :
1.src下 : 发布到 /WEB-INF/classes/a.txt

String path = this.getServletContext().getRealPath("/WEB-INF/classes/a.txt");

2.web目录下 : 发布到/a.xt

String path = this.getServletContext().getRealPath("/a.txt");

3.WEB-INF目录下 : 发布到 /WEB-INF/a.txt

String path = this.getServletContext().getRealPath("/WEB-INF/a.txt");

String getRealPath(String str) 获取资源绝对路径
getResourceAsStream(String str) 获取资源输入流对象
参数 : str 与 getRealPath()的参数一致
返回值 : 输入流对象, 用来直接读取文件.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值