2、Struts原理(一)续

Download Report

Transcript 2、Struts原理(一)续

Struts概述
• Struts 实质上就是在JSP Model2的基础上
实现的一个MVC框架。
• 模型:JavaBean、EJB组件
• 控制器:ActionServlet
• 视图:JSP、Struts客户化标签
Struts概述
ActionForm Bean
• ActionForm Bean也是一种JavaBean,除
了具有一些JavaBean的常规方法,还包含
一些特殊的方法,用于验证HTML表单数据
以及将其属性重新设置为默认值。
• Struts框架利用ActionForm Bean来进行
View组件和Controller组件之间表单数据的
传递。
• Struts框架把View组件接受到的用户输入的
表单数据保存在ActionForm Bean中,把它
传递给Controller组件,Controller组件可以
对ActionForm Bean中的数据进行修改
ActionForm Bean
Struts框架的初始化流程
• 对于采用Struts框架的Web应用,在Web应
用启动时就会加载并初始化控制器
ActionServlet
• ActionServlet从struts-config.xml文件中读
取配置信息,把它们存放到
ActionMappings对象中。
Struts框架响应客户请求的工作
流程
Struts框架响应客户请求的工作
流程
• (1)如果ActionMapping实例不存在,就创建一个ActionMapping对象,
它包含了把请求转发给哪个Action的信息。
• (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客
户提交的表单数据保存到ActionForm对象中。
• (3)根据配置信息决定是否需要表单验证。如果需要验证,就调用
ActionForm的validate()方法。
• (4)如果ActionForm的validate()方法返回null或返回一个不包含
ActionErrors对象,就表示表单验证成功。
• (5)ActionServlet根据配置信息决定将请求转发给哪个Action。如
果相应的Action实例不存在,就先创建这个实例,然后调用Action的
execute方法。
• (6)Action的execute方法返回一个ActionForward对象,
ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
• (7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。
• 对于以上流程的步骤(4),如果ActionForm的validate()方法返回一
个包含一个或多个ActionError的ActionErrors对象,就表示表单验证
Helloapp应用
• helloapp应用包括如下需求:
– 接受用户输入的姓名<name>,然后返回字符
串“Hello <name> !”
– 如果用户没有输入姓名就提交表单,将返回出
错信息,提示用户首先输入姓名。
– 如果用户输入姓名为“Monster”,将返回出错
信息,拒绝向“Monster”打招呼。
Helloapp应用的组成
视图:hello.jsp
HelloForm Bean
控制器:ActionServlet、HelloAction
模型:PersonBean
struts-config.xml
Struts-config.xml
<struts-config>
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
</form-beans>
<action-mappings>
<action path
= "/HelloWorld"
type
= "hello.HelloAction"
name
= "HelloForm"
scope = "request"
validate = "true"
input = "/hello.jsp" >
<forward name="SayHello" path="/hello.jsp" />
</action>
</action-mappings>
<message-resources parameter="hello.application"/>
struts框架的组成部分
• struts-config.xml Struts配置文件
• ActionServlet
控制器
• Action Class
Control与Model之间
的适配器(adapter)。
含控制逻辑,是Control
实现者。
包
的
• ActionForm
显示模块数据
struts框架的组成部分
• ActionMapping 帮助控制器将请求映射到操作
• ActionForward 用来指示操作转移的对象
• ActionError
• Struts标记库
用来存储和回收错误
struts框架的优势
• 良好的架构和设计
• 可重用,模块化,扩展性好
• Open source
struts-config.xml
• Struts-config.xml集中了所有页面的导航定
义。对于大型的WEB项目,通过此配置文
件即可迅速把握其脉络,这不管是对于前
期的开发,还是后期的维护或升级都是大
有裨益的。掌握Struts-config.xml是掌握
Struts的关键所在。
struts-config.xml (FormBean部分)
<struts-config>
<!-- Form Bean Definitions -->
<form-beans>
<form-bean name=“testform"
type="com.cjea.test.TestForm" />
</form-beans>
struts-config.xml(全局转发部分)
<!-- Global Forward Definitions -->
<global-forwards>
<forward name="failure"
path="bad.jsp"/>
<forward name="success"
path="/good.jsp" />
</global-forwards>
struts-config.xml (action部分)
<action-mappings>
<action path=“/test/test.jsp"
type=“com.cjea.test.testAction" name="testform"
scope="request">
<forward name="success" path="/test/good.jsp" />
</action>
<action-mappings>
</struts-config>
ActionServlet
• ActionServlet 是struts框架 MVC 实现的
controller 部分,它是这一框架的核心。
• ActionServlet 创建并使用 Action、
ActionForm 和 ActionForward。
ActionServlet的基本功能
• 截获用户的Http请求
• 把这个请求映射到相应的Action类。
• 创建一个ActionForm bean实例,将form请求
放入formbean的实例中
ActionServlet的基本功能
• 调用Action实例的perform()方法
• 将ActioForm bean,Action Mapping对
象,request和response对象传给Action的
perform()方法
• perform返回一个ActionForword对象,根据
方法执行情况转到相应的jsp页面.
Action Classes
• Action 类是业务逻辑的一个包装。Action
类的用途是将 HttpServletRequest 转换为
业务逻辑。
• Action是Control和Model之间的一个适配器
(adapter)。
ActionForm
• ActionForm 维护 Web 应用程序的会话状
态。
• ActionForm 是一个抽象类,必须为每个输
入表单模型创建该类的子类。
ActionForm的使用
• 假定有一个由 HTML 表单设置的
TestActionForm。 Struts 框架将执行以下操
作:
• 检查 TestActionForm对象是否存在;如果不
存在,它将创建该类的一个实例。
• Struts 将使用 HttpServletRequest 中相应的
域设置 TestActionForm的状态。
Struts深度历险
• Struts执行顺序
– 在AddForm和AddAction中增加调试代码
– 运行程序查看控制台输出
ActionServlet调用
AddForm的setter方法
然后调用AddAction
的execute方法
最后页面将Form
中的值显示出来
Struts深度历险
• ActionForm和ActionMapping中有什么?
AddAction.java
– Action中execute方法的参数列表
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
– 设置断点,观察变量
通过在excute方法中设置断
点、观察变量,可以帮我们
解决很多使用Struts中出现
的问题
小结
• 结合下图,说说Struts的运行过程。
使用Struts开发“发布出租信息”
• 使用Struts开发“发布房屋信息”功
能
• 模型(Model)组件
– 典型的三层结构
– 面向接口编程
• 开发顺序:
DAO
 Biz
Form Bean
使用Struts开发“发布出租信息”
• 业务流程
post.jsp
1、如果未登录,转到login
2、如果isConfirmed为false,转到
confirm;否则,保存数据,转到
userlist
3 、如果出错,转到error
confirm.jsp
PostAction
login
error
userlist
public ActionForward execute(...){
//如果没有登录,转发到登录页面
HttpSession session = request.getSession(false);
USER user = null;
if (session != null) {
user = (USER) session.getAttribute("user");
}
PostAction.java
if(user == null){
return mapping.findForward("login");
}
//如果还没有确认,转到确认页面
String confirm = request.getParameter("confirm");
if(null==confirm || !"yes".equals(confirm)){
return mapping.findForward("confirm");
}
//调用业务逻辑方法,插入数据到数据库
try{
FwxxForm fwxxForm = (FwxxForm) form;
FWXX fwxx = new FWXX();
fwxx.setTitle(fwxxForm.getTitle());
...
biz.post(fwxx);
request.setAttribute("msg","发布成功!");
return mapping.findForward("index");
}catch(Exception e){
request.setAttribute("msg","出错啦:" + e.getMessage());
return mapping.findForward("error");
}
}
使用Struts开发“发布出租信息”
• 实现代码
使用Struts开发“发布出租信息”
• 配置文件
<form-beans>
<form-bean name="fwxxForm"
type="com.aptech.jb.entity.form.FwxxForm" />
</form-beans>
<action-mappings>
<action name="fwxxForm" path="/post" scope="request"
type="com.aptech.jb.action.PostAction">
<forward name="affirm" path="/affirm.jsp" />
<forward name="userlist" path="/list.do?myrent=y" />
<forward name="login" path="/login.jsp" />
<forward name="error" path="/error.jsp" />
演示示例:使用Struts开发“发布出租信息”功能
</action>
</action-mappings>
总结
• 如何使用Struts开发登录功能?
• Action组件的作用是什么?
• ActionForm组件的作用是什么?
• struts-config.xml中都配置了哪些信息?