Servlet的请求和响应

在JavaWeb网站开发中,servlet起到了处理客户请求的作用。

******Servlet的真正任务是处理客户请求,即得到一个客户的请求,再发回一个响应。因此请求要携带一些重要的数据,使Servlet能够找到这个请求,响应也携带着一些信息,使浏览器可以显示页面,servlet代码需要知道怎么发送这些信息。

把请求和响应作为参数传递给doGet或doPost方法(必须覆盖至少一个服务方法),请求和响应是一切一切的关键,也是service()的参数。HttpServletRequest和HttpServletResponse接口由容器来实现,这些类不在API中,它们由开发商实现。


*****Servlet技术模型:

1明确使用HttpServlet的哪个方法(doGet(),doPost()等)来对应客户请求中的HTTP方法(GET,POST,HEAD)。

2使用HttpServletRequest接口,编写代码从请求获取HTML表单参数,获取HTTP请求首部信息,或者从请求获取cookie。

3使用HttpServletResponse接口,编写代码设置HTTP响应首部,设置响应等内容类型,或者为响应获得一个文本流、二进制流,或者把一个HTTP请求重定向到另一个URL,再或者向响应增加cookie。

4描述servlet生命周期的作用和事件序列:(1).Servlet类加载;(2).servlet实例化(构造函数);(3).调用init()方法;(4).调用service()方法;(5).调用destory()方法。


*****servlet受容器的控制:容器操控着servlet的一生,容器会创建请求(HttpServletRequest)和响应对象,会为servlet创建或者分配一个线程并调用servlet的service()方法(传递请求和响应对象的引用作为参数)。service()方法根据客户发出的HTTP方法来确定调用哪个servlet方法(doGet还是doPost)。之后servlet使用响应对象将响应写至客户,响应通过容器传回客户。service()方法结束,线程撤消或者放回到容器管理的一个线程池。至此,请求与响应对象引用已经出了作用域,可以垃圾回收,完成使命。


