一、MVC框架
1、MVC框架由视图、模型、控制器组成。
学过的有开发模式二servlet+jsp+javaBean,其中servlet充当控制器,负责处理请求和控制业务流程,JSP充当视图,负责输出响应结果,javaBean充当模型,负责具体的业务逻辑和业务数据。
2、优点:分离了表示和业务,明确了开发人员和网页设计人员的角色定义和职责分工。
3、缺点:缺乏对分布式组件对象的访问支持,缺乏事务执行和管理的分布性。
二、struts框架
Struts是基于MVC的Web应用框架
1、视图:JSP、HTML文件,ActionFormBean
2、模型:表示应用程序的状态和业务逻辑,有JavaBean 或EJB,Hibernate或Spring。
3、控制器:由ActionServlet和Action组成。
4、配置文件struts-config.xml
三、struts框架的内部组件
1、视图组件:ActionFormBean,提供对国际化,接收用户输入的表单数据、表单验证和错误处理等的支持。ActionFormBean就是由struts框架提供的DTO对象,用于在视图层和控制层之间传递HTML表单数据。分为静态和动态的ActionFormBean。
1)、静态ActionFormBean
·创建自己的ActionForm必须继承ActionForm类,属性和表单中的字段一一对应。
·在struts-config.xml中配置<form-bean name =”别名” type=”包名+类名”>
<action path=” ” type=”” name=”” validate=”” input=”” attribute=”” scope=””>
其中:path:客户端请求的路径,和<form>表单中的action的路径对应。
Type:当前请求由哪个应用控制器处理
Name:表示当前请求需要填充哪个ActionForm
Validate:当前表单是否需要做表单验证,默认为true
Input:表示表单验证失败后,转向的页面路径
Attribute:请求时将ActionForm放在作用域中的键名
Scope:请求时将ActionForm放在哪个作用域下,默认为session
2)、动态ActionFormBean
DynaActionForm,避免类爆炸,是ActionForm的子类。不用建类,属性和属性名由配置文件描述。
如<form-bean name=”log” type=”org.apach.sturts.action. DynaActionForm”>
<form-property name=”userName” type=”String”>
取值:DynaActionForm df =( DynaActionForm) form
Object obj =df.get(“name”)
2、控制器组件
(1)ActionServlet组件,充当struts框架的中央控制器,所有的用户请求都先由ActionServlet来处理,然后再把请求转发给其他组件。一个应用只能配置一个ActionServlet类,由web.xml配置初始化。
(2)应用控制器Action,是用户请求和业务逻辑的桥梁,调用execute方法完成用户请求的业务逻辑,根据执行结果将请求转发到其它Web组件。常用的内置Action有三种:
A、ForwardAction类
请求转发跳转页面,为了给页面解藕
在<action>标签中配置type=”org.apache.struts.actions.
ForwardAction” parameter=”跳转的页面.jsp”
B、IncudeAction类
包含另一个Web组件
在<action>标签中配置type=”org.apache.struts.actions.IncudeAction” parameter=”跳转的页面.jsp”
C、DispatchAction类
在一个类中实现一组相关业务,适用于逻辑简单的业务。
· 创建一个类继承DispatchAction类,添加的业务操作方法必须和execute()方法有同样的参数和返回类型,抛出异常。
·在struts-config.xml中配置<action path=”” type=”” name=””
Parameter=”method”>
·在JSP页面表单中写隐藏表单
<input type=”hidden” name=”method” value=”业务方法名”>
(3)模型组件
包含了业务实体和业务规则,负责访问和更新持久化数据。
四、struts工作流程
1、用户以*.do方式发出请求,该请求找到ActionServlet。
2、当ActionServlet收到一个客户请求时,会根据struts-config.xml 找到相关Action信息。
(1)检索和用户请求相匹配的ActionServlet实例,如不存在,就返回请求路径无效。
(2)如果ActionForm实例不存在就创建一个ActionForm对象,把客户提交的表单保存在一个ActionForm对象中。
(3)根据配置信息决定是否需要表单验证,如果需要验证,调用ActionForm的validate方法。
(4)如果ActionForm的validate方法返回null或返回一个不包含ActionMessage的ActionError对象,就表示表单验证成功。
(5)ActionServlet会根据ActionMapping实例包含的映射信息决定将请求转发到哪个Action,如果该Action不存在,就会创建一个实例,然后调用Action的execute方法。
(6)Action的execute方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward指定的JSP组件。
(7)ActionForward对象指定的JSP组件生成动态网页返回客户。
(如果表单验证失败,ActionServlet将直接把请求转发给包含用户提交表单的JSP组件,此时不会再创建Action对象)。
五、Struts标记
1、基本的HTML标记
(1)<html:html>
显示html元素,html标签表单的值可以和ActionForm的属性值进行绑定,还可以将请求路径进行URL路径重写。
(2)<html>表单
<html:form action=””>创建表单
<html:text property=””>生成表单文本框字段,property的字段名和ActionForm属性值相对应
<html:hidden property>生成隐藏字段,property属性指定隐藏字段的名字
<html:select property >生成下拉列表,property属性和ActionForm属性值相对应
<html:option>生成可选项
(3)<html>显示消息
<html:errors>显示包含ActionMessage对象包含的消息
<html:messages>和<html:errors>相似,message属性指定消息来源
2、bean标签库
<bean:write>
Request.setAttribute(“date”,new Date());
如<bean:write name=”date” format=”YYYY年MM月dd日”>
3、Logic标签库,用在JSP页面中控制流程
<logic:iterate>迭代元素
如:<logic:iterate id=”bean” name=”list”>
${bean.id}
<logic:equal>比较变量是否等于指定的值
<logic:present>判断指定的对象是否存在
<logic:match>判断的指定的对象是否等于指定字符串
六、 struts验证框架
1、将validator-rules.xml,validation.xml放在工程中的WEB-INF下。
2、在struts-config.xml的最后加入
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
3、将validator-rules.xml注释中所有error开始的键值对,加入资源文件中,以显示验证失败信息。
4、建立ActionForm。该类不能继承ActionForm,必须继承ValidatorForm,并且不能重写validate方法
5、在validation.xml中书写表单具体的验证规则。
七、表单验证
1、在src目录下建mesaage.properties,写上键值对,键为需要验证的表单属性名,值为提示的错误信息。
2、在ActionForm中重写validate方法,创建ActionErrors对象,判断验证的信息,返回错误信息。
3、在struts-config.xml中配置
<message-resources parameter=”message”></message-resources>
4、在JSP页面中导入
<%@ taglib prefix="html" uri="http://jakarta.apache.org/struts/tags-html" %>
<%@ taglib prefix="bean" uri="http://jakarta.apache.org/struts/tags-bean" %>
在<body>标签中写入<html:errors>输出对应信息
缺点:这种验证方式必须通过编码实现,当逻辑发生变化时,会重新进行编码,当有相同逻辑时,又会进行重复编码,重用性降低。
解决:所以用上面那个Sturts验证框架,灵活的配置了验证规则,不需要使用编程的方式进行数据验证。