struts2的MVC模式
MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而得到更好的开发和维护效率。
在MVC模式中,应用程序被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式,也就是通常所说的页面或者是界面;而控制器部分负责协调模型和视图,根据用户请求来选择要调用哪个模型来处理业务,以及最终由哪个视图为用户做出应答。
MVC模式的这三个部分的职责非常明确,而且相互分离,因此每个部分都可以独立的改变而不影响其他部分,从而大大提高了应用的灵活性和重用性。
1.1.2 MVC模式基础
在MVC模式中,一个应用被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分,接下来认识一下这三个部分。
1:首先看一下模型、视图、控制器各部分的作用
- 模型(Model):负责封装应用的状态,并实现应用的功能。通常又分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息、用户信息等;而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。
- 视图(View):用来将模型的内容展现给用户,用户可以通过视图来请求模型进行更新。视图从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互;用户在界面上操作或者填写完成后,会点击提交按钮或是以其它触发事件的方式,来向控制器发出请求。
- 控制器(Controller):用来控制应用程序的流程和处理视图所发出的请求。当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,也就是调用模型来实现用户请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户。
struts2是根据mvc模式设计出来的web层框架,主要处理的是接收和返回数据,而逻辑层和数据访问就不是这个框架的职责范围了。这个框架在mvc模式当中就是一个servlet,用来处理和转发。web.xml用来配置web容器,struts.xml用来配置struts框架。
MVC的组件关系图描述了模型、视图、控制器这三个部分的交互关系,下面按照交互顺序来详细描述一下它们的交互关系:
(1)首先是展示视图给用户,用户在这个视图上进行操作,并填写一些业务数据
(2)然后用户会点击提交按钮,来发出请求
(3)视图发出的用户请求会到达控制器(servlet),在请求中包含了想要完成什么样的业务功能以及相关的数据。
(4)控制器会来处理用户请求,会把请求中的数据进行封装(一系列的拦截器封装:ModelDriven,params参数封装),然后选择并调用合适的模型,请求模型进行状态更新,然后选择接下来要展示给用户的视图。
(5)模型会去处理用户请求的业务功能,同时进行模型状态的维护和更新
(6)当模型状态发生改变的时候,模型会通知相应的视图,告诉视图它的状态发生了改变。
(7)视图接到模型的通知后,会向模型进行状态查询,获取需要展示的数据,然后按照视图本身的展示方式,把这些数据展示出来。
接下来就是等待用户下一次操作,再次从头轮回了。
那么,在用户发出一个请求后,Servlet+JSP+JavaBean模型基本的响应顺序是怎样的呢?
当用户发出一个请求后,这个请求会被控制器Servlet接收到;Servlet将请求的数据转换成数据模型JavaBean,然后调用业务逻辑模型JavaBean的方法,并将业务逻辑模型返回的结果放到合适的地方,比如请求的属性里;最后,根据业务逻辑模型的返回结果,由控制器来选择合适的视图(JSP),由视图把数据展现给用户。
1.1.3 MVC模式作用
在早期开发中,有一些程序员没有认识到MVC模式带来的好处,在开发的时候不遵守MVC模式。这样做的结果就是程序结构划分不明确,各个部分功能混乱,在业务功能发生变更时,无论是业务逻辑修改还是显示形式修改,都要修改很多的类,“牵一发而动全身”,导致软件的开发和维护效率低下,错误百出。
数据校验 当校验成功的时候执行execute方法返回success,如果校验不成功返回input值去配置文件当中去找转发的页面
当数据类型转换错误的时候(也就是不能转换的时候)struts2框架将数据定义为java数据的初始值,框架生成一条错误信息,并将错误信息放到addfielderror中去
如果要替换struts2框架的默认错误信息去struts.xml文件当中配置,在替换的错误信息里应该有
#在这里面name是你要替换的框架当中的值,value是要替换的值
xword.default.invalid.fieldvalue={0} error 这里{0}是当数据错误的时候赋的值 后面的字符串是要添加到addfielderror当中的值
错误信息的替换也有全局的和局部的
全局的配置文件要在classes目录下局部的配置文件要在Action相同目录下全局的配置文件名为定义的properties
局部的配置文件要和Action的名称相同
在配置文件但中每个action属性都可以设置这个表单处理的方法,用method属性里面是方法的名字。这种做法是为了能让一个Action类能有多个处理逻辑
struts2的验证框架是基于xml的验证方式,在和action类相同的目录下面建立 "action类名"+"-validation.xml" 然后在里面添加dtd文件这个文件可以去struts2的例子当中去复制
然后写配置文件 如下:
<validators >//这个是根目录
<field name="username">//这个是需要验证的输入框名字就是输入框的名字
<field-validator type="requiredstring">//选择验证类型 这个类型的列表在xwork.jar 的 com.opensymphony.xwork2.validator.validators 包下的default.xml
文件里
<param name="trim">true</param>//这个是为绑定的验证类的里的属性进行配置
<message>username should not be blank;</message>//当验证不通过时的信息输出
</field-validator>
</field>
<field name="username">
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message> username should between in ${minLength} and ${maxLength}</message>
</field-validator>
</field>
</validators>
在一个action类当中可以能有多个返回的方法(一个action类可以实现多个逻辑),可以再struts.xml文件当中设置使用哪个执行的方法,是在action标签当中的method的属性设置,但是使用不同的方法需要不同的
验证方式,可以设置不同的验证配置文件来为不同的方法设置验证方法,验证配置文件的文件名应该这样写:actionName-methodName-validation.xml
这是设置每个方法的校验方式,但是这个为这个action类配置的校验配置也会去校验,而且首先校验的是这个action类的校验文件(建议的是如果一个action类有多个逻辑,只提供每个逻辑的验证而不提供action类的
全局验证)
特殊情况:如果一个action类有一个方法的验证,并且有一个全局的验证,这个action有一个子类这个子类也有一个方法 的验证和全局的验证,系统验证的顺序是
首先执行父类的全局验证然后是方法的验证之后是子类的全局验证最后才是子类的方法的 验证
除了field校验方式(字段检验,为每个字段配置校验对象)还有一种是非字段校验 validtor 就是在<validators >这个标签里定义一个validtor标签,定义校验的对象然后为这个对象设置需要校验的字段
validtor标签的使用:标签下第一个子标签是<param name="fieldName">需要校验的字段的名</param>然后还必须有一个<message>标签标示出错后提示的内容
客户端校验:
struts2 给我们提供了一定的客户端校验功能但是功能很不完善所以最好自己去写js校验的代码;
但是在使用struts2提供的校验方式的时候theme属性一定不要设置为simple,而且validata的要设置为true;
也可以自己写js校验,form的一些属性和html里是一样的