第四章 servlet模型

Java servlet技术一般被用来处理web应用的业务逻辑。虽然servlet也可以包含表现逻辑。

 

service()方法解析请求,找出那个请求正被使用。根据不同的HTTP方法,调用servlet中不同的doXXX()方法。

如果你重写类service()方法,你将失去HttpServlet提供的功能,doXXX()方法将不会被自动调用,在你的实现中,你将不得不决定在request中使用的HTTP方法,然后你得自己调用合适的doXXX方法。

 

注意:大部分重要的Servlet API组件都是接口,包括HttpServletRequestHttpServletResponseservlet容器提供这些接口的实现。所以当我们说一个HttpServletRequest对象时,我们的意思是一个实现了HttpServletREquest接口的类的对象。这个类的实际的名字并不重要,实际上开发员是不知道的。

 

request

我们一直都使用HttpServletRequest,但是很重要的一点需要知道的就是,哪些方法是在HttpServletRequest中实现的,哪些方法是继承自ServletRequest的。

 

不同于取请求的参数,headerHTTP协议特有的。因此处理header的方法属于HttpServletRequest,而并不属于ServletRequest

GetHeader()getHeaderValues()getHeaderName()

 

response

我们使用headers传递关于响应的额外的信息,通过设置键值对。例如我们使用header告诉浏览器每五分钟就重载一次页面。

 

当响应头已经被发送到浏览器后,不能使用sendRedirect()方法。否则抛出异常,如以下是错误的:

out.flush();

response.sendRedirect("http://www.cnn.com");

另一需要注意的是,使用sendRedirect()时,只有第一个资源到达以后,才会重定向至第二个资源。这就是说,sendRedirect()对浏览器并不是透明的。换句话说,servlet发送一个信息告诉浏览器到别的地方取获取资源。

 

servlet能处理请求之前,servlet容易要作一些事情:

第一步是装载和实例化servlet 类。这时,servlet被认为处于被装载状态。当我们启动servlet容器的时候,他会寻找一系列配置文件,也叫部署描述器。他描述了所有web应用。每一个web应用都有他自己的部署描述器web.xml。它包含了要使用的每个servlet的入口。一个入口标识了servlet的名字和这个servlet的类的名字。servlet容器产生一个给定servlet类的实例,通过调用方法Class.forName(“className”).newInstance()。然而,需要一个无参的构造函数去做。此时,servlet被装载了。

   

第二步是初始化servlet实例。一旦servlet被初始化了,容器就能在有请求到来时调用service()方法。怎样才能初始化一些数据呢?一旦servlet容器产生了一个servlet实例,他就会为这个新的实例调用init(ServletConfig)方法。ServletConfig被包含了所有我们在部署描述器中标识的初始化参数。当调用完init()方法后,servlet就被初始化了,且只保证初始化一次。

 

第三步是容器调用destory()方法。这个方法能清理资源。例如在init()中需要的数据库连接。一旦这个方法被调用,这个servlet实例就不能再被使用了。servlet容器也不再会对用这个实例的service()方法。在执行这个方法之前,容器会等待所有剩余线程执行完servletservice()方法后再完成这个方法的调用。

最后当servlet容器关闭,他就要卸载这个servlet实例。P73有图。

 

 

 

the deployment decriptor contains the description of all the dynamic components of the web application.

 

Quizlet

Q: Which method of TestServlet will be called when a user clicks on the

following URL?

<a href="/servlet/TestServlet" method="POST">Test URL</a>

A: The method="POST" attribute-value pair does not make sense in the

<a href> tag. Clicking on a hyperlink always sends a GET request and

thus, the doGet() method of the servlet will be called.

 

 

servlet规则里定义了一个<load-on-startup>元素,web.xml文件中用来告诉servlet容器在启动的时候就装载和初始化这个servlet.这叫preloading(预装载)或者preinitializing(预初始化).

 

ServletConfig的方法:(由前可知,ServletConfig是关于servlet的初始化的,那么获得初始化的参数当然就是使用这个类的方法来获得。但是,由于初始化参数是在部署描述器中设置的,所有ServletConfig只能获得参数值,但却不能修改或增加参数! ――笔者注)

GetInitParameter()getInitParameterNames()getServletContext()getServletName()

:参数写在<servlet>之内.

 

ServletContext:我们可以认为ServletContext接口是servlet观看它的环境的窗口。先介绍两个方法:

getResource(Srting path):返回个一个URL对象。该路径是相对于文档根目录的相对路径。

getResourceAsStream(String path):等价于getResource(path).openStream()

 

一个银行的例子,如果一个用户没有登录,则AccountServlet应该传送(forward)一个请求到LoginServlet。同样的,一旦用户输入了他的账号和密码,LoginServlet应该传送(forward)一个请求到AccountServlet

javax.servlet.RequestDispatcher接口允许我们做到这点。

void forward(ServletRequest request,ServletResponse response):这个方法允许一个servlet处理部分的请求,然后传送(forward)一个请求给另外一个servlet去产生最终的响应(response)。它还可以在服务器端从一个主动资源(active resource)(一个servlet或者是一个JSP页面)传送一个请求到另一个资源(servlet,JSP文件或者是HTML文件)。这个方法只有在响应没有提交的时候被调用。另外,它会抛出一个IllegalStateException异常。

 

注:RequestDispatcher.forward()完全是在服务器端处理的,对客户浏览器是透明,,HttpServletRequest.sendRequest()是传输到客户浏览器处理的。这是两者之间重要的区别。

 

ServletRequestServletContext都有getRequestDispatcher()方法,但是两者之间有一个重要的区别:你允许传递一个相对路径给ServletRequestgetRequestDispatcher()方法,但是ServletContext的却不能。例如:rquest.getRequestDispatcher("../html/copyright.html")是有效的。而ServletContextgetRequestDispatcher()方法只能以"/"开头。这是有意义的,因为ServletRequest拥有一个当前请求的路径去获得相对路径,而ServletContext没有。

 

RequestDispatcher的实例调用forward(),里面没有参数,怎么知道要传送到哪里???  哈哈!!!在你获得一个RequestDispatcher实例的时候,是用RequestDispatcher rd=request.getRequestDispatcher("要跳转到的servletJSP或者HTML的相对路径!!");或者RequestDispathcer rd= servletContext.getRequestDispathcer("要跳转到的servletJSP或者HTML的绝对路径!!从工程文件名开始算起");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值