用struts2实现一个板块(java struts2是干什么用的)

2025-10-30 06:15:01 :0

用struts2实现一个板块(java struts2是干什么用的)

其实用struts2实现一个板块的问题并不复杂,但是又很多的朋友都不太了解java struts2是干什么用的,因此呢,今天小编就来为大家分享用struts2实现一个板块的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

java struts2是干什么用的

因为struts2的Action就具备了struts1中ActionForm的功能;ActionForm的功能无非三个:初始化数据;封装数据;验证数据格式;对于struts2,都有相应的解决方式:通过Action实现Preparable接口,实现对数据初始化;Action继承ActionSupport,重写validate(),显示数据的验证,在Action中配置属性以及对应的getter和setter方法,实现数据封装。而且类型转换方面,struts2通过OGNL实现的效果要比ActionForm更灵活。spring的声明事务依赖AOP;以代理的方式实现事务;通过AOP和tx命名空间组合成一个事务切面,声明式的方式注入给某个需要的业务对象;可以很方便的为某个业务对象添加或删除事务。

为什么要使用Struts2的

Struts2 是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。
1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。
2使用OGNL进行参数传递。
OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。
3强大的拦截器
Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。
4易于测试
Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了5Java Web项目的测试。
***隐藏网址***
6模块化管理
Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。
7全局结果与声明式异常
为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。
他的如此之多的优点,是很多人比较的青睐,与spring ,Hibernate进行结合,组成了现在比较流行的ssh框架,当然每个公司都要自己的框架,也是ssh变异的产品。

struts2 作用

作为web层框架应该大体实现以下功能:
1.获取表单内容,并组织生成参数对象
2.根据请求的参数转发请求给适当的控制器
3.在控制器中调用业务接口
4.将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现
5.做一些简单的校验或是国际化工作
无论是登录还是上传什么,没有其他层的协助是无法实现的,当然你也可以硬编码的来实现业务逻辑或数据库操作,这样的做法扩展性和可维护性极差
hibernate是操作数据库的一种框架,它简化了直接使用jdbc api的代码操作数据库的复杂性和冗余性
spring则完全是一种架构型的框架了,它不属于J2EE应用中的任何一个层,但它提供了对象依赖注入的思想,并且为每个层中遇到的实际问题提供了大量现成的模板类,使用这些模板类的方法很easy,大多数情况下只需要你在配置文件里配置一下就可以实现诸如事务管理或安全性控制这样的复杂问题.使用spring你的代码不依赖于框架,不依赖于具体实现,而依赖于接口,这对于实现松散耦合的架构来说是大有裨益的.spring不仅仅可以用于web应用,在普通的java应用中也可以使用spring.spring不是个复杂的框架,它的核心包很小并且具有轻量级的架构,基本上spring的核心只有2个东西:Ioc & AOP,Ioc其实就是工厂模式的一种体现,而AOP则来源AOP联盟,使用了拦截的思想...学了spring,现在写起代码觉得自己就像个白痴,有什么问题直接在配置文件里配置一下相关的模板类就OK了,它是真正为程序员减轻工作负担的框架.

谁能谈谈使用struts2的心得

最近做一个应用的时候用到了Jmesa(至于Jmesa的详细介绍,请Google),但是关于Struts2和Jmesa的资料特别少,费尽周折总算让他们两个正常运行了,现在把使用他们的一些心得写下来与大家分享。
版本:
Struts2 : 2.0.11
Spring : 2.5.1
Freemarker : 2.3.12
Jmesa : 2.2.9

Eclipse 3.3
对应Eclipse3.3的插件(没用MyEclipse,我依然活得不错,哈哈~)

Tomcat 6.0.*

