Struts——三大组件(一)ActionServlet

ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类,Struts的启动一般从加载ActionServlet开始,因此它在MVC模型中扮演中央控制器的角色,负责接受用户请求,返回给用户合适的视图组件.控制器将模型层和视图层分开,这样分离,可以为同一个模型开发出不同的视图.

下面是Struts的三大主要组件:

ActionServlet组件:充当Struts框架的中央控制器;Struts应用中只存在ActionServlet的一个实例。

RequestProcessor组件:充当每个子应用模块的请求处理器。

Action组件:真正来处理一项具体的业务.。

ActionServlet

Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类.在这两种情况下,servlet容器都会在ActionServlet容器被加载后立即执行它的init()方法,这可以保证ActionServlet处理用户请求时已经被初始化.

Java代码——init()

public void init() throws ServletException {
		final String configPrefix = "config/";
		final int configPrefixLength = configPrefix.length() - 1;
		try {
			// 调用initInternal()方法,初始化Struts框架内的消息资源,如与系统日志相关的通知,警告,和错误消息.
			initInternal();
			// 调用ininOther()方法,从web.xml文件中加载ActionServlet的初始化参数,如config参数
			initOther();
			// 调用initServlet()方法,从web.xml文件中加载ActionServlet的URL映射信息.
			// 同时还会注册web.xml文件和Struts配置文件所使用的DTD文件,
			// 这些DTD文件用户验证web.xml和struts配置文件的语法.其中方法里的 digester类负责解析web.xml,
			// 对字符串servletMapping属性进行初始化
			initServlet();
			initChain();
			// 把ActionServlet实例放到ServletContext里
			getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
			// 初始化一个factory,用于创建moduleConfig
			initModuleConfigFactory();
			// 加载并解析默认struts配置文件/WEB-INF/struts-config.xml,同时创建MoudleConfig实例,放到ServletContext中
			ModuleConfig moduleConfig = initModuleConfig("", config);
			// 加载并初始化默认子应用模块的消息资源;讲解MessageResources对象,把它存储在ServletContext中.
			initModuleMessageResources(moduleConfig);
			// 加载并初始化默认子应用的所有插件
			initModulePlugIns(moduleConfig);
			initModuleFormBeans(moduleConfig);
			initModuleForwards(moduleConfig);
			initModuleExceptionConfigs(moduleConfig);
			initModuleActions(moduleConfig);
			// 冻结moduleConfig(在方法返回之前不能修改它,否则将抛出异常)
			moduleConfig.freeze();
			Enumeration names = getServletConfig().getInitParameterNames();
			while (names.hasMoreElements()) {
				String name = (String) names.nextElement();
				if (!name.startsWith(configPrefix)) {
					continue;
				}
				String prefix = name.substring(configPrefixLength);
				moduleConfig = initModuleConfig(prefix, getServletConfig()
						.getInitParameter(name));
				initModuleMessageResources(moduleConfig);
				initModulePlugIns(moduleConfig);
				initModuleFormBeans(moduleConfig);
				initModuleForwards(moduleConfig);
				initModuleExceptionConfigs(moduleConfig);
				initModuleActions(moduleConfig);
				moduleConfig.freeze();
			}
			// 将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中
			this.initModulePrefixes(this.getServletContext());
			// 释放创建的用于读取配置文件的digester实例,释放内存
			this.destroyConfigDigester();
		} catch (UnavailableException ex) {
			throw ex;
		} catch (Throwable t) {
			// The follow error message is not retrieved from internal message
			// resources as they may not have been able to have been
			// initialized
			log.error(
					"Unable to initialize Struts ActionServlet due to an "
							+ "unexpected exception or error thrown, so marking the "
							+ "servlet as unavailable.  Most likely, this is due to an "
							+ "incorrect or missing library dependency.", t);
			throw new UnavailableException(t.getMessage());
		}
	}

—————————————————————————————————————————————————

当ActionServlet接受到HTTP请求后,在doget()或doPost()方法中都会调用process()方法来处理请求.

Java代码——process()

protected void process(HttpServletRequest request,
			HttpServletResponse response) throws IOException, ServletException {
		// 根据request里的信息从servletContext里找到相应的子模块ModuleConfig,
		// 和它下面的MessageResources,并放到request里,使其他组件可以方便的供request里取得应用配置信息和消息资源.
		ModuleUtils.getInstance().selectModule(request, getServletContext());
		// 取出MoudleConfig实例config
		ModuleConfig config = getModuleConfig(request);
		// 根据config里这个子模块的信息,从servletcontext里,取出这个子模块的RequestProcessor实例
		RequestProcessor processor = getProcessorForModule(config);
		// 如果processor实例为空,就新建一个.同时放到servletcontext里.
		if (processor == null) {
			processor = getRequestProcessor(config);
		}
		// 调用RequestProcessor的process方法处理,
		processor.process(request, response);
	}

ActionServlet.process()看起来不复杂,但是他调用的RequestProcessor.process()方法比较复杂(下篇博客会介绍)。

扩展ActionServlet类

