1、Tomcat和Servlet的关系

之前提到过,Servlet是运行在Web容器里的,Tomcat作为容器的一种,在这里自然也要大概说说两者之间的大致关系。

首先,如上所述,Tomcat是Web应用服务器,是一个Servlet/JSP容器。它负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传回给客户。而Servlet是运行在支持Java语言的服务器上的组件。

从HTTP协议中的请求和响应就可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。而在Web服务器中,容器将其分别封装成了对象,以便于我们进行操作:

  • Tomcat将HTTP请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读取可以通过request对象调用对应的方法查询到;
  • Tomcat同时将响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给Tomcat,Tomcat就会将其变成响应文本的格式发送给浏览器

2、请求对象的由来

Servlet类中我们往往要覆盖两个方法,doGet和doPost,而它们都有两个参数,分别是HttpServletRequest和HttpServletResponse,分别为请求和响应。

实际上,这两个类型都是接口,具体的实现类实际上是由容器实现的,其实也就是我们上面已经说明了的,是由Tomcat服务器将请求和响应进行了分别的封装,然后拿给我们使用。

我们可以使用System.out.println方法分别打印doGet和doPost方法中的形参request和response,你可以在控制台看到:
  • org.apache.catalina.connector.RequestFacade
  • org.apache.catalina.connector.ResposneFacade

我们可以看下API,实际上也确实是这样说明的,以请求对象为例:

Extends the ServletRequest interface to provide request information for HTTP servlets. 

The servlet container creates an HttpServletRequest object and passes it as an argument to the servlet's service methods (doGet, doPost, etc). 

3、HttpServletRequest接口

如下API,可以看到,因为请求中大部分数据是直接封装进去的,所以基本上都是get方法:

拿 getParameter(String name) 这个方法来示例,该方法是获取随着请求一起传递过来的额外信息,常见的如我们的账户密码登陆的表单提交,其中的name对应的是表单中input的name属性值,这其实在提交后的过程中也是容器帮我们封装好的。

如果是诸如checkbox多选框表单的提交,那么获取值的时候则使用 getParameterValues(String name),返回的是String类型的数组。
 
其他的get方法这里不再详细进行展开,可以参看API。

4、响应重定向和请求转发

我们知道,请求到达Servlet之后,往往还需要进一步的跳转到其他页面,因为之前已经说过,Servlet现在的作用还是用来做控制,而不再进行页面资源输出了。

所以在Servlet中有两种跳转方式:
  • 响应重定向
  • 请求转发

4.1 响应重定向

标准意义上的“重定向”指的是HTTP重定向,它是HTTP协议规定的一种机制。

这种机制是这样工作的:当client向server发送一个请求,要求获取一个资源时,在server接收到这个请求后发现请求的这个资源实际存放在另一个位置,于是server在返回的response中写入那个请求资源的正确的URL,并设置reponse的状态码为301(表示这是一个要求浏览器重定向的response),当client接受到这个response后就会根据新的URL重新发起请求。重定向有一个典型的特症,即当一个请求被重定向以后,最终浏览器上显示的URL往往不再是开始时请求的那个URL了(浏览器地址会变化)。

HttpServletResponse中定义了响应重定向的方法 sendRedirect(String path),该方法向目标资源重新发送请求,生成新的响应,并且:
  • 重定向使用GET方式提交
  • 重定向生成的是新的请求,所以当前请求中的数据不会随着新的请求而传递

4.2 请求转发

请求转发也称之为服务器端重定向,它指的是服务器在处理request的过程中将request先后委托多个Servlet或JSP接替进行处理的过程。

最为常见的是先由一个Servlet处理(比如实现业务逻辑的计算),然后forward给一个JSP进行视图的渲染,或者forward给另一个Servlet进一步处理。使用服务器端重定向,浏览器地址不会发生变化。因为浏览器只执行了对某个页面A的请求,而这个页面的服务器内部的跳转(或许还经过了页面B和页面C的处理)情况浏览器是不知道的,它只知道自己获得的响应是A页面发回来的,甚至不知道服务器中有多个Servlet处理。

 
在Servlet中,要先使用HttpServletRequest请求中的 getRequestDispatcher(String path) 获取请求转发器对象,然后调用该对象的 forward(request, response) 方法进行跳转。
 
往往以连写的方式,如下示例:
request.getRequestDispatcher(String path).forward(request, response);


