预习了struts后,今天开始参加冲刺班的学习。给我们讲课的是佟刚老师,佟老师的风格是注重实例。把每一个知识点用代码表现出来,保证没预习过的学员也能听懂。如果预习过struts相关的视频,听佟老师的课是比较轻松的。
首先介绍的MVC模式,佟老师对MVC的阐述如下:MVC是Model-View-Controller的简称,即模型-视图-控制器。MVC是一种设计模式,它把应用程序分成三个核心模块:模型、视图、控制器,它们各自处理自己的任务。模型是应用程序的主体部分,模型表示业务数据和业务逻辑。一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以提高了代码的可重用性。其次是视图,它是用户看到并与之交互的界面,作用如下:视图向用户显示相关的数据、接受用户的输入、不进行任何实际的业务处理、视图向模型查询业务状态,但不能改变模型、视图接受模型发出的数据更新事件,从而对用户界面进行同步更新。最后就是控制器了,它接受用户的输入并调用模型和视图去完成用户的需求,当Web用户单击Web页面中的递交按钮来发送HTML表单时,控制器本身不输出任何东西和做任何处理,控制器接收请求并决定调用哪个模型组件去处理请求,然后决定调用哪个视图来显示模型处理返回的数据。回顾一下MVC模式的流程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理。然后模型根据用户请求进行相应的业务逻辑处理,并返回数据。最后控制器调用相应的视图格式化模型返回的数据,并通过视图呈现给用户。
接下来是一个Helloapp的应用来初步接触struts。佟老师对客户端HTTP请求被Struts控制器处理的流程讲解的非常详细:
1.当 ActionServlet 实例接收到 HTTP 请求后,在 doGet 或 doPost 方法中都会调用process()方法处理请求
2.在 ActionServlet 的 process() 方法中一旦选择了正确的子应用模块,就会调用RequestProcessor实例的process()方法来处理请求。在ActionServlet调用这个方法时,会把当前的request和response对象传给它
3.RequestProcessor实例的process()方法调用ProcessActionCreate()方法,先判断是否在 Action 缓存中存在Action实例,如果不存在,就创建一个Action实例,把它保存在 Action 缓存中
4.RequestProcessor实例的process()方法调用Action实例的execute()方法
下面是当天的笔记,主要是一些步骤和原理的分析:
1. 搭建 struts 环境: 把 struts 解压之后的目录下的 struts-blank-1.3.8 中的文件复制过来
1). jar 包 --> lib, 加入到当前的 classPath 下
2). web.xml 文件和 struts-config.xml 文件 --> WEB-INF, web.xml 文件的约束声明需要该一下, 改成 2.4 以上,可以去 tomcat 中的 web.xml 文件中复制
3). MessageResources.properties 文件 --> src
4). 需要在 web.xml 文件配置 struts 的 ActionServlet
2. Action 的 execute 方法相关参数:
1). ActionForward: 和 struts-config.xml 文件中的 <forward name="success" path="/hello.jsp" /> 节点对应
2). ActionMapping: 和当前 Action 的 <action></action> 节点对应
3). ActionForm: 和当前 Action 的 name 属性指定的 ActionForm 对应
3. 请求流程:
1). hello.do --> ActionServlet
2). ActionServlet 解析 servletPath: hello 在 struts-config.xml 文件中找到对应的 action 节点
3). 如果在该 action 节点中配置了 name 属性, 会把表单字段信息封装到该 From 中, 要求该 Form 提供和表单字段相同的属性.
4). ActionServlet 会创建对应的 Action 对象, 调用其 execute() 方法
4. 简单验证的步骤
1). 覆盖 ActionForm 的 validate() 方法, 使该方法可以进行简单验证: 验证字段是否为空, 输入的值是否合法.
2). 在 MessageResources.properties 文件添加出错时的显示信息.
3). 配置 struts-config.xml 文件: validate="true"(也可以不配置, 因为默认值为 true); input="/xxx.jsp" 当 validate() 方法验证没有通过时, 会将页面派发到 input 指定的页面.
4). 在input 指定的页面通过 <html:errors/> 显示错误信息.
5. 复杂验证的步骤
1). 在 Action 的 execute() 方法中进行复杂验证
2). 若验证不能通过需要调用 Action 的 saveErrors(request, errors) 方法保存 errors 信息.
6. 更多细节:
1). 在 Action 的 execute() 方法中得到的 ActionForm 对象实际上是被存储在 request 或 session 域中, 是哪个取决于 action 节点的 scope 属性值,该属性只有两个合法值: request, session. 默认为 session