Servlet、request、response总结

1、servlet概述

Servlet是由SUN公司提供的一门动态Web资源开发技术

静态Web资源:不同的人,在不同的条件下访问后看到的是相同的效果,这样的资源叫做 
静态Web资源(html、css、js等) 动态Web资源:在不同的访问条件下看到的是不同的效果,这样的资源叫做动态Web资源 (Servlet、jsp、.NETPHP等)

Servlet本质上是一段Java程序,不同的是,Servlet无法独立运行,需要将Servlet程序放在服务器中,由服务器调用才可以执行。
Servlet: 服务器端的Java程序. Servlet是运行在服务器端的Java程序,其作用是什么?
其作用是对服务器接收过来的请求进行处理(作用为处理请求)
在这里插入图片描述

2、开发servlet程序

2.1步骤:
1、写一个类,实现一个Servlet接口或者继承Servlet接口的子类(GenericServlet/HttpServlet),并实现其中的方法
Servlet接口
|-- GenericServlet类(抽象类)
|-- HttpServlet类
2、在web应用的web.xml文件中配置Servlet程序对外访问的路径。
Eclipse在创建一个Servlet时,会在web.xml文件中生成Servlet配置,所以不需要我们手动配置
3、使用Eclipse创建Web项目
在这里插入图片描述
以上是Web项目在工程视图(Project)和包视图(package)下结构,推荐使用包视
图!
创建一个Web工程: 在左侧窗口中, 点击鼠标右键 —> New —>
Dynamic Web Project。

在这里插入图片描述
接着会弹出如下窗口:
在这里插入图片描述
注意:
(1) 3.0版本不会创建web.xml文件,
并且创建Servlet时也不会在web.xml文件中生成Servlet相关的配置信息, 记得改为
2.5。(2) Target runtime选项中如果没有可选的服务器,可点击右侧的"New Runtime…"进行配置。
Eclipse中创建的Web工程的目录结构:
在这里插入图片描述
(1) day09: 工程名称/项目名称
(2) src: 源码目录, 创建的java源文件、配置文件(properties、xml文件等)都 可以放在src源码目录下
(3) build/classes: 编译文件的输出目录, src源码目录中的文件编译后会输出到 classes目录下。 其中的classes目录在发布时会放在WEB-INF目录下,随着项目一起发布到服务器中
(4) WebContent: 就是Web应用的目录,其中可以存放 html、css、js、jsp、图片 以及编译后的class文件、jar包、web.xml文件等. 将来发布项目到服务器,其实就是 将WebContent中的所有内容一起发布到服务器中。
(5) WebContent/WEB-INF/lib: 用于存放当前项目所依赖的jar包。比如要访问 mysql数据库,需要导入mysql驱动包,直接将jar包拷贝到lib目录下即可!(也不用 再去做 build path --> add to build path)

2.2创建Servlet
在这里插入图片描述

通过Eclipse创建Servlet,默认继承HttpServlet。由于HttpServlet也是Servlet接口的子类,让HelloServlet继承HttpServlet,相当于间接实现了Servlet接口。
继承HttpServlet类,默认会覆盖doGet方法和doPost方法,两个方法的作用为:

  • doGet方法:当浏览器发送请求的方式为GET提交时, 将会调用doGet方法来处理请求
  • doPost方法:当浏览器发送请求的方式为POST提交时, 将会调用doPost方法来处理请求
    提示:如果当GET提交和POST提交处理代码相同时,可以将代码写在其中一个方法里(例如写在doGet中),并在另外一个方法(例如doPost)中调这个方法。这样一来,不管是GET提交还是POST提交,最终doGet方法都会执行,都会对请求进行处理!!

2.3 Servlet在web.xml中的配置
在通过Eclipse创建Servlet时,会自动在web.xml文件中进行Servlet相关信息的配置
(注意:如果是复制Servlet类文件,但配置信息不会跟着复制,需要自己手动添加配置,否则复制的Servlet将无法访问!)
关于web.xml的配置信息:
a) Eclipse每创建一个Servlet,就会在web.xml文件中添加两个标签:和 标签(可以将这两个标签看成一个组的标签)
b) 和标签内都会有一个标签,标签的内容可以更改,但要求更改后的这两个标签的内容也必须一致。
c) 标签用于配置Servlet类的全限定类名(即包名+类名)需要注意:如果在创建Servlet后修改了Servlet类的名称,这个地方也要一起更改,否则将会出现"ClassNotFoundException" 即类找不到异常
d) 标签用于配置浏览器以什么路径访问当前Servlet(即Servlet对外访问的路径),默认的路径是:/类名

