-------------------------------------------------------------------------------------------------------------------------------------
Struts简介:由apache提供的一个基于MVC的开源框架,与SUN公司无关,非J2EE规范。
-------------------------------------------------------------------------------------------------------------------------------------
使用目的:利用Struts可以构造我们整个软件系统的框架,可以将系统划分为三个核心的模块:
1.Model(模型层)
JavaBean:处理业务逻辑的--->业务逻辑层
处理数据访问逻辑的--->数据访问层
EJB:(SessionBean)
AtionForm:
2.View(示图层):Jsp;Html
3.Controller(控制层):
ActionServlet(控制器)
Actions(控制器)
RequestProcessor(请求处理器)
View和Controller属于表现层(Web层);
------------------------------------------------------------------------------------------------------------------------------------
Struts的优缺点:
有点:1.快速构建软件系统的框架结构,提高开发效率。
2.可以提高系统的可重用性,扩展性和可维护性。
3.比较适合于开发一些比较大型的项目。
缺点:1.Struts框架的运作机制相当复杂,不易理解。
2.用户开发的程序和框架绑定在一起,脱离框架就无法正常运行。
-----------------------------------------------------------------------------------------------------------------------------------
Struts中控制层的分类:
1.ActionServlet:这个类由Struts框架提供,它专门负责接受所有客户端的请求(*.do),但是它本身不会去处理请求,而是将请求交给RequestProcessor全权处理。
2.RequestProcessor:这个类也是由Struts框架提供,它接受ActionServlet转发过来的请求(request)并进行处理,它会根据struts-config.xml中的配置文件去调用不同的Action去处理客户端不同的请求。
3.Action:这个类也是由Struts框架提供,我们用户只要定义一个类继承Action即可。Action(功能是控制和转发请求)类似于Servlet,作为控制器去调用模型层中的业务接口方法,根据不同的返回结果不同的视图去展示数据。
------------------------------------------------------------------------------------------------------------------------------------
Struts模型层中的ActionForm
ActionForm 也是由Struts框架提供,只要定义一个类继承它即可。
使用目的:1.用于封装表单的字段信息;2.验证提交表单中的字段信息;3.可以对表单中的字段信息重新赋值显示。
一个Action可以配置一个ActionForm,也可以不配置。一个ActionForm可以被多个Action使用。
------------------------------------------------------------------------------------------------------------------------------------
Struts的工作流程
1.容器在装载并实例化ActionServlet实例对象后,在初始化方法init()中先去解析struts-config.xml文件,将其中的每个元素封装成struts框架中对应的一个个类的对象。如:
<form-bean>---->ActionFormBean对象
<action>----->ActionMapping
<forward>---->ActionForward
那么这些对象存放进ModuleConfigImpl维护的若干个HashMap中。
formBeans:(name,ActionFormBean对象引用);
actionConfigs:(path,ActionMappings对象引用)
放置全局的ActionForward对象
forwards(name,ActionForward对象引用)
例如:actionConfigs("/basic/register",ActionMapping对象引用);
2.不管表单时get还是post方法提交,ActionServlet对象调用process(request,response)方法,在该方法中构造一个RequestProcessor类的对象,若后调用它的方法process(request,response);并将request和response传递给该方法,接下来由RequestProcessor对象全权处理请求。
3.RequestProcessor对象根据请求URL中的ServletPath,到HashMap中查找对应的ActionMapping对象,若没有找到则直接返回404.
4.若找到ActionMapping对象,根据属性name的值找到相应的ActionForm,如果没有配置formBean,跳转到8.
5.判断是否存在ActionForm对象,根据scope.getAttribute(属性名)(属性名的值就是attribute指定的值)来查找对应的ActionForm对象,若没有,构造一个新的ActionForm对象,然后放置在scope指定的范围中。
6.调用ActionForm对象的reset()方法进行属性的初始化,再将表单字段封装到该对象的属性中,该方法要用户自己实现。
7.若validate为true,执行ActionForm对象中的validate()方法,若为false,不执行。
8.判断Action对象是否存在,从Action缓存中去查找对应的Action对象(其实就是一个HashMap对象,属性type指定的值,action对象引用)。若没有构造一个新的Action对象放置到该集合中。
9.Action对象调用execute()方法,返回一个ActionForward对象到struts-config.xml中。RequestProcessor对象,根据其中的属性信息forward或者重定向到path指定的资源。