MVC框架及Struts2介绍
Struts2核心
Struts2拦截器
Struts2值栈和OGNL表达式
Struts2标签库
1 框架
1.1 框架
框架(Framework):指为解决一个特定问题而设计的具有一定约束性的结构。框架强调的是软件的设计重用性和系统的可扩充性,以缩短大型应用软件系统的开发周期,提高开发质量。一个好的框架必定是某个领域的最佳实践。
最佳实践(Best Practice):是无数程序员经历过无数次尝试之后,总结出来的处理特定问题的特定方法。最佳实践的五要素:可读性、可维护性、可拓展性、消除重复化繁为简、减少依赖消除耦合。
1.2 分层开发思想
Web开发中的最佳实践是分层开发模式,不同的分层承担了不同的功能职责:
表现层(Predentation Layer):负责处理与界面交互的相关功能(Struts2、SpringMVC);
业务层(Business Layer):负责复杂的业务逻辑计算和判断;
持久层(Persistent Layer):负责将业务逻辑数据持久化存储(mybatis、Hibernate)。
1.3 MVC模式
MVC:(Model View Controller)是一个框架模式,让程序的输入、处理、输出功能分开。MVC模式的核心是:模型、视图、控制器。最典型的MVC结构就是javabean+JSP + servlet。
数据模型(Model):通常分为数据模型和业务逻辑模型,数据模型用来存放业务数据,如订单信息、用户信息等;业务逻辑模型包含应用的业务操作,如订单的添加、修改。
视图展现(View):界面,用来将模型的内容展现给用户,用户可以通过视图来请求模型进行更新。视图从模型中获得要展示的数据,然后展现给用户。
控制器(Controller):用来控制应用程序的流程和处理视图发出的请求。当控制器接收到用户的请求后,会调用模型来实现用户请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户。
1.4 MVC框架
传统MVC模式的问题
1.所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,不能实现模块化管理;
2.Servlet的主要功能是接受参数、处理业务、页面跳转,而像字符编码、文件上传等功能也要写在Servlet中,不能让Servlet专注于主要功能;
3.只能单个接收参数,如果参数过多就会很麻烦;
4.页面跳转方式单一(forword、redirect),并且页面名称发生改变时需要修改Servlet源代码。
MVC框架
是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的一些问题而出现的框架。
常用的MVC框架:Struts2、SpringMVC,Struts2一般用于老项目中,SpringMVC一般用于新项目中。
2 Struts2
2.1 Struts2介绍
Struts2是一个MVC框架,基于Model2设计模型,由传统Struts1和WebWork两个经典框架发展而来。
核心功能
允许POJO(Plain Old Java Objects)对象作为Action (javabean),Action的execute方法不再与Servlet API耦合,并且支持更多视图技术(JSP、FreeMarker、Velocity) ,其中JSP需要编译,模板直接翻译为静态页面。基于SpringAOP思想的拦截器机制,更易扩展AOP(Spring事务)面向切面编程。
2.2 Struts2目录结构
apps:基于struts2的示例应用;
docs:struts2相关文档,包括struts2快速入门、struts2的文档以及API文档等;
lib:Struts2框架和核心类库,以及struts2第三方插件类库,不必全部拷贝;
src:Struts2框架的全部源代码。
2.3 Struts2使用步骤
Struts2下载地址:http://struts.apache.org/download.cgi
1.创建一个Dynamic Web Product项目,修改classes路径;
修改classes路径:右键项目→Build Path→Configure Build Path→Browse…→选中WEB-INF→创建classes→OK。
2.解压apps中的struts2-blank.war,然后在lib中拷贝所需的jar;
3.在web.xml中添加<filter>标签配置核心控制器;
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
StrutsPrepareAndExecuteFilter是struts2的核心控制器,可在struts2-blank项目的web.xml中参考配置。
4.创建一个Action类,写一个execute()方法,并且需要有返回值;
public class UserAction {
public String execute(){
return "success";
}
}
5.在resources文件(Source Folder文件)中写一个struts.xml配置文件,与Action关联起来;
<struts>
<!-- Action配置都是package,不能删除 -->
<package name="default" namespace="/" extends="struts-default">
<!-- name:Action的名称,和url一一对应 class:Action所对应类的全限定名 method:执行的Action的方法名 -->
<action name="user" class="cn.wenwen.action.UserAction" method="execute">
<!-- 配置结果视图 name:结果视图的名称,Action的执行方法后的返回值一一对应 type:视图的跳转类型 文本内容:跳转的jsp页面 -->
<result name="list" type="dispatcher">
/WEB-INF/userList.jsp
</result>
</action>
</package>
</struts>
可在struts2-blank\WEB-INF\classes文件中找到相关配置信息。
2.4 Struts2的执行流程
1.浏览器发送请求,经过一系列的过滤器后,到达核心过滤器(StrutsPrepareAndExecuteFilter);
2.核心过滤器判断当前的请求是否需要某个Action处理,如果不需要,走原来的流程,如果需要则把请求交给ActionProxy来处理;
3.ActionProxy通过struts.xml配置文件,找到需要调用的Action类,通过反射创建一个Action对象;
4.通过反射调用Action中对应的方法,在调用前后会执行相关拦截器;
5.通过返回的视图名称找到对应结果集作出响应。
2.5 项目基本结构