前言-
本文对应《Struts2 in action》第三章
Struts2框架很强大,强大到有些地方使用的时候不明不白地,无论是约定还是OGNL的使用,他们真的很像是没有头绪的代码。。。
仅为本人的读书笔记,如有错误请联系我。
正文-
书上一共介绍了三种数据转移
第一种是Action先作为Javabean接下数据,然后再设置到User中
提交的表单: <s:form action="Register"> <s:textfield name="username" label="Username"/> <s:password name="password" label="Password"/> <s:textfield name="portfolioName" label="Enter a name for your portfolio"/> <s:submit/> </s:form> Action类 public class Register extends ActionSupport { public String execute(){ /* * Create and move the data onto our application domain object, user. */ User user = new User(); user.setPassword( getPassword() ); user.setPortfolioName( getPortfolioName() ); user.setUsername( getUsername() ); getPortfolioService().createAccount( user ); return SUCCESS; } /* JavaBeans Properties to Receive Request Parameters */ private String username; private String password; private String portfolioName; public String getPortfolioName() { return portfolioName; } 。。。get与set。。。 public PortfolioService getPortfolioService( ) { return new PortfolioService(); } } User类 public class User { private String username; private String password; private String portfolioName; private Double age; private Date birthday; private String firstName; private String lastName; private String email; private boolean receiveJunkMail; private Map portfolios = new HashMap(); 。。。。get与set。。。 }
表单向Action提交了两个数据,分别是username与password,这里username和password是OGNL表达式,对应Action类中相应的属性。感觉上Action再这里充当了Javabean。在execute()方法中,将username和password设置到了User对象上。然后调用PortfolioService的createAccount( )创建新用户。
(这些图是我自己画的。。。不对请尽快联系我。)
第二种则是使用“对象支持(ObjectBacked)”
Action中出现的属性不是username和password,而是一个复杂的User 对象,因为User本身就存在同名属性username和password。所以Action将User对象作为属性去接表单传过来的数值。
Jsp表单 <s:form action="RegisterOB"> <s:textfield name="user.username" label="Username"/> <s:password name="user.password" label="Password"/> <s:textfield name="user.portfolioName" label="Enter a name for your portfolio"/> <s:submit/> </s:form> Action类 public class ObjectBackedRegister extends ActionSupport { public String execute(){ getPortfolioService().createAccount( user ); return SUCCESS; } /* JavaBeans Properties to Receive Request Parameters */ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public PortfolioService getPortfolioService( ) { return new PortfolioService(); } }
此时表单OGNL表达式就需要深度引用,将目的地指向user对象下的属性。
(这些图是我自己画的。。。不对请尽快联系我。)
第三种则是“模型驱动(ModelDriven)”
,她需要我们的Action类实现ModelDriven接口,此接口下只有一个方法——getModel(),它会返回一个Object类型。
Jsp表单 <s:form action="RegisterMD"> <s:textfield name="username" label="Username"/> <s:password name="password" label="Password"/> <s:textfield name="portfolioName" label="Enter a name for your portfolio"/> <s:submit/> </s:form> Action类 public class ModelDrivenRegister extends ActionSupport implements ModelDriven { public String execute(){ getPortfolioService().createAccount( user ); return SUCCESS; } /* Instance field and getModel() to support the ModelDriven interface */ private User user = new User(); public Object getModel() { return user; } public PortfolioService getPortfolioService( ) { return new PortfolioService(); } }
这里,代码里先实例化了一个User对象user,再让getModel()返回一个user,然后。。。表单的数值就传过来了。
感觉就好像Action将user扔到了框架里,然后getModel()返回的时候就把user装满了数据带了回来。。。
(这些图是我自己画的。。。不对请尽快联系我。)
其实不然,下一章关于数据进出框架和OGNL都有说明
Struts2我们都叫他拦截器不是没有道理的,Struts建立再Servlet API上,当数据提交时,会到一个叫ValueStack的地方,如上图所示,我们的Action已经在那里等候多时了。此时“Params”拦截器会把请求参数的name值解析成为一个OGNL表达式,用来在ValueStack上定位正确的目的地,这个过程在第二种传值方法中尤为明显,OGNL就像我们平时编写Java程序一样将数据深度引用到了正确的位置。
后记-
其实我刚开始这一点的时候也是一头雾水,什么是OGNL?为什么统一写法之后就能将值传到正确的地方?接着往后看现在我有点弄明白了,但是还有点问题。
不过我觉得如果仅仅是关于Struts表单提交数据,不管是对象支持(OB)还有模型驱动(MD),我应该已经将我的理解记录下来了,已经达到笔记的目的了。
希望这文章能帮到你