从Struts1.1开始,为减轻ActionServlet的负担,多数功能已经移到RequestProcessor类中,所以基本不用扩展ActionServlet类。

如果需要创建自己的ActionServlet,则可以创建一个它的子类.覆盖init()方法(或其他方法),可以写一些自己的操作,但要先调用super.init();

定义如下的类:

package sample;
public classExtendedActionServlet extends ActionServlet {
        public void init() throwsServletException {
               super.init();
               //do some operations
               ……………
        }
}  

扩展完类后,还应该在web.xml文件中如下配置:

<servlet>
       <servlet-name>sample</servlet-name>
       <servlet-class>sample.ExtendedActionServlet</servlet-class>
</servlet>  

<servlet-mapping>
      <servlet-name>sample</servlet-name>
      <url-pattern>/action/*<url-pattern>  

上面的/action/*表示负责处理所有以/action为前缀的URL,后面的/表示转义

总结

Web服务器接到Request请求时,首先加载并初始化ActionServlet。ActionServlet会读取struts-config.xml配置文件,把配置文件信息存入ActionMapping对象中供以后使用。在Struts中,它的主要作用是用来接收用户的请求信息,然后根据系统配置要求将请求传递给相应的Action对象。ActionServlet并不是真正干活的类,真正干活的是RequestDispatcher和Action。

Struts——三大组件(一)ActionServlet

时间: 2024-11-03 21:04:23

Struts——三大组件(一)ActionServlet的相关文章

Struts——三大组件(二)RequestProcessor

RequestProcessor ActionServlet是Struts框架里唯一一个Servlet,它负责处理所有请求.它无论何时收到一个请求,都会首先试着为现有请求找到一个子应用.一旦子应用被找到,它会为其生成一个RequestProcessor对象,并调用传入HttpServletRequest和HttpServletResponse为参数的process()方法. 一.RequestProcessor.process() java代码: public void process(Http

Struts——三大组件(三)Action

Action Action是Struts中的基础组件.我们学过了Struts的执行流程,处理最终都会调到一个Action类:我们在Action中取得表单数据:进行业务逻辑处理:页面转发.传递等. 一.配置文件 <actionpath="/login" type="struts.LoginAction" name="loginForm" scope="request" > 二.Action代码 生成Action后,当

学习笔记_过滤器概述(过滤器JavaWeb三大组件之一)

过滤器Filter Filter和Lister是Servlet规范里的两个高级特性.不同于Servlet,它们不用于处理客户端请求,只用于对request.response进行修改或者对context.session.request事件进行监听. Filter意为滤镜或者过滤器,用于Servlet之外对request或者response进行修改.Filter提出了滤镜链的概念,一个Filterchain包括多个F 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它

JavaWeb三大组件—过滤器filter

JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css..html等等)的前面执行! 它可以让请求得到目标资源,也可以不让请求达到! * 过滤器有拦截请求的能力! 登录:允许它访问AServlet.BServlet.CServlet ------------------------------- 过滤器如何编写 1. 写一个类实现Filter接口2. 在w

javaweb三大组件之servlet(转载)

javaWeb有三大组件:Filter.Servlet.Listener jsp有九大内置对象:application.session.request.response.out.page.pagecontent.config.exception javaEE三大组件技术: Servlet,JSP,EJB Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Serv

【Flume】【*】深入flume-ng的三大组件——source,channel,sink

概览 flume-ng中最重要的核心三大组件就是source,channel,sink source负责从源端收集数据,产出event channel负责暂存event,以备下游取走消费 sink负责消费通道中的event,写到最终的输出端上 以上是总体的一个简单结构图,下面我们来深入每一个组件的内部看看: 1.Source source接口的定义如下: @InterfaceAudience.Public @InterfaceStability.Stable public interface S

第一章 java nio三大组件与使用姿势

本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于"就绪状态"后(accept接收连接事件.connect连接完成事件.read读事件.write写事件),从阻塞状态返回就绪的Channel的SelectionKey集合,之后进行IO操作. Channel:封装了socket. ServerSocketChannel:封装了ServerSocket,用于accept客户端连接请

JavaWeb三大组件小结

学完JavaWeb阶段有一段时间了,在进入框架学习之前,把JavaWeb三大组件做个总结记录,为框架学习铺点基础. 一.什么是JavaWeb三大组件? Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. 二.三大组件介绍 1.Servlet 1.1 servlet介绍 广义上说,servlet是运行在web服务器或应用服务器的程序,用来处理客户端请求的动态资源.Servlet = Service + Applet,表示小服务程序.狭义上来说,狭义的Se

Filter过滤器-JavaWeb三大组件之一

Servlet.Filter.Listener是JavaWeb的三大组件,给Web开发提供了很大的便利. 什么是Filter? Filter,过滤器.类似与生活中的净水器.空气净化器. JavaWeb中Filter的作用:当浏览器请求访问服务器的资源时,过滤器可以将请求拦截下来,完成一下特殊的功能.例如:登录验证.统一编码处理.敏感字符过滤等. Filter的基本使用 (1)定义一个类,实现接口Filter. (2)实现Filter接口的方法 (3)配置拦截路径.可以用web.xml进行配置:S