需要编写的代码过多,严重的继承依靠,容易引起“类爆炸”
单元测试困难
---解决方案---
POJO IN ACTION
struts2
官网地址:http://struts.apache.org
下载struts2.*.*-all.zip
Struts2工作流程
请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端初始化一个指向Servlet容器的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如: SiteMesh Plugin) 3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 ActionProxy创建一个ActionInvocation的实例。 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被 表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
Struts2环境搭建
1、配置Struts2所需jar包
2、 web.xml中加入Struts2框架启动配置
3、准备Struts2的配置文件
配置Struts2所需jar包
由于struts2的版本在不断更新变化,所需要的基本包也在不断的变化中,最好的方式是参看apps文件包中的struts2-blank.war
其中:
struts2-core-2.x.x.jar :Struts 2框架的核心类库
xwork-core-2.x.x.jar :XWork类库,Struts 2在其上构建
ognl-x.x.x.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写
commons-logging-1.x.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
commons-fileupload-1.2.1.jar 文件上传组件,2.1.6版本后必须加入此文件
web.xml中加入Struts2框架启动配置
在struts1中, struts框架是通过Servlet启动的。
在struts2中,struts框架是通过Filter启动的。他在web.xml中的配置如下:
<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>
准备Struts2的配置文件
Struts2默认的配置文件为struts.xml ,该文件需要存放在WEB-INF/classes下,该文件的配置模版如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
</struts>
为方便开发,将dtd导入到MyEclipse中。
细节描述
struts.xml中的package标签:
---作用:package是整个配置的核心部分。每个package,从语义上讲,其实代表了每一个独立的模块。在这个模块中,你可以定义独立的拦截器、结果类型和action的定义。
1、name属性:
为每个package设置一个唯一的标识,这个标识在所有的package定义中不能重复。
2、extends属性:
指定本package继承另外一个package的所有的配置。当使用了继承以后,就无需对父package中已经声明过的配置定义做再次的定义。如果重复定义,那么这些重复定义声明将覆盖父package中的相关定义。
3、 namespace属性:
对于action配置进行逻辑划分。如果不指定namespace,默认使用一个空字符串作为namespace,也可以使用“/”等字符串来表示namespace。该属性会影响到请求url的地址。
Action类无需做任何继承,只要是个普通JavaBean对象即可。特别注意:struts2中的Action是非单例的,即每次请求都会得到一个Action对象(这是与struts1不同的)。
Action需要一个execute方法充当请求方法。
该方法形如:public String execute();
1、该方法名字默认叫execute,可以更改,但是要特别配置或是在请求url中指明;
2、该方法不能有参数;
3、该方法返回类型通常是String类型,用以指代返回的页面;但也允许是void,struts2将会默认返回一个空白页面。