在Servlet中如何添加web框架

开发 后端
在servlet中如何添加web框架呢?通过本文的介绍,实现了将Web请求转到了webwork中的控制器ServletDispatcher。不止是webwork,实现MVC的web框架都需要进行类似的处理来将web请求转入到自己的controller.以便进行进一步的处理。

init()方法

init方法在容器器装入servlet 时执行,servlet容器在实例化后只调用一次init方法,init方法必须在servlet接收到任何请求之前完成。

这个方法通常用来进行一些资源的管理和初始化,如从配置文件读取配置数据,读取初始化参数,初始化缓冲迟等一次性的操作。

getservletConfig()方法

GetservletConfig方法返回一个 servletConfig 对象,该对象用来返回这个servlet的初始化信息和启动参数。返回的是传递到init方法servletConfig。

Service()方法

Service方法是应用程序逻辑的进入点,是Servlet方法的核心,WEB容器调用这个方法来响应进入的请求,只有servlet成功被init()方法初始化后,Service方法才会被调用。

getservletInfo()方法

这个方法返回一个字符串对象,提供有关servlet 的信息,如作者、版本等。

destroy()方法

destroy方法在容器移除Servlet时执行,同样只执行一次。这个方法会在所有的线程的service()方法执行完成或者超时后执行,调用这个方法后,容器不会再调用这个Servlet的方法,也就是说容器不再把请求发送给这个Servlet。这个方法给Servlet释放占用的资源的机会,通常用来执行一些清理任务。

这个接口定义了初始化一个servlet,服务请求和从容器中移除Servlet的方法。他们按照下面的顺序执行:

servlet被实例化后,用init方法进行初始化

◆客户端的任何请求都调用service方法

Servlet被移除服务,调用destroy方法销毁
 
servlet的生存周期如下图:
 
请求分发

请求分发可以让一个servlet把请求分配到另外一个资源,RequestDispatcher接口提供了实现他的机制。可以通过下面两种方式从servletContext中获得一个实现了RequestDispatcher接口的对象:

◆getRequestDispatcher

◆getNamedDispatcher

getRequestDispatcher方法接受一个指向目标资源的URL路径

RequestDispatcher rd = getservletContext().getRequestDispatcher(“/catalog”);

getNamedDispatcher方法接受一个servlet名称参数,这个名称是在部署描述符中﹤servlet-name﹥元素指定的那个名称。

RequestDispatcher rd = getservletContext().getNamedDispatcher (“catalog”);

RequestDispatcher接口有两个方法,允许你在调用的servlet完成初步处理后把请求响应分配到另外一个资源,

forward()方法:

public void forward(servletRequest request, servletReponse reponse) throws SwerletException,IOException

forward方法上让你把请求转发到另外的servlet或者jsp或者html等资源,由这个资源接下来负责响应。如:

  1. RequestDispatcher rd = getservletContext().getRequestDispatcher(“/catalog”);  
  2. rd. forward(request,response); 

include()方法:

public void include (servletRequest request, servletReponse reponse) throws SwerletException,IOException
include方法让你的servlet响应中包含另外一个资源生成内容

  1. RequestDispatcher rd = getservletContext().getRequestDispatcher(“/catalog”);  
  2. rd. include(request,response); 

结合WebWork的具体分析

WebWork是由OpenSymphony组织开发实现MVC模式的J2EE Web框架。在介绍完servlet规范的相关内容后,我们看看WebWork是如何注入到一个servlet中的,假设我们有一个上下文环境为“/WebWorkdDemo”的WEB应用。

部署描述符

在部署描述符中,我们需要进行如下配置:

  1. servlet﹥  
  2. servlet-name﹥webwork﹤/servlet-name﹥  
  3. servlet-class﹥com.opensymphony.webwork.dispatcher.servletDispatcher﹤/servlet-class﹥  
  4. ﹤/servlet﹥  
  5. ……  
  6. servlet-mapping﹥  
  7. servlet-name﹥webwork﹤/servlet-name﹥  
  8. ﹤url-pattern﹥*.action﹤/url-pattern﹥  
  9. ﹤/servlet-mapping﹥  

我们声明了一个名为webworkservlet和*.action到这个servlet的映射,这个servlet就是webwork中的controller,担任MVC框架中非常重要的控制器角色。

映射请求到servlet在XWork的配置文件xwork.xml中有如下片段:

  1. ﹤action name="demo" class=" webworkapp.DemoAction"﹥  
  2.        ﹤result name="success" type="dispatcher"﹥  
  3.               ﹤param name="location"﹥/demo.jsp﹤/param﹥  
  4.        ﹤/result﹥  
  5. ﹤/action﹥  

这样我们由http://localhost:8080/WebWorkDemo/demo.action这个URL向服务器发出请求时,WEB容器首先确定转到哪一个WEB应用程序,容器将请求URL和上下文环境进行匹配后知道将转到/WebWorkdDemo这个WEB应用。

接下来容器会在/WebWorkdDemo这个应用的部署描述符中进行查找处理这个请求的servlet,根据后缀*.action找到名称为webwork这个servlet,这样根据部署描述符,这个请求被映射到webwork中的controller组件com.opensymphony.webwork.dispatcher.servletDispatcher来处理。这个担任控制器组件的servlet在他的service()方法中在根据请求的路径解析出对应的action来进行处理。