****service初始化:servlet的生命周期很简单:只有一个主要的状态——初始化。如果没有初始化,则要么正在初始化(运行其构造函数或init()方法)、正在撤销(运行其destroy()方法),要么就是还不存在。(///难道就不使用吗????)

大致为:web容器加载servlet类——初始化servlet(无参构造函数运行——init()方法运行)——service()(servlet一生主要在这里度过,处理客户请求)——destory()


****servlet的继承关系:servlet接口——genericServlet类(实现了大部分servlet方法)——HttpServlet类(实现service方法来反映servlet的HTTP特性)——MyServlet类(大多数servlet行为都是由超类方法处理,我们只需要覆盖所需的HTTP方法)


*****servlet生命因周期中的三大重要时刻及对应的方法。

1.init()。servlet实例创建后,并在servlet能为客户请求提供服务之前,容器对servlet调用init()。init()方法在对servlet初始化的时候可以对其

2.service()。第一个客户请求到来时,容器会开始一个新线程并调用servlet的service()方法。service()方法会查看请求,确定调用servlet的哪个方法(doGet或者doPost)

3.doGet或doPost方法。在这里写代码,告诉web应用你先要做什么。(如果没有覆盖doPost方法,就是在告诉容器这个Servlet不支持HTTPPOST请求。)


****每个请求都在一个单独的线程中运行

servlet只有一个实例!!!容器运行多个线程来处理一个servlet的多个请求。每个客户为每个请求得到一个单独的线程,对于每一个客户请求会生成一对新的请求和响应对象。

(注意是每个请求一个线程,而不是每个客户一个线程,事实上,容器并不关心是谁做出的请求。)


****加载和初始化

在servlet没有完全初始化之前,绝对不能运行service()方法。

运行构造函数---对象---通过初始化---servlet

容器为servlet对象建立一个servletConfig对象,调用init(),使之成为一个真正的servlet。


*****ServletConfig对象

1每个servlet都有一个ServletConfig对象。

2.用于向servlet传递部署时信息(如数据库信息),而又不想把这个信息硬编码到servlet中。

3.用于访问ServletContext。

4.参数在部署描述文件中配置。

5。作用:容器初始化一个servlet时,会为这个servlet建一个唯一的ServletConfig。容器从DD读出Servlet初始化参数,并把这些参数交给ServletConfig,然后把ServletConfig传递给servlet的init(ServletConfig config)方法。也就是说容器只有在创建servlet实例时才会读DD文件中的init-param,并且在servlet一生中只读一次。

6.一旦servlet部署并运行,ServletConfig参数就不能再改变了。想要改变,必须重新部署servlet。


******GET和POST的区别

1.GET参数(查询串)放到请求行中,POST中参数放到消息体(或称负载)中

2.POST请求安全性较高。

3.GET请求可建立书签。

4.GET只是简单的获取服务器上的资源,POST不仅可以这样,还可以修改服务器上的某些东西。

5.如果在表单中没有指出methord="POST",就会默认为HTTPGET请求,此时当servlet中为doPost()方法时报错。



****servlet中doPost()方法向HttpServletRequest request取某个参数的值,request.getParameter("color");当单个参数有多个值时,要使用返回一个数组的getParameterValues()。

除了参数还能从请求对象中获得什么呢?


******HttpServletRequest接口中的方法

1.request.getMethod() :请求的HTTP方法

2.request.getHeader("User-Agent"):客户的平台和浏览器信息

3.request.getSession():与客户相关的会话

4.request.getCookies():与请求相关的cookie

5.request.getInputStream():请求的输入流(当POST请求中的消息体的参数的值很大时,请求体包含要处理文本或二进制内容,在这种情况下,可使用getReader或getInputStream()方法。这些流只包含HTTP请求的体而不包含首部)

6.getHeader()和getIntHeader();getQueryString();getContextPath()。

7.getRemotePort()是指得到客户的端口;getServletPort()是指请求原来发送到哪个端口;getLocalPort()是指请求最后发送到哪个端口。ps:尽管请求要发送到一个端口(服务器所监听的端口),但是服务器会为每个线程找一个不同的本地端口,这样一来,一个应用就能同时处理多个客户的请求了。


*****响应:大多数情况下,使用响应只是为了向客户发回数据。响应要返回给客户,这是浏览器的到、解析并呈现给用户的东西。你会从响应对象得到一个输出流(一般是一个Writer),并使用这个流写出HTML(或其它类型内容),返回给客户。


***常用MIME类型:text/html(文字); video/quicktime(视频); image/jpeg (图片); application/jar    ;   application/java ;  application/pdf; application/x-zip;

小公式哈哈:response.setcontentType("MIME类型");

注意:总是先调用setContentType(),根据MIME类型再调用合适的获得输出流的方法(getWrite()或者getOutputStream())。


****输出的两个方法

1.字符:PrintWriter :专门设计用于处理字符数据

         例如:PrintWriter writer=response.getWriter();

                    writer.println("some text and HTML");

2.字节:OutputStream: 写其他任何内容

   例如:ServletOutputStream out=response.getOutputStream();

              out.write(aByteArray);


***重定向和请求分派

1.重定向:servlet在响应上调用sendRedirect(aString),它的工作就完成了。(你的servlet中,必须做一个决定,要么处理请求,要么调用sendRedirect()让别人来处理请求,一旦提交,就不能改变,这种思想同样适用于设置首部,cookie,状态码,内容类型等)。请求重定向只是告诉浏览器去访问另一个URL。

2.请求分派:在服务器端做工作。

3.区别:重定向=客户,请求分派=服务器。重定向后会看到新的URL,请求分派时用户不知道是别人接管了工作,因此浏览器的地址栏里URL没有任何变化。




遇到的问题:

1:Servlet代码如何找到请求?

答:通过HttpServletRequest接口中的get...方法。

2属性和参数的区别

3.我们是否可以将URL当成一个请求?

4.响应输出时用输出流还是JSP?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值