【Servlet】请求的解析

请求转发的特点

base标签

演示程序不能跳回来的情况

运行结果:

到位分析:

Web中的相对路径和绝对路径

相对路径:

绝对路径:

web中/ 斜杆的不同意义

HttpServletResponse类

HttpServletResponse类的作用

两个输出流的说明

往客户端回传数据

中文乱码问题

第一种方式:

第二种方式:

第三种方式:

请求重定向

第一种方式

请求重定向的特点

第二种方式


请求的转发

======

请求的转发是指从一个资源跳转到另一个资源的操作叫做请求的转发

创建两个类servlet1和servlet2继承HttpServlet

Servlet1类下:

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class Servlet1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取请求的参数(办事的材料)查看

String username=request.getParameter(“username”);

System.out.println(“在Servlet1(柜台1)查看参数(材料)”+username);

//设置域数据(给材料盖个章,并传递到Servlet2(柜台2)中去查看)

request.setAttribute(“key1”, “柜台1的章”);

//问路:Servlet2怎么走

/**

  • 请求转发必须要以斜杆/开头,/ 斜杆表示地址为http://ip:port/工程名/ 映射到idea中是web目录

*/

RequestDispatcher requestDispatcher = request.getRequestDispatcher(“/servlet2”);

//走向Servlet2(柜台2)

requestDispatcher.forward(request, response);

}

}

servlet2类下:

public class Servlet2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取请求的参数(办事的材料)查看

String username=request.getParameter(“username”);

System.out.println(“在Servlet2(柜台2)查看参数(材料)”+username);

//查看柜台1是否有盖章

Object key1 = request.getAttribute(“key1”);

System.out.println(“柜台1是否有章:”+key1);

//处理自己的业务

System.out.println(“Servlet2处理自己的业务”);

}

}

运行访问http://localhost:8080/03_servlet/servlet1

运行结果:

在访问栏中加入参数 ?后面都是参数

回车得:

请求转发的特点


1、浏览器地址栏没有变化(一直都是工程名/servlet1)

2、他们试一次请求

3、可以共享Request域中的数据(域数据在整个工程都能访问)

4、可以转发到WEB-INF目录下(WEB-INF受服务器保护,不能通过客户端(浏览器)直接访问可以通过服务器中的资源间接访问)

5、不能访问工程以外的资源(因为他是从工程下找的,工程下没有的一律访问不了)

在类Servlet1中

地址访问:

RequestDispatcher requestDispatcher = request.getRequestDispatcher(“/WEB-INF/form.html”);

base标签

======

演示程序不能跳回来的情况


创建一个类ForwardC继承HttpServlet类

public class ForwardC extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println(“经过了Forward程序”);

req.getRequestDispatcher(“/a/b/c.html”).forward(req, resp);

}

}

在web.xml中配置

ForwardC

com.servlet.ForwardC

ForwardC

/forwardC

在web目录下创建如图所示

在c目录下写

这是一个c页面

返回首页

在index.html下写

Title

这是web下的index.html

a/b/c.html

请求转发:a/b/c.html

运行之后:

我们前面也说过,只写到工程名默认访问index页面

我们发现点击上下两个都可以成功跳转

虽然都成功跳转了,但是地址明显不同,因为我们在c.html下写的是…/…/index.html,

运行结果:

到位分析:

前者(第一个),localhost:8080/03_servlet/a/b/c.html,经过…/…/跳转可以到web工程下,正好web下有index.html,所以会跳转成功。

**后者(第二个 ),**localhost:8080/03_servlet/forwardC,经过…/…/跳转就会跳到src目录下,而src目录下显然没有index.html页面,故会失败。(结构是:src/com/servlet/Forward)

图示:

当我们加入base标签后,浏览器就会以这个base标签的为最终地址。

base标签一般加在title之下

这是一个c页面

返回首页

这样就解决了后者不能调到首页的问题。

Web中的相对路径和绝对路径

==============

在javaWeb中,路径分为相对路径和绝对路径两种:

相对路径:


.                      表示当前目录

                     表示上一级目录

资源名            表示当前目录/资源名

绝对路径:


http://ip:port/工程路径/资源路径

web中/ 斜杆的不同意义

=============

在web中/ 斜杆是一种绝对路径。

/  斜杆如果被浏览器解析,得到的地址是:http://ip:port/

斜杆的意义

/  斜杆如果被服务器解析,得到的地址是:http://ip:port/工程路径

1、/servlet1

2、servletContext.getRealPath(“/”);

3、request.getRequestDispatcher(“/”)

特殊情况:response.sendRediect(“/”);把斜杆发送给浏览器解析,得到http://ip:port/

HttpServletResponse类

====================

HttpServletResponse类的作用


HttpServletResponse类和HttpServRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletRequest表示过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象进行设置

两个输出流的说明


字节流       getOutputStream();           常用于下载(传递二进制数据)

字符流      getWriter();                         常用于回传字符串(常用)

两个流同时只能使用一个。否则报错

往客户端回传数据

========

创建一个类ResponIOServlet:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
一个类ResponIOServlet:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-cfiIP2Rh-1715768401864)]

[外链图片转存中…(img-XB4alzkt-1715768401865)]

[外链图片转存中…(img-E23QvbJo-1715768401865)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值