Struts2与Freemarker的配置非常简单——根本不用配置,呵呵,关键点就在:怎么在Struts2环境下使用Jmesa?当然我只用到了Jmesa提供的Taglib,没用使用到其他高级功能。
(1)、Jmesa实现的Taglib只需要在页面给它一个 List等集合类型的变量就可以正常显示。使用分页功能需要加入下面这段脚本: 《script type="text/javascript"》
function onInvokeAction(id) ...{
setExportToLimit(id, ’’);
createHiddenInputFieldsForLimitAndSubmit(id);
}
《/script》
(2)、使用导出功能,此处以Excel为例。需要加入以下脚本: 《script type="text/javascript"》
function onInvokeExportAction(id) ...{
var parameterString = createParameterStringForLimit(id);
alert(parameterString);
location.href = ’${request.getContextPath()}/(此处为Action的Url)?’ + parameterString;
}
《/script》
还有关键的一点就是:Action要实现ServletRequestAware,ServletResponseAware这两个接口,并且加入以下代码: private HttpServletRequest request;
private HttpServletResponse response;
public void setServletRequest(HttpServletRequest request) ......{
this.request = request;
}

public void setServletResponse(HttpServletResponse response) ......{
this.response = response;
}
以上变量定义了实例变量request 和 response,为什么要这样做呢?看一下Jmesa的Tag example就知道了,如下:
TableFacade tableFacade = new TableFacadeImpl(id, request);
tableFacade.setItems(items);
tableFacade.setColumnProperties("password", "nickname");
tableFacade.setExportTypes(response, CSV, EXCEL); // Tell the tableFacade what exports to use.
Limit limit = tableFacade.getLimit();
if (limit.isExported()) ...{
tableFacade.getTable().setCaption("user");
tableFacade.getTable().getRow().getColumn("password").setTitle("password");
tableFacade.getTable().getRow().getColumn("nickname").setTitle("nickname");
tableFacade.render();
return null;
}
最关键的就是这两句了: TableFacade tableFacade = new TableFacadeImpl(id, request);
tableFacade.setExportTypes(response, CSV, EXCEL); // Tell the tableFacade what exports to use.
第一句中如果没有request对象的话,不能实例化TableFacade类型的对象。
第二句中如果没有response对象的话,就没有数据。
除此之外还有一点要注意的就是页面中定义的tableFacade的id一定要与Action中的id的值相同,此id起标识导出文件的文件名的作用,也唯一标识一个table。
好了只要注意以上这些Jmesa的这个Taglib就可以使用了。
至于在Freemarker中使用Jmesa的这个Taglib,有以下注意事项:
(1)、items的值(即数据集合)直接写变量名就可以
(2)、maxRows属性写为maxRows=8 不用加引号
以上两处注意事项不知道是不是Freemarker版本的问题,呵呵,有待检验。
注:Jmesa的功能非常强大,可以实现复杂的表格 。。。。。。 好东西 思想先进

为什么要用到struts2

