Request请求 Response响应

本文详细介绍了在基于Tomcat的Servlet开发中,如何处理Request请求和Response响应。包括Request的实体类封装、流读取、请求转发和共享数据,以及Response的中文乱码处理、字节流应用和响应重定向。特别强调了请求转发与响应重定向的区别和应用场景。
摘要由CSDN通过智能技术生成

基于Tomcat,提供的Request和Response对象

Request请求

        请求代表用户通过浏览器访问服务器(浏览器→服务器)

        开发人员(我们)需要:获取 请求行 请求头 请求体 相关信息

获取请求行

方法

说明

getMethod();

获取请求方法

getContextPath();

获取当前应用发布名称

(发布时写的那个 / ,但是打印是””空)

getRequestURL();

获取请求资源的URL

getRequestURI();

获取请求资源URI

getProtocol();

获取使用的协议

getRemoteAddr();

getRemotePort();

获取来访者信息:地址 端口号

getLocalAddr();

getLocalPort();

获取本地信息:地址 端口号

获取请求头

方法

说明

getHeader("Xxx");

获取消息头的值

getHeaderNames();

获取所有消息头名称的枚举

Enumeration<String> headerNames = req.getHeaderNames();
//遍历枚举
    while (headerNames.hasMoreElements()){
    String headerName = headerNames.nextElement();  //取出消息头
    String headerValue = req.getHeader(headerName); //根据名称获取值
    System.out.println("消息头名称是:"+headerName+",消息头的值是:"+headerValue);

}

获取请求参数

        解决中文乱码问题:req.setCharacterEncoding("UTF-8");

        提取HTML文件中name属性

方法

说明

String getParameter

(String name);

根据参数名获得参数值(单个)

String[] getParameterValues

(String name);

根据参数名获得参数值(数组)

Map<String, String []>

getParameterMap();

获得所有的参数,封装到Map集合

Enumeration<String> getParameterNames();

获得所有请求参数名称的枚举

实体类封装

pom.xml导入Beanutils依赖,进行实体类封装,name取值和实体类属性相同

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.8.3</version>
</dependency>
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //解决请求参数中文乱码问题
    req.setCharacterEncoding("UTF-8");
    //1.创建要封装的对象
        User user = new User();
    try{
    //2.把请求参数的map封装到user对象中
        BeanUtils.populate(user,req.getParameterMap());
    }catch (Exception e){
    e.printStackTrace();
    }
    //3.输出
    System.out.println("封装对象是:"+user);
}

流读取

pom.xml导入hutool依赖,完成读取,服务器会给我们关流

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.6.4</version>
</dependency>
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.获取请求对象的字节输入流
    ServletInputStream in = req.getInputStream();
    //2.流的操作
    String str = IoUtil.read(in, "UTF-8");
    System.out.println("用流读到的请求正文是:"+str);
}

请求转发

        一次请求在服务器内部资源之间跳转方式

        浏览器 → servlet A → servlet B (A到B达成目的)

        WEB-INF可以请求转发,但是浏览器不能直接访问其目录下资源

1.获取转发对象
RequestDispatcher dispatcher = req.getRequestDispatcher("/Xxx");//参数写的就是转发的目的地
2.真正完成转发
dispatcher.forward(req,resp);

共享数据

方法

说明

void setAttribute (String name, Object value)

向request域放入数据

object getAttribute (String name)

根据name从向request域获取数据

void removeAttribute (String name)

根据name从request域删除数据

Response响应

        响应代表浏览器对用户的结果反馈(服务器→浏览器)

         开发人员(我们)需要:设置响应状态码 响应消息头 响应正文相关信息

解决中文乱码:原理设置和显示不是一个码表

resp.setContentType("text/html;charset=UTF-8");

service只能使用字节流或者字符流其中的一种

//1.使用响应对象获取字节流
ServletOutputStream out = resp.getOutputStream();
//2.使用字节流输出正文
out.write("<h1>你好啊!</h1>".getBytes("UTF-8"));
//1.使用响应对象获取字符流
PrintWriter out = resp.getWriter();
//2.使用字符流输出正文
out.write("<h1>你好啊!</h1>");

使用字节流生成验证码(后面铺底)

表单

<form method="post" action="/responseDemo3">
    姓名:<input type="text" name="username"></br>
    密码:<input type="password" name="password"></br>
    <img src="/responseDemo3" width="200" height="50"/></b>
    <!--浏览器遇到script标签和link标签img标签会自动向服务器发送请求-->
    <input type="submit" value="提交">
</form>

pom.xml导入hutool依赖

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建验证码对象
LineCaptcha lineCaptcha = new LineCaptcha(200,30,6,10);
//2.使用验证码对象中提供的输出把,把字节输出流传递进去
lineCaptcha.write(resp.getOutputStream());
}

响应重定向

重定向方法

//1.设置响应消息头
resp.setHeader("Location","/responseDemo5");
//2.设置响应状态码
resp.setStatus(302);

简化方法

resp.sendRedirect("/responseDemo5");

 请求转发   响应重定向

请求转发:

一次请求 只能方法应用资源 地址栏显示转发的地址 可以使用请求共享区 服务器完成


响应重定向:

二次请求 可以定向外部资源 地址栏显示重定向地址 请求共享区数据丢失 浏览器完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值