[02] Servlet获取请求和页面跳转的更多相关文章

  1. Ajax发送POST请求SpringMVC页面跳转失败

    问题描述:因为使用的是SpringMVC框架,所以想使用ModelAndView进行页面跳转.思路是发送POST请求,然后controller层中直接返回相应ModelAndView,但是这种方法不可 ...

  2. Servlet、JSP中页面跳转的方式

    一.Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面.1)  redirect 方式response.sendRedirect("success ...

  3. 使用ajax发送的请求实现页面跳转

    ajax 本身是不适用于页面跳转的: 可以借助其他方法实现: 1,window.location.href = "/home"; 2,springMVC 返回的modelAndVi ...

  4. 用js 获取url 参数 页面跳转 ? 后的参数

    记得之前在原来的公司写过这个东西,但是还是忘记怎么接住参数了,只知道怎么把id传过去! 问了身边的大佬 他首先推荐了我一个链接是别人写好的方法 附上链接地址:http://blog.csdn.net/ ...

  5. 【转】request和response的页面跳转传参

    下面是一位园友的文章: jsp或Servlet都会用到页面跳转,可以用 request.getRequestDispatcher("p3.jsp").forward(request ...

  6. js实现页面跳转的两种方式

      CreateTime--2017年8月24日08:13:52Author:Marydon js实现页面跳转的两种方式 方式一: window.location.href = url 说明:我们常用 ...

  7. Servlet(简介,请求参数,页面跳转,生命周期,创建,配置,ServletContext,线程)

    1.Servlet简介 servlet是java servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序, 主要功能在于交互式浏览和修改数据,生成动态的web内容 服务端运行的 ...

  8. js页面用定时任务通过AJAX获取后台数据,但是从这个页面跳转到其他页面后,定时任务仍然在定时请求后台

    setInterval(function(){//ajax 请求后台数据},1000);这个是A页面的定时器然后我在A页面通过其他请求跳转到其他页面之后后台发现A页面的定时器的那个请求仍然在执行为什么 ...

  9. Jsp与servlet之间页面跳转及参数传递实例(转)

    原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java ...

随机推荐

  1. java集合判断

    java开发中经常需要做集合判断,在这里mark一下,加强记忆 为空判断: null == applyList || applyList.size() ==0 非空判断: applyList != n ...

  2. 33、线程与全局解释器锁(GIL)

    之前我们学了很多进程间的通信,多进程并发等等,今天我们来学习线程,线程和进程是什么关系,进程和线程有什么相同而又有什么不同今天就来揭晓这个答案. 一.线程概论 1.何为线程 每个进程有一个地址空间,而 ...

  3. 5_find grep sed awk 详解

    find :查找文件系统中指定的文件.可以按文件名(-name)  权限(-perm) 归属人 查找. find   要查找文件的路径   表达式 *通配符  可以添加在文件名的任意位置 常用的例子( ...

  4. Java基础---集合

    第一讲    集合框架 先看下面的图: 这就是集合框架的构成.由于数据结构的不同,有不同的集合,也叫容器.下面是集合类的简单介绍. 一.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所 ...

  5. Groovy读取文件信息

    1. eachLine -- 打开和读取文件的每一行 new File("foo.txt").eachLine { println it.toUpperCase(); } 2. r ...

  6. webstom,zencoding,windows快捷键

    1.webstorm快捷键: IntelliJ-Idea 的快捷键 Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*…*/ ) Shift+F6 重构-重命名 Ctrl+X 删除行 C ...

  7. 后端路由项目由 gulp 改为 webpack 的踩坑实录

    前言 公司有个后端路由的项目是用 gulp 作为前端自动化构建工具,最近学习了一下 webpack,深感其强大,一狠心将其改成了 webpack 构建,以下是踩坑实录. gulp 先来说说原来的架构. ...

  8. java并发之原子性

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp17 1.原子性操作: 不能被线程调度机制中断的操作:--对原子性变量的赋值 ...

  9. 安卓两个build.gradle的区别

    作为安卓入门选手,在导入第三方的时候才发现居然有两个build.gradle,我说咋不对啊,原来是导错了(可能是因为我没有看安卓培训的视频吧). 那么就说一下这两个的作用(一个Project的,一个M ...

  10. c#反射执行静态方法

    发射调用System.Environment.Exit(0)示例: System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFi ...