一.MVC
1.概念
MVC是所有面向对象程序语言都应该遵守的规范,MVC思想将一个应用分成三个基本部分:Model、View和Controller,这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
2.特点
a) 多个视图对应一个模型,可以减少代码的复制及代码的维护量,一旦模型发生改变,易于维护
b) 模型返回的数据与逻辑分离
c) 应用被分隔成三层,降低了各层之间的耦合,提供了应用的可扩展性
d) 不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。
3.Eclipse中使用struts2
1) 在eclipse中新建一个Dynamic Web Project
2) 将struts2解压目录的apps目录下的struts2-blank.war压缩包的WEB-INF\lib路径下的所有jar包复制到web应用的WEB-INF\lib下。
3) 修改web.xml文件,让改文件负责加载struts2框架。(编辑文件,在其中定义struts2的核心filter,并定义filter所拦截的URL模式)
二.struts2开发步骤以及常规配置
1.开发步骤
1)在web.xml文件中定义核心Filter来拦截用户请求
2) 如果需要以post方式提交请求,则定义包含表单数据的jsp页面。如果以get方式,则忽略该步骤
3) 定义处理用户请求的Action类:该步骤相当于控制器的作用,负责调用model里的方法来处理请求。
4) 配置Action
5)配置处理结果和物理视图的映射关系
6)编写视图资源
2.常规配置
1) 配置常量的方式:通过struts.properties文件;通过struts.xml配置文件;通过web应用的web.xml文件(以key-value对的形式,key指常量、value指key对应的值)。推荐使用struts.xml,主要为了保持与webwork的向后兼容
2)避免struts.xml文件过于庞大,可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其它配置文件。
利用<include file=”struts-part1.xml” />来包含struts-part1的文件。
3.实现Action
1)Action类里包含了对用户请求的处理逻辑,是应用的核心。
2)Struts2与struts1的区别在于:struts2采用了低侵入式的设计,不要求action类继承任何的struts2基类或者实现接口,而是一个普通的POJO,有很好的代码复用性。
3)如果需要在jsp页面输出的处理结果是一个简单的字符串,可以使用<s:property value=””/>标签来控制。
4)ActionSupport是一个默认的Action实现类,如果没有用户的提供Action类,系统自动使用ActionSupport类作为Action处理类
5)Struts2没有雨任何servletAPI耦合,struts2的action可以通过ActionContext类来访问servlet API;Action直接访问servlet API;使用ServletActionContext访问Servlet API。
6)配置Action:通过<package…/>元素配置包,name代表包名,extends代表继承的包名,如果是抽象包,abstract=’true’。注意:父包应该在子包前面配置
7)<action…/>元素可以指定一个属性method,即指定调用action类中的方法,如果没有指定,则调用execute方法,所以一个Action类可以应对多个逻辑对象。4.配置处理结果
1)配置处理结果用<result…/>元素,如:<result name=”success”>/WEB-INF/content/thank_you.jsp</result>
2)结果类型<result-types>配置在struts-default.xml中,保存在struts2-core-2.3.16.3.jar中
3)默认结果类型dispatcher。
4)Redirect结果类型与dispatcher结果类型区别:前者是将请求重定向到指定的视图资源,后者是将请求forward到指定的jsp资源;重定向会丢失所有请求参数、请求属性以及Action的处理结果
5.配置异常处理
1)在struts-default.xml中开启struts2的异常映射,从而实现struts2的异常机制
2)Struts2的异常处理机制通过在struts.xml文件配置<exception-mapping…/>元素完成的。6.Convention插件与"约定"支持
1)如果需要使用convention插件,只需要将struts2项目下的struts2-convention-plugin-2.3.16.3.jar文件复制到struts2应用的WEB-INF/lib路径下即可。
2)采用convention插件之后,Action的name属性遵循两步规则:a.如果该Action类名包含Action后缀,将该Action类名的Action后缀去掉。否则不做任何处理。b.将Action类名的驼峰写法(每个单词首字母大写、其它字母小写的写法)转成中划线写法(所有字母小写,单词与单词之间以中划线隔开)。例如对于a:LoginAction映射的Action的name属性是login,对于b:GetBooks映射的Action的name属性为get-books,AddEmployeeAction映射的Action的name属性为add-employee.
3)Action链的约定:a.第一个Action返回的逻辑视图字符串没有对应的视图资源。b.第二个Action与第一个Action处于同一个包下。c.第二个Action映射的URL为:firstactionName+resultcode。假如第一个Action名字为FirstAction,则第二个Action为FirstSecondAction。
4)自动重加载映射:
<!—配置struts2应用处于开发模式-->
<constant name=”struts.devMode” value=”true” />
<!—配置convention插件自动重加载映射-->
<constant name=”struts.convention.classes.reload”value=”true” />
三.struts类型转换与数据校验
1.类型转换
所有MVC框架,都需要负责解析HTTP请求参数,并将请求参数传给控制器组件。但HTTP请求参数都是字符串类型,但Java是强类型的语言,MVC框架必须将这些字符串参数转换成相应的数据类型。
1)struts2內建的类型转换器:开发者无须作处理便可以完成字符串与基本类型之间的转换。
2)基于OGNL的类型转换:可以将请求参数转换成复合类型参数。比如将输入的姓名密码转换成user实例的name属性和pass属性。
3)指定集合元素的类型:如果不使用泛型,开发者可以通过局部类型转换文件来指定集合元素的类型,类型转换文件为*.properties文件,局部类型转换文件的文件名为ActionName-conversion.properties形式,ActionName为Action类类名,并将局部类型转换文件跟Action类文件放在相同位置。
4)注册类型转换器:a.局部类型转换器:如3)所述,注册:user=org.crazyit.app.converter.UserConverter;b.全局类型转换器:注册全局类型转换器提供一个xwork-conversion.properties文件,文件放在web应用的WEB-INF/classes路径下即可。
2.数据校验
1)客户端校验:检验非空字段是否为空,数字格式是否正确等。主要通过JavaScript代码完成。客户端校验主要用来过滤用户的误操作。客户端校验的作用是:拒绝误操作输入提交到服务器处理,降低服务器端负担。
2)服务器端校验:防止非法数据进入程序,导致程序异常、底层数据库异常。主要通过应用中编程实现。
3)校验顺序:
a.所有非字段风格的校验器优先于字段风格的校验器
b.所有非字段风格的校验器中,排在前面的会先执行
c.所有字段风格的校验器中,排在前面的会先执行
d.注:非字段风格的校验器根元素为<validator…/>;字段风格的校验器根元素为<field…/>。
4)短路原则:
a.所有非字段校验器是最优先执行,若某个非字段校验器校验失败,则该字段上所有字段校验器都不会获得校验机会。
b.非字段校验器校验失败,不会阻止其他非字段校验的执行
c.如果一个字段校验器校验失败后,则该字段下且排在该校验失败的校验器之后的其他字段校验器不会获得校验的机会
d.字段校验器永远都不会阻止非字段校验器的执行。
5)两种校验器区别:
A.非字段校验器:
<validator type=”校验器名字”>
<param name=”fieldName”>Action中的属性a</param>
<param name=”min”>xxx</param>
<param name=”max”>xxx</param>
B.字段校验器:
<field name=”Action中属性a”>
<param name=”min”>a的最小值</param>
<param name=”max”>a的最大值</param>
6)校验器名字:
a.必填校验器:required,参数:fieldName
b.必填字符串校验器:requiredstring,参数:fieldName、trim(是否在校验前截断被校验属性值前后的空白)
c.整数校验器:int、long、short,参数:fieldName、min、max
d.日期校验器:date,参数:fieldName、min、max
e.表达式校验器:expression(只能是非字段校验器),参数:expression
f.字段表达式校验器:fieldexpression,参数:fieldName、expression
g.邮件地址校验器:email,参数:fieldName
h.网址校验器:url,参数:fieldName
i.Visitor校验器:visitor
j.转换交易器:conversion,参数:fieldName、repopulateField
k.字符串长度校验器:stringlength,参数:fieldName、maxLength、minLength、trim
l.正则表达式校验器:regex,参数:fieldname、regex(正则表达式)、caseSensitive(是否区分大小写)
7)手动输入校验:通过重写validate()或者validateXxx()方法,如果两个都重写了,那么会先调用validateXxx()方法