2.4Servlet3.0的特性
Servlet3.0规范是JavaEE6.0的子规范,其要求运行环境最低是JDK6.0, tomcat7.0。若要使用Servlet3.0规范,则需要在创建动态Web项目时就要指定。具体用法是,在Eclipse中创建动态Web工程时,指定创建的“动态Web模块版本”为3.0或以
上版本,此时创建的Web工程中默认是没有web.xml文件的。
思考:如果没有web.xml文件,那么如何配置Servlet的访问路径呢?
通过注解方式进行配置Servlet访问路径。
1、 @WebServlet(“/HelloServlet”) 这个注解的作用就是配置当前Servlet的访问路径为 /HelloServlet ,完善doGet方法中的代码,直接运行Servlet。
2、@WebServlet注解中可以配置多个访问路径
在@WebServlet注解中配置的访问路径,其实前面省略了 value 属性,完整写法为:
@WebServlet(value=“/HelloServlet”) ,只不过value可以省略
由于在源码中 value 属性其本质是一个字符串数组,因此可以为value属性赋值为一个数组直接量。例如@WebServlet(value={}),@WebServlet(value={“/HelloServlet”, “/hello01”, “/hello02”})
3、可以将value属性替换为urlPattern属性
例如:@WebServlet(urlPatterns={“/HelloServlet”, “/hello01”, “/hello02”})

3、request和response介绍

request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。
当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的 service方法来处理请求。在调用service方法之前会创建出request和response对象。
其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。

4、request对象

4.1获取请求参数
问题1:什么是请求参数?
所谓的请求参数,就是浏览器发送给服务器的数据(不区分请求方式),例如:通过表单向服务器提交的用户名、密码等,或者在超链接后面通过问号提交的数据,都是请求参数。
http://localhost/day10/TestParam?user=zhangsan&pwd=123&like=篮球 &like=足球
问题2:如何获取请求参数?

(1)request.getParameter(String paramName) //-- 根据请求参数的名字获取对应的参数值,返回值是一个字符串; //-- 如果一个参数有多个值,该方法只会返回第一个值。 //-- 如果获取的是一个不存在的参数,返回值为null (2)request.getParameterValues(String paramName) //-- 根据请求参数的名字获取该名字对应的所有参数值组成的数组,返回值是一个字符 串数组,其中包含了这个参数名对应的所有参数值 //-- 如果获取的是一个不存在的参数,返回值为null

问题3:如何解决获取请求参数时的中文乱码问题?
在获取中文的请求参数时,可能会出现乱码问题(和请求方式、tomcat服务器版
本有关),具体可以分为以下三种情况:
(1)如果请求是GET提交,并且tomcat是8.0及以后的版本,GET提交的中文参数,在获取时不会出现乱码问题!(8.0以后的tomcat包括8.0在获取GET提交的中文参数时,已经处理中文乱码问题。)
(2)如果请求是POST提交,不管是哪个版本的tomcat服务器,在获取中文参数时,都会出现乱码问题。因为tomcat底层在接收POST提交的参数时,默认会使用iso8859-1编码接收,而这个编码中没有中文字符,所以在接收中文参数时,一定会出现中文乱码问题!
解决方法是:通知服务器在接收POST提交的参数时,使用utf-8编码来接收!

request.setCharacterEncoding("utf-8");

注意:这行代码不会影响GET提交,只对POST提交有效!
这行代码要放在任何获取参数的代码之前执行!
(3)如果请求是GET提交,并且tomcat是7.0及以前的版本,GET提交的中文参数,在获取时会出现乱码问题!
解决方法:在[tomcat安装目录]/ conf/server.xml文件的(修改端口的)Connector标签上,添加一个 URIEncoding=“utf-8” 属性,如下:

<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />

同时在[Eclipse]/Servers/[当前tomcat服务器对应的配置目录]/server.xml文件中,在Connector标签上,添加一个 URIEncoding=“utf-8” 属性,同上!

4.2实现请求转发
请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源(A)时,该资源将请求转交给另外一个资源(B)进行处理并且由资源B做出响应的过程,就叫做请求转发。
请求转发和重定向都是资源的跳转方式,但是跳转的过程有所不同。
在这里插入图片描述
请求转发的特点:
(1)转发是一次请求,一次响应
(2)请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器–访问–> A --转 发–> B,地址栏地址始终指向A的地址)
(3)请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A–转 发–>B,A和B必须属于同一个Web应用!)
(4)在转发时,可以带数据到目的地(比如,从A转发到B,可以从A带数据给B,需要配合域 对象才可以)
请求转发实现:

