MVC模式
Jsp/Servlet Web常见架构:
Jsp –> Jsp
Jsp页面数据提交给Jsp处理,并显示。 典型应用如Jive。
Jsp -> Servlet –> Jsp
Jsp页面数据提交给Servlet处理,由Servlet推出Jsp页面。前者Jsp是显示输入数据;后者Jsp是显示处理结果。这是MVC模式实现。
Struts的MVC流程图如下:
View 显示视图实现。使用Jsp技术;使用特定标签库提供与显示相关的控制功能,从而完全杜绝Jsp中的Java代码。
Controller 控制协调。使用Servlet等技术;接受Jsp数据或推出Jsp视图。Struts的Action类似Servlet,通过Command配置去除了Servlet冗余代码,简洁高效。
Model 后台模型。表示业务层。
注意:
1. 在Jsp中不写入与显示无关的Java代码。
2. 在Servlet中不写入业务核心功能代码。
使用Struts符合面向对象的设计和MVC模式:将界面离散表单数据字段包装成对象,将这个对象为业务层服务,从而保证业务核心是OO。分离了显示和控制以及业务核心,并且可对页面流程进行灵活控制。实际项目中变化最大就是页面流程。
Struts的开发步骤:
创建ActionForm实现
ActionForm是数据表单的对象实现。
创建Action实现
完成其execute()方法。
创建数据表单Jsp和结果Jsp
配置Struts-config.xml
Action代码实现
编写一个类, 继承org.apache.struts.action.Action, 实现execute方法:
public ActionForward execute(ActionMapping actionMapping,//对应配置
ActionForm actionForm,//表单对象
HttpServletRequest request,
HttpServletResponse response)
Action负责页面流程控制、前后台交互。将编写的Action类配置在页面流程控制struts-config.xml:
使用DispatchAction,克服一个Action只能一个方法的缺点, Struts-config.xml中在中加入配置parameter=”method“。 在Jsp中提交加入:
ActionForm
ActionForm是表单的抽象对象,AF字段对应表单的字段,AF是数据对象。 AF也是界面对象,是Domain Model界面实现。
MyActionForm extends ActionForm{
String id;
public void setId(String id){ this.id = id}
public String getId(){ return id;}
}
ActionForm的生命周期 Scope有三种:request、session和application。
Request过程描述:
1. 当用户点按数据表单的提交submit按钮,ActionForm实例随request产生,被Struts使用request.setAttribute保存在request中。
2. Action接受ActionForm后,经过处理推出forward结果Jsp页面。
在一个Request经过的各个环节中,都可以获得相同的ActionForm实例,相当于使用request.getAttribute方法。
ActionForm创建:
//首先检查struts-config.xml配置映射中的scope值。
if (“request”.equals(mapping.getScope())) {
// 如果是request,将ActionForm对象保存其中
request.setAttribute(mapping.getAttribute(), form);
} else {
//否则认为是Session,将ActionForm对象保存其中
HttpSession session = request.getSession();
session.setAttribute(mapping.getAttribute(), form);
request.setAttribute(mapping.getAttribute(), form);
}
ActionForm获得:
首先检查struts-config.xml配置映射中的scope值。
if (“request”.equals(mapping.getScope())) {
// 如果是request,从其中获得ActionForm对象
request.setAttribute(mapping.getAttribute(), form);
} else {
//否则认为是Session,从其中获得ActionForm对象
HttpSession session = request.getSession();
session.setAttribute(mapping.getAttribute(), form);
request.setAttribute(mapping.getAttribute(), form);
}
通过下塑ActionForm获得
在action子类的具体方法XXXX中downCast:
public ActionForward XXXX(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
//ActionForm作为execute方法的输入参数
FiltersForm filtersForm = (FiltersForm) form;
return mapping.findForward(“forward”);
}
Jsp标签
标签两部分组成:tld配置和tagclass类代码组成。
标签使用:在jsp中首先需要导入tld配置;在web.xml中配置tld配置(URI–Location);
可以自行编写拓展标签库。 标签库优点在jsp中消灭java代码。
Struts标签 优点:
杜绝Jsp中的Java代码;
方便书写,如:
无需在action值中指定Web名称,直接以/为开头。
以struts标签替代html相应语法。
标签的作用:
实现离散表单项目和对象之间的转换,实际就是一个转换配置。类似ORM中映射配置,也属于映射配置。为什么有人不喜欢用标签?如果没有对象概念,当然没有转换映射的需求,所以不会用标签。
标签的原理:
标签基本单元:name 和property
Name: struts在当前scope(取决于配置,一般是request)中寻找符合name值的对象,实质是request.getAttribute(name值)。
Property:通过反射机制,寻找name对象中是否存在property这个方法。执行PropertyUtils.getProperty方法
神奇核心:PropertyUtils
org.apache.commons.beanutils.PropertyUtils是apache的一个通用包功能:
使用Java Reflection APIs方便从一种高度来透过getter和setter操作所有JavaBean的属性。
copyProperties方法:将一个对象属性值拷贝到另外一个对象相同属性中去。
getProperty(aaa,bbb)方法:返回一个特定bean的特定属性值,相当于”aaa.getBbb”.
常用标签:
表单标签:html:form html:hidden html:text
单纯输出:bean:write
逻辑控制标签:logic:iterate
参数定义:bean:define bean:parameter
通过标签获得ActionForm:
一个表单一个ActionForm,表单的字段对应ActionForm的字段。
………