Apache Struts在2000年5月由 Craig McClanahan 发起,并于2001年7月发布了1.0版本。从技术的角度上讲,它是在开发Web程序上的一次跨越性的进步,但更重要的是,它是在最恰当的时候出现在了人们的眼前。Struts 一出现便大受欢迎,更成为了以后几年内web开发的实际标准。
Struts2是Struts的下一代产品。最初提案Struts Ti所设想的发展方向,在Struts的现有代码的基础上是很难完成的。在发起提案的时候,Patrick Lightbody 把多个不同的Web框架的领导者邀请到了一起,希望大家能够协力完成一个通用的框架。但因种种原因,只有WebWork和Struts走到了一起。Struts2吸取了Struts1.x和WebWork的各种优点,更改了一些不足的地方,比如移走了原来WebWork中的IOC实现,引入Spring的IOC实现等。Struts2的目标就是----使Web开发更加容易。
今天摆在web开发人员面前的是众多的web开发框架,有些来自开源社区,有些来自商业公司,以满足各种web开发需要,到目前为止,有最少超过40种的web开发框架,那我们为什么要选择Struts2呢?下面列出一些Struts2的特性。
基于pojo易于测试
在Struts1.x中我需要Mock出这两个Http对象,使我们很难编写Action的单元测试,与Struts1.x相比,Struts2的Action 不再依赖于HttpServletRequest和HttpServletResponse对象,使我们能够更方便的针对Action编写单元测试。Struts2的单元测试看起来就像这样:
public void testEnrol(){
userinfoAction.setUsername("wangwu");
userinfoAction.setUserPassword("123456");
userinfoAction.setMail("");
String result = userinfoAction.enrol();
assertEquals("success",result);
}
与Spring的集成
与Struts1.x相比,Struts2不必再自己编写singleton,进一步的降低了程序间的耦合性,就Struts2内部本身而言,降低了框架本身的偶合性。
更加的模块化
与Struts1.X 相比,Struts2更加的模块化,可以轻松将配置信息按功能界限拆分成多个文件,便于管理和团队协作开发。
基于插件的框架
Struts2是一个基于插件的框架,社区中提供了很多实用的插件,比如jfreechat/json等等,使用这些插件可以简化我们的开发,加快开发进度。
大量的拦截器
Struts2本身提供了大量的可重用的拦截器,比如类型转换拦截器,很多时候我们从页面取得参数,这个时候它是String类型的,我们需要手动的把它转成Long型的或是Integer型的再使用,在Struts2中你不必这样做,Struts2中已经帮你做了这些事情了。当然我们也可以实现自定义的拦截器,比如:权限检查拦截器来做访问控制。
惯例大于配置
惯例大于配置是Struts2的架构目标,比如我们需要对页面输入的数据进行验证,只需取一个跟Action同名的xxAction-validation.xml文件,Struts2就会自动的进行验证。还有很多,比如国际化资源文件等。
多种视图的支持
多种视图的支持:jsp,freemarker,Veloctiy,只要你愿意,你甚至可以通过轻松的改造让它支持pdf,同一个项目中你可以支持多种视图。
申明式的异常处理
Struts2提供了方便的申明式异常处理,它看起来像这样:
《global-results》
《result name="licenceException"》/WEB-INF/pages/client/licenceException.jsp《/result》
《result name="payException"》/WEB-INF/pages/client/unPay.jsp《/result》
《result name="accessDeny"》/WEB-INF/pages/client/accessDeny.jsp《/result》
《/global-results》
《global-exception-mappings》
《exception-mapping exception="com.yeebobo.yeebox.web.licence.LicenceException" result="licenceException"/》
《exception-mapping exception="com.yeebobo.yeebox.web.licence.PayException" result="payException"/》
《/global-exception-mappings》
如果你以前是WebWork的用户,那么你会觉得Struts2和WebWork实在是太像了,当然如果你以前是Struts1.x的忠实用户,也能够快速的过渡到Struts2的开发中来,如果你重来没有用过任何框架,你也可以通过快速的学习,加入到Struts2的应用开发中来,因为它足够的简单。

第一个简单的struts2项目