request.getRequestDispatcher(url地址/转发到资源的地址).forward(req, res);

代码示例:

//从当前Servlet转发到 index.jsp(http://localhost/day10/index.jsp) 
//request.getRequestDispatcher("/index.jsp").forward(request, response); 
request.getRequestDispatcher("index.jsp").forward(request, response);

. 作为域对象使用
request在实现转发时,通过request. setAttribute 方法和request. getAttribute 方法带数据到目的地时,就是通过request对象中的map集合带数据,这个request对象上的map集合以及request对象所在的范围即称之为是一个
域对象。
在request对象上提供了往域对象(map)中存数据的方法以及取数据的方法:

request.setAttribute(String attrName, Object attrValue);
-- 往request域中存入一个域属性,属性名(key)只能是字符串,属性值(value)可 以是任意类型。
 request.getAttribute(String attrName);
-- 根据属性名(key)获取对应的属性值(value)。返回的是一个Object类型的对象。

request域对象所具备的三大特征:
生命周期:在服务器调用Servlet程序的service方法之前,会创建代表请求的request对象,在请求处理完,响应结束时,会销毁request对象。
作用范围:在一次请求范围内,可以通过request域带数据到目的地。
主要功能:和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地)

扩展内容:request对象的 getParameter 和 getAttribute 方法有什么区别?
getParameter()方法是用于获取(从浏览器发送过来的)请求参数的,请求参数不能设置,只能是浏览器发送给服务器,在服务器端再通过getParameter方法获取请求中的参数getAttribute()方法是用于从request域中获取域属性时用的,域属性得先存入到域中(即得先通过setAttribute方法将数据存入request域中),再通过getAttribute()方法从域中获取。

5、response对象

response是代表HTTP响应信息的对象。
PrintWriter out = response.getWriter();
由于服务器在通过response获取的流发送数据时,默认使用iso8859-1编码,而这个编码中没有中文字符,所以在通过response获取的流发送中文数据时,会出现乱码问题
解决方法是:在响应数据之前,通知服务器使用utf-8发送数据。

/* 通知服务器在响应数据时,使用utf-8编码 * 也能通知浏览器使用utf-8接收服务器发送的数据 */ 
response.setContentType( "text/html;charset=utf-8" ); 
PrintWriter out = response.getWriter(); 
out.write( "你好" );

5.1 实现重定向
当浏览器向服务器发请求访问某一个资源A,资源A在响应时通知浏览器需要再进一步请求才能获取到对应的资源,浏览器再次发请求访问服务器中的资源B,最终由资源B响应浏览器要获取的资源,这个过程叫做重定向。
在这里插入图片描述
重定向的特点:
(1)重定向是两次请求、两次响应
(2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发 起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
(3)重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两 次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通 过request带数据到目的地。)
(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务 器。(进行跳转的两个资源之间没有限制)
实现代码:

response.sendRedirect(所重定向到资源的URL地址);

在这里插入图片描述
代码示例:

//测试1: 从当前Servlet(day10/TestRedirect)重定向到day10/index.jsp
 // http://localhost/day10/TestRedirect 
 // http://localhost/day10/index.jsp 
 response.sendRedirect( "http://localhost/day10/index.jsp" ); 
response.sendRedirect( "/day10/index.jsp" ); 
response.sendRedirect( "/index.jsp" ); //错误路径 
response.sendRedirect( "index.jsp" ); //正确路径 
//测试2: 从当前Servlet重定向到day09/index.jsp 
response.sendRedirect( "http://localhost/day09/index.jsp" ); 
//测试3: 从当前Servlet重定向到百度首页 
response.sendRedirect( "http://www.baidu.com" );

总结-1:请求转发(forward)和重定向(redirect)的区别?
(1)请求转发是一次请求,一次响应; 而重定向是两次请求两次响应
(2)请求转发前后地址栏地址不会发生变化; 而重定向前后地址栏地址会发生变化
(3)请求转发前后的request对象是同一个,可以配合request域对象带数据到目的地; 而重定向前后的request对象不是同一个, 不能结合request域对象在重定向前后带数 据.
(4)请求转发要求两个资源必须属于同一个Web应用; 而进行重定向的两个资源可以是同 一个Web应用,也可以不是同一个Web应用,甚至可以是来自于不同的主机或服务器.
总结-
2:什么时候用请求转发(forward)?什么时候用重定向(redirect)?
(1)如果希望跳转前后地址栏地址不会发生变化, 只能使用转发; 如果希望跳转前后地址 栏地址会发生变化, 只能使用重定向
(2)如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发
(3)如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响 应,可以减少访问服务器的次数,降低服务器的压力)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值