通过上面的的处理,实现了将web请求转到了webwork中的控制器servletDispatcher。不止是webwork,实现MVC的web框架都需要进行类似的处理来将web请求转入到自己的controller.以便进行进一步的处理。

servlet生存周期

servletDispatcher这个servlet的存周期可以如下:

在服务器启动的时候,容器首先实例化servletDispatcher

实例化完成后,将调用init()方法,在init方法中执行了以下操作:

◆初始化Velocity引擎

◆检查是否支持配置文件重新载入功能。如果支持,每个request请求都将重新装载xwork.xml配置文件,在开发时非常方便。

◆设置一些文件上传的信息,比如:上传临时目录,上传的***字节等。

每次请求都调用service()方法,在service方法中执行了以下方法

◆通过request请求取得action的命名空间

◆根据servlet请求的Path,解析出要调用该请求的Action的名字(actionName)

◆创建Action上下文(extraContext),遍历HttpservletRequest、HttpSession、servletContext 中的数据,并将其复制到Webwork的Map实现中,至此之后,所有数据操作均在此Map结构中进行,从而将内部结构与servlet API相分离。

◆以上述信息作为参数,调用ActionProxyFactory创建对应的ActionProxy实例。ActionProxyFactory 将根据Xwork 配置文件(xwork.xml)中的设定,创建ActionProxy实例,ActionProxy中包含了Action的配置信息(包括Action名称,对应实现类等等)。

◆执行proxy的execute()方法
容器移除servlet 时执行destroy(),在servletDispatcher这个servlet中并没有重写destroy方法,在移除servlet时,将什么也不做。

请求分发

WebWork提供了多种活灵活视图展现方式,例如还是我们上面在xwork.xml中的配置:

  1. ﹤action name="demo" class=" webworkapp.DemoAction"﹥  
  2.        ﹤result name="success" type="dispatcher"﹥  
  3.               ﹤param name="location"﹥/demo.jsp﹤/param﹥  
  4.        ﹤/result﹥  
  5. ﹤/action﹥  

根据以上配置当DemoAction的返回值为"success"时的处理类型为"dispatcher",当result的type为"dispatcher"时,通过javax.servlet.RequestDispatcher的forward()或include()方法将处理结果和表现层融合后展现给用户
我们可以看看WebWork提供的dispatcher类型Result Type的实现类com.opensymphony .webwork.dispatcher.servletDispatcherResult中的代码片断:

  1. HttpservletRequest request = servletActionContext.getRequest();  
  2.  HttpservletResponse response = servletActionContext.getResponse();  
  3.  RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation);  
  4.  if (dispatcher == null) {  
  5.    response.sendError(404, "result '" + finalLocation + "' not found");     
  6.    return;  
  7.  }  
  8.  if (!response.isCommitted() && (request.getAttribute("javax.servlet.include.servlet_path") == null)) {  
  9.    request.setAttribute("webwork.view_uri", finalLocation);  
  10.    request.setAttribute("webwork.request_uri", request.getRequestURI());  
  11.      
  12.    dispatcher.forward(request, response);  
  13.  } else {  
  14.    dispatcher.include(request, response);  
  15.  }  


servletDispatcherResult类的从servletActionContex中得到HttpservletRequest和HttpservletResponse,然后调用request.getRequestDispatcher(finalLocation)方法得到一个RequestDispatcher实例,如果返回的是null,则输出404页面未找到的错误,否则将调用dispatcher.forward(request, response)或者dispatcher.include(request, response)进行请求分发,将处理结果和表现层融合后展现给用户。

结束语

在Servlet中如何添加web框架通过以上的介绍,我们对web框架是如何注入到Servlet中有了简单的了解,如果想更深入的研究,可以阅读Servlet规范以及一些成熟框架的源码。

【编辑推荐】

  1. 什么是Servlet以及常用Servlet API有哪些
  2. JSP Servlet开发最初那点事
  3. Java Servlet API文档实用说明
  4. 整合Apache中JSP和PHP
  5. Java Servlets(JSP)开发环境
责任编辑:仲衡 来源: IT168
相关推荐

2011-08-02 11:07:00

2010-05-11 16:22:40

2009-07-09 10:03:40

Servlet应用Weblogic环境

2010-04-20 09:14:33

Struts

2023-09-01 07:21:11

2009-07-06 10:25:14

Java Web Se

2009-07-08 15:13:00

获取所session数JSPServlet

2009-07-07 09:41:02

异步ServletAJAX

2019-10-09 11:26:01

JavaXMLSQL

2012-05-11 09:38:00

MVVM Light

2019-08-15 10:56:10

WebServletSpring mvc

2011-06-14 17:51:47

QListview Qt MVC

2018-05-24 13:58:03

LinuxGoogle Web字Font Finder

2009-07-09 10:25:05

Servlet的Web

2009-07-09 16:47:26

Servlet的Web

2009-09-27 09:41:21

Web开发

2023-10-22 20:20:37

FiberGo

2009-05-12 09:54:09

JavaRestCoC

2013-09-02 09:18:59

2023-01-18 17:22:38

YAML注释Linux
点赞
收藏

51CTO技术栈公众号