存档: ‘Struts’ 分类

struts2的FilterDispatcher初始化过程分析

没有评论 2011年2月27日

很久没有看SSH了,今天看看struts2的源码,想知道其框架的实现和运行原理,加深自己对struts2的理解。
分析struts2的初始化过程,需要建立一个工程,然后对其进行调试、跟踪代码的运行过程。
新建一个helloworld工程,可以参照这篇文章:【为Struts 2.0做好准备】,算是为后面的工作做好准备吧。

在web.xml里可以看到struts2的启动入口是org.apache.struts2.dispatcher.FilterDispatcher这个类,该类实现了StrutsStatics, Filter两个接口。Filter是servlet的过滤器接口,有三个抽象方法:init()、doFilter()、destroy()。StrutsStatics借口定义了struts的action context或是其他接口使用的一些常量。

熟悉Filter的话,就会知道FilterDispatcher类的初始化主要是在init()方法里进行的。
继续阅读…

Struts控制器组件

没有评论 2010年4月21日

Struts控制器组件负责接收用户请求、更新模型,以及选择合适的视图组件返回给用户。控制器组件有助于将模型层和视图层分离。Struts控制器组件主要包括:

  1. ActionServlet组件:充当Struts框架的中央控制器
  2. RequestProcessor组件:充当每个子应用模块的请求处理器
  3. Action组件:负责处理一项具体的业务

Struts框架采用ActionServlet和RequestProcessor组件进行集中控制,并采用Action组件来处理单项业务。

Struts的控制器组件主要完成以下任务:

  • 接收用户请求
  • 根据用户请求,调用合适的模型组件来执行相应的业务逻辑
  • 获取业务逻辑执行结果
  • 根据当头状态以及业务逻辑招待结果,选择合适的视图组件返回给用户

1ActionServlet类

org.apache.struts.action.ActionServlet类是Struts框架的核心控制器组件,所有的用户请求都先由ActionServlet来处理,然后再由ActionServlet把请求转发给其他组件。Struts框架只允许在一个应用中配置一个ActionServlet类的一个实例,这个ActionServlet实例可以同时响应多个用户请求。

1>.Struts框架初始化过程

Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类。在两种情况下,Servlet容器都会在ActionServlet被加载后立即执行它的init()方法,以下是init()方法完成的初始化流程

(1)       调用initInternal()方法,初始化Struts框架内在的消息资源,如与系统日志相关的通知、警告和错误消息

(2)       调用initOther()方法,从Web.xml文件中加载ActionServlet的初始化参数,如config参数

(3)       调用initServlet()方法,从Web.xml文件中加载ActionServlet的URL映射信息

(4)       调用initModuleConfig()方法,加载并解析默认子应用模块的Struts配置文件;创建ModuleConfig对象,把它存储在ServletContext中

(5)       调用initModuleMessageResources()方法,加载并初始化默认子应用模块的消息资源;创建MessageResource对象,把它存储在ServletContext中

(6)       调用itModuleDataSources()方法,加载并初始化默认子应用模块的数据源。

(7)       调用itModulePlugins()方法,加载并初始化默认子应用模块的所有插件。

(8)       当默认子应用模块被成功初始化后,如果还包括其他子应用模块,将重复流程(4)-(7),分别对其他子应用模块进行初始化。

2>.ActionServlet的process()方法

当ActionServlet实例接收到Http请求后,在doGet()或doPost()方法中都会调用process()方法来处理请求。以下是ActionServlet的process()方法的源代码:

protected void process(HttpServletRequest request,HttpServletResponse response)

throws IOException, ServletException {

RequestUtils.selectModule(request, getServletContext());

getRequestProcessor(getModuleConfig(request)).process (request, response);

}

在process()方法,首先调用org.apache.struts.util.ModuleUtils类的selectModule(),这个方法负责处理当前请求的子应用模块,然后把子应用模块相关的ModuleConfig和MessageResource对象存储到request范围中,第二步完成实际的预处理请求操作。

Action类

Action类是用户请求和业务逻辑之间的桥梁。每个Action充当客户的一项业务代理。在RequestProcessor类预处理请求时,在创建了Action的实例后,就调用自身的processActionPerform()方法,该方法再调用Action类execute()方法。

Action的execute()方法调用模型的业务方法,完成用户请求的业务逻辑。然后根据执行结果把请求转发给其他合适的WEB组件。

ActionForward类

Action类的execute()方法返回一个ActionForward对象。ActionForward对象代表了Web资源资源的逻辑抽象,这里的Web资源可是JSP页、Java Servlet或Action。从execute()方法中返回了ActionForward对象有两种方法

  • 在execute()方法中动态创建一个ActionForward实例: Return new ActionForward(“Failure”,”/failure.jsp”);
  • 在Struts配置文件中配置<forward>元素,如return mapping.findForward(“Failure”);

Struts2使用validator框架进行数据校验

没有评论 2010年3月30日

《Struts2使用validate方法验证数据》一文中学到了如何用validate方法对数据进行校验,这种方法虽然不错,但需要大量重写的validate方法。由于Struts 2的校验框架实际上是基于XWork的validator框架,所以我们可以用XWork的validator框架对struts2的进行数据校验,减少代码的开发。
使用XWork的validator框架进行数据校验,首先要写一个配置文件,该文件的命名应该遵守如下规则:
ActionName-validation.xml:其中ActionName就是需要校验的Action的类名,且该文件应该与Action类的class文件位于同一个路径下。增加该检验规则文件后,Action不必重写validate()方法也可完成输入校验。 继续阅读…

Struts2使用validate方法验证数据

没有评论 2010年3月29日

在Struts2中最简单的验证数据的方法是使用validate。从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或 Field错误,Struts2会返回“input”,如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。 继续阅读…

Struts 2配置文件

没有评论 2010年3月26日

Struts 2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。除此之外,Struts 2框架还包含一个struts.properties文件,该文件定义了Struts 2框架的大量属性,开发者可以通过改变这些属性来满足应用的需求。 继续阅读…

Struts 2.0中的Action

没有评论 2009年11月29日

itman和Struts 1.x一样,Struts 2.0中的Action类是其核心内容,只是两者在Action模型上有很大的区别。

Struts 1.x Stuts 2.0
接口 必须继承org.apache.struts.action.Action或者其子类 无须继承任何类型或实现任何接口
表单数据 表单数据封装在FormBean中 表单数据包含在Action中,通过Getter和Setter获取

理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承 com.opensymphony.xwork2.ActionSupport类,并重载(Override)此类里的String execute()方法。 继续阅读…