Struts 2 框架的总结
2017-08-23 10:30
218 查看
1、Action 是不是线程安全的?如果不是,有什么方式可以保证Action的线程安全?如果是,说明原因。
Struts1不是
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope=”prototype”来管理
2. Struts
2.0的mvc模式?与struts 1.0的区别?
struts2的mvc模式:当用户在页面提交用户请求时,该请求需要提交给struts2的控制器处理。struts2的控制器根据处理结果, 决定将哪个页面呈现给客户端。
与struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,struts2的Action就是一个普通的POJO。实际上,Struts2 的Action就是一个包含execute方法的普通Java类,该类里包含的多个属性用于封装用户的请求参数。
3.Struts2拦截器原理
Struts2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。
4. 自定义拦截器
1、实现拦截器类:com.opensymphony.xwork2.interceptor.Interceptor。
2、注册自定义拦截器:需要在<interceptors>中注册。
3、可以将拦截器放入拦截器栈<interceptor-stack>。
4、在action中应用拦截器。
5、也可以设置默认的拦截器。<default-interceptor-refname=”myInterceptor”/>
5. Struts2的核心控制器StrutsPrepareAndExecuteFilter的作用
StrutsPrepareAndExecuteFilter 主要负责拦截 url请求,可以在web.xml中配置拦截的url,<url-pattern>/*</url-pattern>代表拦截所有的请求,执行doFilter方法默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。
6.Struts2的工作流程:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)
(2) 请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3) FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器
(4) 请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)
(5) 如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理.
(6) ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类.
(7) ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器)
(8) Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器.
(9) 最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.
Struts2的Action是多例的,是线程安全的
每当有一次用户的请求,ActionFrom就会被创建一次。
9.配置Struts 2 的开发模式
<constant name="struts.devMode" value="true"/>
10.为什么要使用 Struts2 & Struts2 的优点
1. 基于 MVC 架构,框架结构清晰。
2. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法
3. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器是可配置与重用的
4. 多种表现层技术. 如:JSP、FreeMarker、Velocity 等
11.拦截器的生命周期与工作过程 ?
每个拦截器都是需要实现 Interceptor 接口
init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;
intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;
destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;
12. 如何在 Struts2 中使用 Ajax 功能 ?
1. JSON plugin
2. DOJO plugin
3. DWR plugin
4. 使用 Stream 结果类型.
13. Struts如何支持I18N
1、需要在struts配置文件中指定资源属性文件的位置和名称,如
2、在相应的位置放置相应的文件
3、在JSP页面中使用来输出文本,以避免硬编码
以登录页面的国际化作为例子讲解
创建相应的资源属性文件
用标签替换登录页面的硬编码文本
测试(更改网页显示语言,以便测试不同的版本)
14. 介绍一下Struts的异常自动处理机制
编程式异常处理
即我们在Action中调用业务逻辑层对象的方法时,用try{ }catch的方式来截获异常之后,手工对异常进行处理
我们以前的开发过程中,都是使用编程式的异常处理
在编程式异常处理的时候,我们可以使用struts的消息处理机制(前面所讲的内容)来对这些异常信息进行处理
自动异常处理机制
即在Action中不捕捉异常,而是将异常抛出给struts框架处理
我们需要在配置文件中指示struts如何处理这些被抛出的异常
使用元素来定义自动异常处理
元素的配置,指示了struts如何处理异常的方式
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息
元素配置的关键属性是:
key – 即这个异常所对应的错误提示消息文本的key,这个key的值,需要在资源属性文件中进行定义
type – 即定义需要处理哪种类型的Exception
path – 定义一旦出现异常,需要转向哪个页面来进行提示,如果不定义path属性,默认情况下,将使用 Action配置中的input属性的值来作为转向的页面
path属性:指定请求访问Action的路径
type属性:指定Action的完整类名
name属性:指定需要传递给Action的ActionForm Bean
scope属性:指定ActionForm Bean的存放范围
validate属性:指定是否执行表单验证
input属性:指定当表单验证失败时的转发路径。
元素还包含一个子元素,它定义了一个请求转发路径。
16. Action和拦截器线程安全吗?
Struts2的Action类是线程安全的,因为每个请求一个实例。
Struts2的拦截器是单例,所以它不是线程安全的,我们需要仔细地实现它们,以避免与共享数据的任何问题。
17.Struts2的拦截器执行什么模式?
过滤器decorator模式和职责链模式
ValueStack是一个用来处理客户端请求的数据存储区,数据存储在ActionContext中,这是用ThreadLocal为每个请求线程创建的,生命周期是请求级别。
对象图导航语言Object-Graph Navigation Language (OGNL) 是用户将储存在valuestack中的数据导出,使用OGNL拦截器和结果页面都能访问到ValueStack的数据。
@Action创建action
@Actions 配置一个类为多个Action
@Namespace 和 @Namespaces 用于创建不同的模块
@Result 用于结果页面
@ResultPath用于配置结果页面的定位。
struts.devMode 是运行在开发调试模式,提供日志和调试功能,提交生产环境需要关闭。
struts.convention.result.path 配置结果页面的位置,缺省Struts2在 {WEBAPP-ROOT}/{Namespace}/下寻找结果页面, 用这个常量能够改变这个位置。
struts.custom.i18n.resources 用来定义 i18n 支持.
struts.action.extension 用来配置应用程序的URL后缀. 缺省是后缀 .action。
?
1. org.apache.struts.action
基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能
2. org.apache.struts.actions
这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删FromBean的类,也在struts1.1中被Action包的DynaActionForm组件所取代
3. org.apache.struts.config
提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
4. org.apache.struts.util
Strtuts为了更好支持web application的应用,提供了一个些常用服务的支持,比如Connection Pool和Message Source。详细信息请参考
5. org.apache.struts.taglib
这不是一个包,而是是一个客户标签类的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags这几个用于构建用户界面的标签类。
6. org.apache.struts.validator
Struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。
25. Struts2的核心组件?
Action 类
Interceptors拦截器
结果页面, FreeMarker 模板的JSP
ValueStack, OGNL 和 Tag库
漂亮回答面试官struts2的原理
众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需要说出底层是怎么实现的,我估计大多数的人也听不懂。当面试官问到我们Struts2的工作原理时,我们该怎么回答这个问题呢?回答什么才能让自己说的与众不同,先看看其他朋友总结的
一 工作原理
在Struts2框架中的处理大概分为以下几个步骤 :
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
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
二 工作流程
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器
Struts1不是
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope=”prototype”来管理
2. Struts
2.0的mvc模式?与struts 1.0的区别?
struts2的mvc模式:当用户在页面提交用户请求时,该请求需要提交给struts2的控制器处理。struts2的控制器根据处理结果, 决定将哪个页面呈现给客户端。
与struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,struts2的Action就是一个普通的POJO。实际上,Struts2 的Action就是一个包含execute方法的普通Java类,该类里包含的多个属性用于封装用户的请求参数。
3.Struts2拦截器原理
Struts2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。
4. 自定义拦截器
1、实现拦截器类:com.opensymphony.xwork2.interceptor.Interceptor。
2、注册自定义拦截器:需要在<interceptors>中注册。
3、可以将拦截器放入拦截器栈<interceptor-stack>。
4、在action中应用拦截器。
5、也可以设置默认的拦截器。<default-interceptor-refname=”myInterceptor”/>
5. Struts2的核心控制器StrutsPrepareAndExecuteFilter的作用
StrutsPrepareAndExecuteFilter 主要负责拦截 url请求,可以在web.xml中配置拦截的url,<url-pattern>/*</url-pattern>代表拦截所有的请求,执行doFilter方法默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。
6.Struts2的工作流程:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)
(2) 请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3) FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器
(4) 请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)
(5) 如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理.
(6) ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类.
(7) ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器)
(8) Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器.
(9) 最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.
7.struts2是如何管理action的?这种管理方式有什么好处?
struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。 主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。8.Action和ActionForm是单例的吗?Action是线程安全的吗?
Struts1的Action是单例的,不是线程安全的Struts2的Action是多例的,是线程安全的
每当有一次用户的请求,ActionFrom就会被创建一次。
9.配置Struts 2 的开发模式
<constant name="struts.devMode" value="true"/>
10.为什么要使用 Struts2 & Struts2 的优点
1. 基于 MVC 架构,框架结构清晰。
2. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法
3. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器是可配置与重用的
4. 多种表现层技术. 如:JSP、FreeMarker、Velocity 等
11.拦截器的生命周期与工作过程 ?
每个拦截器都是需要实现 Interceptor 接口
init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;
intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;
destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;
12. 如何在 Struts2 中使用 Ajax 功能 ?
1. JSON plugin
2. DOJO plugin
3. DWR plugin
4. 使用 Stream 结果类型.
13. Struts如何支持I18N
1、需要在struts配置文件中指定资源属性文件的位置和名称,如
2、在相应的位置放置相应的文件
3、在JSP页面中使用来输出文本,以避免硬编码
以登录页面的国际化作为例子讲解
创建相应的资源属性文件
用标签替换登录页面的硬编码文本
测试(更改网页显示语言,以便测试不同的版本)
14. 介绍一下Struts的异常自动处理机制
编程式异常处理
即我们在Action中调用业务逻辑层对象的方法时,用try{ }catch的方式来截获异常之后,手工对异常进行处理
我们以前的开发过程中,都是使用编程式的异常处理
在编程式异常处理的时候,我们可以使用struts的消息处理机制(前面所讲的内容)来对这些异常信息进行处理
自动异常处理机制
即在Action中不捕捉异常,而是将异常抛出给struts框架处理
我们需要在配置文件中指示struts如何处理这些被抛出的异常
使用元素来定义自动异常处理
元素的配置,指示了struts如何处理异常的方式
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息
元素配置的关键属性是:
key – 即这个异常所对应的错误提示消息文本的key,这个key的值,需要在资源属性文件中进行定义
type – 即定义需要处理哪种类型的Exception
path – 定义一旦出现异常,需要转向哪个页面来进行提示,如果不定义path属性,默认情况下,将使用 Action配置中的input属性的值来作为转向的页面
15. 在struts配置文件中action元素包含哪些属性和子元素?
path属性:指定请求访问Action的路径type属性:指定Action的完整类名
name属性:指定需要传递给Action的ActionForm Bean
scope属性:指定ActionForm Bean的存放范围
validate属性:指定是否执行表单验证
input属性:指定当表单验证失败时的转发路径。
元素还包含一个子元素,它定义了一个请求转发路径。
16. Action和拦截器线程安全吗?
Struts2的Action类是线程安全的,因为每个请求一个实例。
Struts2的拦截器是单例,所以它不是线程安全的,我们需要仔细地实现它们,以避免与共享数据的任何问题。
17.Struts2的拦截器执行什么模式?
过滤器decorator模式和职责链模式
18.Struts1和Struts2的区别是什么?
组件 | Struts1 | Struts2 |
---|---|---|
Action 类 | 需要强迫继承一个类,不灵活 | 只要实现Action接口, 完成execute() |
线程安全 | Action类是单例的,非线程安全,编程时要注意多线程副作用 | action类每次请求一个(性能降低) 。 |
Servlet API 耦合 | Struts1 API 与Servlet API 紧紧耦合,Request和Response 对象直接传入execute() 方法(虽然很方便) | Struts2 API 和Servlet API松耦合,自动将表单bean数据映射到action类的javabean属性(struts1也可以通过ActionForm实现)。 |
测试 | Struts1 action类因为和Servlet API 耦合难于测试 | Struts2 Action 类是一个正常Java类,易于测试。 |
Request 参数映射 | Struts1 需要我们创建 ActionForm 类来 hold request 参数,还需要配置 | Struts2 request参数映射是自动的,我们只要有相应的java bean属性在action类中,或实现 ModelDriven接口提供java bean 类名用于映射。 |
标签支持 | Struts1 使用 JSTL 和自己的表情。 | Struts2 使用 OGNL |
校验 | Struts1 支持validate() 方法手动 | Struts2 支持手动和验证框架整合。 |
视图输出 | Struts1 使用标准JSP 输出 | Struts2 使用 ValueStack 存储请求参数和属性,使用OGNL 和 Struts2 标签访问 |
19. Struts2的前端控制器是什么?
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 每次请求处理从这里开始。
20.什么是ValueStack和OGNL?
ValueStack是一个用来处理客户端请求的数据存储区,数据存储在ActionContext中,这是用ThreadLocal为每个请求线程创建的,生命周期是请求级别。对象图导航语言Object-Graph Navigation Language (OGNL) 是用户将储存在valuestack中的数据导出,使用OGNL拦截器和结果页面都能访问到ValueStack的数据。
21.Struts2有用的标签有哪些?
@Action创建action@Actions 配置一个类为多个Action
@Namespace 和 @Namespaces 用于创建不同的模块
@Result 用于结果页面
@ResultPath用于配置结果页面的定位。
22. Struts2重要的常量?
struts.devMode 是运行在开发调试模式,提供日志和调试功能,提交生产环境需要关闭。struts.convention.result.path 配置结果页面的位置,缺省Struts2在 {WEBAPP-ROOT}/{Namespace}/下寻找结果页面, 用这个常量能够改变这个位置。
struts.custom.i18n.resources 用来定义 i18n 支持.
struts.action.extension 用来配置应用程序的URL后缀. 缺省是后缀 .action。
?
23.Struts2的名称空间namespace 有什么用?
我们能使用名称空间基于功能分离我们的Action类,如admin user和客户等模块。
24. Struts中最核心的类和包有哪些?
1. org.apache.struts.action基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能
2. org.apache.struts.actions
这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删FromBean的类,也在struts1.1中被Action包的DynaActionForm组件所取代
3. org.apache.struts.config
提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
4. org.apache.struts.util
Strtuts为了更好支持web application的应用,提供了一个些常用服务的支持,比如Connection Pool和Message Source。详细信息请参考
5. org.apache.struts.taglib
这不是一个包,而是是一个客户标签类的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags这几个用于构建用户界面的标签类。
6. org.apache.struts.validator
Struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。
25. Struts2的核心组件?
Action 类
Interceptors拦截器
结果页面, FreeMarker 模板的JSP
ValueStack, OGNL 和 Tag库
漂亮回答面试官struts2的原理
众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需要说出底层是怎么实现的,我估计大多数的人也听不懂。当面试官问到我们Struts2的工作原理时,我们该怎么回答这个问题呢?回答什么才能让自己说的与众不同,先看看其他朋友总结的
一 工作原理
在Struts2框架中的处理大概分为以下几个步骤 :
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
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
二 工作流程
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器
相关文章推荐
- struts框架知识点总结<一>
- struts 框架总结
- Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程及增删改查经验总结
- 总结-对各种开源框架的认识小结-struts2
- Struts 2框架中Action组件总结
- SSH框架之Struts的验证总结、验证的错误处理
- Struts,Spring,Hibernate三大框架的面试与笔试题
- Android网络请求框架总结
- Struts2学习总结(3)--值栈,Ognl表达式,Struts标签库,国际化,数据校验,拦截器
- CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
- PHP之Yii框架学习总结
- 4.毕向东_集合框架总结
- 集合框架-Collection接口总结
- Struts总结
- Struts 验证框架实现步骤
- 一个掌握Struts企业级Web开发框架的实例 (转载)
- Struts-Validate框架
- Laravel框架学习自我总结——开始
- 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15)