是的,Struts自带过滤器,不过要配置一下
WEB.XML
《filter》
《filter-name》TestFilter《/filter-name》
《filter-class》com.wh.filter. TestFilter 《/filter-class》
《init-param》
《param-name》characterEncoding《/param-name》
《param-value》UTF-8《/param-value》
《/init-param》
《/filter》
《filter-mapping》
《filter-name》 TestFilter 《/filter-name》
《url-pattern》/*《/url-pattern》
《/filter-mapping》
2 JAVA
public class TestFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
}
}
开发一个过滤器必须实现Java定义好的javax.servlet.Filter接口:
这一接口含有三个过滤器必须执行的方法:
doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的FilterChain对象提供了后续过滤器所要调用的信息。如果该过滤器是过滤器链中的最后一个过滤器,则将请求交给被请求资源。也可以直接给客户端返回响应信息。
init(FilterConfig):由Web容器来调用完成过滤器的初始化工作。它保证了在第一次doFilter()调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。
destroy():由Web容器来调用来释放资源,doFilter()中的所有活动都被该实例终止后,调用该方法。

求一个小型的struts2 项目实例,仅供学习练习使用

Struts2验证框架验证用户注册
核心代码如下:
1.用户注册页面register.jsp
Java代码
1. 《form action="register.action" method="post"》
2. 《I》《font face="楷体_GB2312" color="#FF0000"》《s:fielderror /》
3. 《/font》
4. 《/I》
5. 《!-- 读取显示提示信息 --》
6. 《table》
7. 《tr》
8. 《td》
9. 用户名:
10. 《/td》
11. 《td》
12. 《input type="text" name="user.userName"》
13. 《/td》
14. 《/tr》
15. 《tr》
16. 《td》
17. 密码:
18. 《/td》
19. 《td》
20. 《input type="password" name="user.password"》
21. 《/td》
22. 《/tr》
23. 《tr》
24. 《td》
25. 确认密码:
26. 《/td》
27. 《td》
28. 《input type="password" name="user.rePassword"》
29. 《/td》
30. 《/tr》
31.
32. 《tr》
33. 《td》
34. 年龄:
35. 《/td》
36. 《td》
37. 《input type="text" name="user.age"》
38. 《/td》
39. 《/tr》
40. 《tr》
41. 《td》
42. 生日:
43. 《/td》
44. 《td》
45. 《input type="text" name="user.birthday"》
46. 《/td》
47. 《/tr》
48. 《tr》
49. 《td colspan="2"》
50. 《s:submit value="注册"》《/s:submit》
51. 《/td》
52. 《/tr》
53. 《/table》
54. 《/form》
2.注册成功欢迎页面welcome.jsp
Java代码
1. congratulations!${user.userName} 《br》
3.注册处理action RegisterAction
Java代码
1. package org.kingtoon.action;
***隐藏网址***
3. import org.apache.struts2.ServletActionContext;
4. import org.kingtoon.bean.User;
5. import com.opensymphony.xwork2.ActionSupport;
6. public class RegisterAction extends ActionSupport {
7.
8.
9. private User user;
10. @Override
11. public String execute() throws Exception {
12. if(!(user.getPassword().equals(user.getRePassword()))){
13. this.addFieldError("password", "请输入相同的密码");
14. return "input";
15. }
16. else
17. {
18. HttpServletRequest request = ServletActionContext.getRequest ();
19. request.setAttribute("user", user);
20. return SUCCESS;
21. }
22.
23. }
24. public User getUser() {
25. return user;
26. }
27. public void setUser(User user) {
28. this.user = user;
29. }
30. }
4. 用户Bean User.java
Java代码
1. package org.kingtoon.bean;
2. import java.util.Date;
3. public class User {
4. private String userName;
5. private String password;
6. private String rePassword;
7. private Integer age;
8. private Date birthday;
9. public Integer getAge() {
10. return age;
11. }
12. public void setAge(Integer age) {
13. this.age = age;
14. }
15. public Date getBirthday() {
16. return birthday;
17. }
18. public void setBirthday(Date birthday) {
19. this.birthday = birthday;
20. }
21. public String getPassword() {
22. return password;
23. }
24. public void setPassword(String password) {
25. this.password = password;
26. }
27. public String getRePassword() {
28. return rePassword;
29. }
30. public void setRePassword(String rePassword) {
31. this.rePassword = rePassword;
32. }
33. public String getUserName() {
34. return userName;
35. }
36. public void setUserName(String userName) {
37. this.userName = userName;
38. }
39.
40. }
5.配置验证文件RegisterAction-validation.xml
Java代码
1. 《validators》
2. 《field name="user.userName"》
3. 《!-- 验证字符串不能为空 --》
4. 《field-validator type="requiredstring"》
5. 《!-- 去空格 --》
6. 《param name="trim"》true《/param》
7. 《!-- 错误提示信息 --》
8. 《message》用户名不能为空《/message》
9. 《/field-validator》
10.
11. 《!-- 验证字符串长度 --》
12. 《field-validator type="stringlength"》
13. 《param name="minLength"》2《/param》
14. 《param name="maxLength"》20《/param》
15. 《message》用户名长度应在2到18个字符间《/message》
16. 《/field-validator》
17. 《/field》
18.
19. 《field name="user.password"》
20. 《field-validator type="requiredstring"》
21. 《param name="trim"》true《/param》
22. 《message》密码不能为空《/message》
23. 《/field-validator》
24.
25. 《field-validator type="stringlength"》
26. 《param name="minLength"》6《/param》
27. 《param name="maxLength"》18《/param》
28. 《message》密码长度应在6到18个字符之间《/message》
29. 《/field-validator》
30. 《/field》
31.
32. 《field name="user.age"》
33. 《field-validator type="int"》
34. 《param name="min"》1《/param》
35. 《param name="max"》150《/param》
36. 《message》年龄应在1到150之间《/message》
37. 《/field-validator》
38. 《/field》
39. 《!-- 验证字符串为日期类型 --》
40. 《field name="user.birthday"》
41. 《field-validator type="date"》
42. 《param name="min"》1900-01-01《/param》
43. 《param name="max"》2008-10-16《/param》
44. 《message》出生日期应在1900-01-01到2008-10-16《/message》
45. 《/field-validator》
46. 《/field》
47. 《/validators》
6.struts2框架默认加载的配置文件struts.xml
Java代码
1. 《struts》
2. 《constant name="struts.custom.i18n.resources" value="messageResource"》《/constant》
3.
4. 《package name="user" extends="struts-default"》
5. 《action name="register" class="org.kingtoon.action.RegisterAction"》
6. 《result name="success"》/welcome.jsp《/result》
7. 《result name="input"》/register.jsp《/result》
8. 《/action》
9. 《/package》
10. 《/struts》
7.web服务器启动时加载Struts 配置文件 web.xml
Java代码
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
5. 《filter》
6. 《filter-name》struts-cleanup《/filter-name》
7. 《filter-class》
8. org.apache.struts2.dispatcher.ActionContextCleanUp
9. 《/filter-class》
10. 《/filter》
11. 《filter》
12. 《filter-name》struts2《/filter-name》
13. 《filter-class》
14. org.apache.struts2.dispatcher.FilterDispatcher
15. 《/filter-class》
16. 《/filter》
17. 《filter-mapping》
18. 《filter-name》struts-cleanup《/filter-name》
19. 《url-pattern》/*《/url-pattern》
20. 《/filter-mapping》
21. 《filter-mapping》
22. 《filter-name》struts2《/filter-name》
23. 《url-pattern》/*《/url-pattern》
24. 《/filter-mapping》
25.
26. 《welcome-file-list》
27. 《welcome-file》register.jsp《/welcome-file》
28. 《/welcome-file-list》
29. 《/web-app》
至此,完毕.不过需要注意:
1.配置验证xml文档的名字有讲究:格式为:Action名字(类)-validation.xml,与类在同一包中;
2.验证文档里的《field-validator type=""》中的type类型要和VO中的User属性类型一致,否则会报类型转换错误

struts2.0的工作原理

客户端发出一个请求,服务器端StrutsPreparedAndExceuteFilter接收请求。

如果该请求是一个以 .action 结尾请求,则Struts2将请求转发至相应的Action,进行数据类型转换,如果数据类型转换出错,则返回到 input 指定的结果页面。

如果数据类型转换没有出错,则调用setXX 方法进行设值,如果使用了validate()验证方法(或者是使用了验证框架),则进行相应的验证。

如果验证出错,回到 input 指定的结果页面。

如果没有使用验证,或者验证没有出错,则执行 execute() 方法,返回到相应的页面。

扩展资料:

Struts2流程注解

当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器。

经过Other filters(SiteMesh ,etc),需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。

FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象。

ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N)一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面。

拦截器(Interceptor N)会再被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和核心控制器(FilterDispatcher)。

struts2的基本结构和构成

您好:Struts是一个在JSPModel2基础上实现的MVC框架,主要分为模型(Model)、视图(Viewer)和控制器(Controller)三部分,其主要的设计理念是通过控制器将表现逻辑和业务逻辑解耦,以提高系统的可维护性、可扩展性和可重用性。
(1)视图:视图部分主要由JSP页面组成,其中没有流程逻辑、业务逻辑和模型信息,只有标记。Struts自身包含了一组标记库(TagLib),这也是Struts的精华之一,灵活运用它们可以简化JSP页面的代码,提高开发效率。
(2)控制器:Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有来自客户端的请求并根据配置文件(struts-config.xml)中的定义将控制转移到适当的Action对象。
(3)模型:Struts没有定义具体Model层的实现,Model层通常是和业务逻辑紧密相关的,有持续化的要求。目前在商业领域和开源世界,都有一些优秀的工具可以为Model层的开发提供便利。

Struts2简介

   一 什么是Struts ?

  虽然Struts 号称是一个全新的框架 但这仅仅是相对Struts 而言 Struts 与Struts 相比 确实有很多革命性的改进 但它并不是新发布的新框架 而是在另一个赫赫有名的框架 WebWork基础上发展起来的 从某种程度上来讲 Struts 没有继承Struts 的血统 而是继承WebWork的血统 或者说 WebWork衍生出了Struts 而不是Struts 衍生了Struts 因为Struts 是WebWork的升级 而不是一个全新的框架 因此稳定性 性能等各方面都有很好的保证 而且吸收了Struts 和WebWork两者的优势 因此 是一个非常值得期待的框架

  Apache Struts 是一个优雅的 可扩展的JAVA EE web框架 框架设计的目标贯穿整个开发周期 从开发到发布 包括维护的整个过程

  Apache Struts 即是之前大家所熟知的WebWork 在经历了几年的各自发展后 WebWork和Struts社区决定合二为一 也即是Struts

   Struts 和Struts 的不同

   Action 类

  ◆Struts 要求Action类继承一个抽象基类 Struts 的一个普遍问题是使用抽象类编程而不是接口

  ◆Struts Action类可以实现一个Action接口 也可实现其他接口 使可选和定制的服务成为可能 Struts 提供一个ActionSupport基类去实现 常用的接口 Action接口不是必须的 任何有execute标识的POJO对象都可以用作Struts 的Action对象

   线程模式

  ◆Struts Action是单例模式并且必须是线程安全的 因为仅有Action的一个实例来处理所有的请求 单例策略限制了Struts Action能作的事 并且要在开发时特别小心 Action资源必须是线程安全的或同步的

  ◆Struts Action对象为每一个请求产生一个实例 因此没有线程安全问题 (实际上 servlet容器给每个请求产生许多可丢弃的对象 并且不会导致性能和垃圾回收问题)

   Servlet 依赖

  ◆Struts Action 依赖于Servlet API 因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法

  ◆Struts Action不依赖于容器 允许Action脱离容器单独被测试 如果需要 Struts Action仍然可以访问初始的request和response 但是 其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性

   可测性

  ◆测试Struts Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器) 一个第三方扩展——Struts TestCase——提供了一套Struts 的模拟对象(来进行测试)

  ◆Struts Action可以通过初始化 设置属性 调用方法来测试 依赖注入 支持也使测试更容易

   捕获输入

  ◆Struts 使用ActionForm对象捕获输入 所有的ActionForm必须继承一个基类 因为其他JavaBean不能用作ActionForm 开发者经常创建多余的类捕获输入 动态Bean(DynaBeans)可以作为创建传统ActionForm的选择 但是 开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)

  ◆ Struts 直接使用Action属性作为输入属性 消除了对第二个输入对象的需求 输入属性可能是有自己(子)属性的rich对象类型 Action属性能够通过web页面上的taglibs访问 Struts 也支持ActionForm模式 rich对象类型 包括业务对象 能够用作输入/输出对象 这种ModelDriven 特性简化了taglib对POJO输入对象的引用

   表达式语言

  ◆Struts 整合了JSTL 因此使用JSTL EL 这种EL有基本对象图遍历 但是对集合和索引属性的支持很弱

  ◆Struts 可以使用JSTL 但是也支持一个更强大和灵活的表达式语言—— Object Graph Notation Language (OGNL)

   绑定值到页面(view)

  ◆ Struts 使用标准JSP机制把对象绑定到页面中来访问

  ◆Struts 使用 ValueStack 技术 使taglib能够访问值而不需要把你的页面(view)和对象绑定起来 ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)

  类型转换 ◆Struts ActionForm 属性通常都是String类型 Struts 使用Commons Beanutils进行类型转换 每个类一个转换器 对每一个实例来说是不可配置的

  ◆Struts 使用OGNL进行类型转换 提供基本和常用对象的转换器

  校验 ◆Struts 支持在ActionForm的validate方法中手动校验 或者通过Commons Validator的扩展来校验 同一个类可以有不同的校验内容 但不能校验子对象

  ◆Struts 支持通过validate方法和XWork校验框架来进行校验 XWork校验框架使用为属性类类型定义的校验和内容校验 来支持chain校验子属性Action执行的控制 ◆Struts 支持每一个模块有单独的Request Processors(生命周期) 但是模块中的所有Action必须共享相同的生命周期

  ◆Struts 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期 堆栈能够根据需要和不同的Action一起使用

   Struts 的工作流程图

  

   工作流程图

  工作流程当接收到一个request Interceptor做一些拦截或者初始的工作当外部的ervletrequest到来时初始到了servlet容器 传递给一个标准的过滤器链ActionContextCleanUp这个在集成插件方面非常有用Other filters(SitMesh etc)

  调用FilterDispatecher会去查找相应的ActionMapper如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy ActionProxy将会通过ConfigurationManager来查找配置struts xml下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)

  一旦action返回 会查找相应的Result Result类型可以是 jsp或者freeMark 等这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)

lishixinzhi/Article/program/Java/ky/201311/28090

关于用struts2实现一个板块和java struts2是干什么用的的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

用struts2实现一个板块(java struts2是干什么用的)

本文编辑:admin

更多文章:


delete where(mysql delete中where后能套用select么)

delete where(mysql delete中where后能套用select么)

大家好,关于delete where很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于mysql delete中where后能套用select么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注

2026年7月11日 03:15

php+mysql动态网站开发黑马程序员(PHP+MySQL能做什么)

php+mysql动态网站开发黑马程序员(PHP+MySQL能做什么)

大家好,关于php+mysql动态网站开发黑马程序员很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于PHP+MySQL能做什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对

2025年8月12日 02:15

眼镜王蛇去毒腺(大理工地发现巨型眼镜王蛇,关于这种蛇你知道多少呢)

眼镜王蛇去毒腺(大理工地发现巨型眼镜王蛇,关于这种蛇你知道多少呢)

“眼镜王蛇去毒腺”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看眼镜王蛇去毒腺(大理工地发现巨型眼镜王蛇,关于这种蛇你知道多少呢)!本文目录大理工地发现巨型眼镜王蛇,关于这种蛇你知道多少呢这种无毒眼镜蛇,真的没有毒吗眼镜蛇嘴

2026年8月17日 03:45

静态页面免费下载(怎么样能把网站上的动态网页保存下来完全成为静态网页)

静态页面免费下载(怎么样能把网站上的动态网页保存下来完全成为静态网页)

大家好,关于静态页面免费下载很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于怎么样能把网站上的动态网页保存下来完全成为静态网页的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对

2026年2月24日 05:45

大疆mini2开启fcc教程(请问大疆mini遥控器能充电吗)

大疆mini2开启fcc教程(请问大疆mini遥控器能充电吗)

本篇文章给大家谈谈大疆mini2开启fcc教程,以及请问大疆mini遥控器能充电吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录请问大疆mini遥控器能充电吗买大疆mini2还是air2大疆mini遥控器怎么充电请问大疆mi

2026年6月7日 22:45

mocha javascript(javascript用什么开发工具)

mocha javascript(javascript用什么开发工具)

大家好,mocha javascript相信很多的网友都不是很明白,包括javascript用什么开发工具也是一样,不过没有关系,接下来就来为大家分享关于mocha javascript和javascript用什么开发工具的一些知识点,大家

2025年7月17日 04:30

the achaemenid empire of(Over two thousand years ago Rome(罗马)was the cente)

the achaemenid empire of(Over two thousand years ago Rome(罗马)was the cente)

今天给各位分享Over two thousand years ago Rome(罗马)was the cente的知识,其中也会对Over two thousand years ago Rome(罗马)was the cente进行解释,如

2026年6月1日 05:15

为什么安装了silverlight用不了(为什么下载安装完成silverlight双击点开还是打不开,只会跳出这个页面)

为什么安装了silverlight用不了(为什么下载安装完成silverlight双击点开还是打不开,只会跳出这个页面)

今天给各位分享为什么下载安装完成silverlight双击点开还是打不开,只会跳出这个页面的知识,其中也会对为什么下载安装完成silverlight双击点开还是打不开,只会跳出这个页面进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站

2025年5月24日 20:45

directionsforuse什么意思中文(英语考试directions是什么)

directionsforuse什么意思中文(英语考试directions是什么)

大家好,directionsforuse什么意思中文相信很多的网友都不是很明白,包括英语考试directions是什么也是一样,不过没有关系,接下来就来为大家分享关于directionsforuse什么意思中文和英语考试directions

2025年12月10日 02:45

century love 世纪情歌(张学有 有咩好听ge 歌)

century love 世纪情歌(张学有 有咩好听ge 歌)

其实century love 世纪情歌的问题并不复杂,但是又很多的朋友都不太了解张学有 有咩好听ge 歌,因此呢,今天小编就来为大家分享century love 世纪情歌的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本

2026年1月4日 21:15

c++字符串是什么(C++中字符串大小指的是什么啊)

c++字符串是什么(C++中字符串大小指的是什么啊)

大家好,c++字符串是什么相信很多的网友都不是很明白,包括C++中字符串大小指的是什么啊也是一样,不过没有关系,接下来就来为大家分享关于c++字符串是什么和C++中字符串大小指的是什么啊的一些知识点,大家可以关注收藏,免得下次来找不到哦,下

2025年6月18日 04:15

wire类型的缺省值(verilog表达式的数据类型)

wire类型的缺省值(verilog表达式的数据类型)

大家好,如果您还对wire类型的缺省值不太了解,没有关系,今天就由本站为大家分享wire类型的缺省值的知识,包括verilog表达式的数据类型的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录verilog表达式的数

2026年5月2日 04:15

字符串什么是一个字符(什么是字符串)

字符串什么是一个字符(什么是字符串)

今天给各位分享什么是字符串的知识,其中也会对什么是字符串进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录什么是字符串字符和字符串区别是什么什么是字符,怎样才算一个字符什么是字符什么是字符什么是字符,怎样才算一个

2025年9月1日 09:15

php开发的cms(请问PHP中的CMS是什么意思)

php开发的cms(请问PHP中的CMS是什么意思)

本篇文章给大家谈谈php开发的cms,以及请问PHP中的CMS是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录请问PHP中的CMS是什么意思phpcms是什么phpcms怎么做网站php的cms系统哪个好phpcms

2025年9月8日 23:00

individual语素(瞀可以怎样组词)

individual语素(瞀可以怎样组词)

各位老铁们,大家好,今天由我来为大家分享individual语素,以及瞀可以怎样组词的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录瞀可以怎样组词“

2026年5月6日 20:30

permission的动词过去分词(refuse的用法)

permission的动词过去分词(refuse的用法)

大家好,如果您还对permission的动词过去分词不太了解,没有关系,今天就由本站为大家分享permission的动词过去分词的知识,包括refuse的用法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录refu

2026年1月2日 01:00

数据库存储文件(数据库文件是什么格式啊)

数据库存储文件(数据库文件是什么格式啊)

本篇文章给大家谈谈数据库存储文件,以及数据库文件是什么格式啊对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录数据库文件是什么格式啊数据库中存储的是什么数据库怎么保存文件想把文件存入数据库怎么办数据库文件是什么格式啊数据库文件的

2026年8月30日 13:30

单元测试家长签字的话(试卷上家长签字写话怎么写一年级)

单元测试家长签字的话(试卷上家长签字写话怎么写一年级)

其实单元测试家长签字的话的问题并不复杂,但是又很多的朋友都不太了解试卷上家长签字写话怎么写一年级,因此呢,今天小编就来为大家分享单元测试家长签字的话的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录试卷上家长签字写

2025年11月13日 15:30

bmp是什么格式(bmp是什么文件格式)

bmp是什么格式(bmp是什么文件格式)

大家好,关于bmp是什么格式很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于bmp是什么文件格式的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录bmp是

2025年6月3日 01:30

linux常用命令chmod的使用(Linux chmod命令及权限的理解)

linux常用命令chmod的使用(Linux chmod命令及权限的理解)

本篇文章给大家谈谈linux常用命令chmod的使用,以及Linux chmod命令及权限的理解对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文

2026年1月21日 17:15

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索