论坛首页 Java企业应用论坛

Nice Struts~鸡肋问题解决之道

浏览 10217 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-05-28  
icewubin 写道
说句题外话,因为我们公司用的是SpringMVC,前端页面逻辑用的是通用配置,平时要增加一个前端控制类几乎不用写任何配置文件,最近一直没时间转向Struts2(还是喜欢Struts2的action的状态属性线程安全,能更方便的封装一些工具方法)。

但我总觉得,Struts2也可以多采用一些约定大于配置的技巧,使得增加一个action不需要写这么多行配置。主要原因是,配置文件中80%的内容是不需要单独配置的(也就是说对于这80%不可能出现只改配置文件而不改代码的情况发生,此时配置文件可以认为等同于代码,这部分的逻辑直接写进代码,而不写在配置文件中)。

据说SpringSide3做到了零配置,我不是说一定要零配置,而是建议借鉴一下约定大于配置的思想,没那么多可能要修改的地方需要配置文件,真的要修改了,直接改代码好了,本来层次划分清楚,action中的代码已经很精简了,页面逻辑就从配置文件转移到action中不是蛮好的么?

struts2 已经有一个插件支持类似rest的风格,不需要再在xml里一个个配置action了,可以说约定》配置的插件!你对这个还不满意!
0 请登录后投票
   发表时间:2009-05-28  
呵呵 楼主不要不高兴啊 我认为没必要在struts上花太大心思
0 请登录后投票
   发表时间:2009-05-28  
Java世界是否有类似的Django的东东?
0 请登录后投票
   发表时间:2009-05-28   最后修改:2009-05-28
icewubin 写道
说句题外话,因为我们公司用的是SpringMVC,前端页面逻辑用的是通用配置,平时要增加一个前端控<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>制类<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>几乎<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>不用写任何配置文件,最近一直没时间转向Struts2(还是喜欢Struts2的action的状态属性线程安全,能更方便的封装一些工具方法)。

但我总觉得,Struts2也可以多采用一些约定大于配置的技巧,使得增加一个action不需要写这么多行配置。主要原因是,配置文件中80%的内容是不需要单独配置的(也就是说对于这80%不可能出现只改配置文件而不改代码的情况发生,此时配置文件可以认为等同于代码,这部分的逻辑直接写进代码,而不写在配置文件中)。

据说SpringSide3做到了零配置,我不是说一定要零配置,而是建议借鉴一下约定大于配置的思想,没那么多可能要修改的地方需要配置文件,真的要修改了,直接改代码好了,本来层次划分清楚,action中的代码已经很精简了,页面逻辑就从配置文件转移到action中不是蛮好的么?


把vraptor推荐给你,代码说话:
@Component("user")
public class UserAction {
	static final Logger LOG = Logger.getLogger(UserAction.class);
	
	@In
	private VRaptorServletRequest request;
	
	@Out(scope = ScopeType.SESSION)
	private User currentUser;

	private UserService userService;

	public UserAction(UserService userService) {
		this.userService = userService;
	}

	@Validate(params = { "user" })
	public void save(User user) {
		userService.saveUser(user);
		currentUser = user;
	}
	
	@Validate(params = { "user" })
	public void update(User user) throws TestException{
		User user_indb = userService.getUser(user.getUserId());
		user_indb.setUsername(user.getUsername());
		user_indb.setPassword(user.getPassword());
		user_indb.setEmail(user.getEmail());
		user_indb.setPhone(user.getPhone());
		userService.updateUser(user_indb);
		User currentUser = (User)(request.getSession().getAttribute("currentUser"));
		currentUser = null;
	}

	public void validateSave(ValidationErrors errors, User user) {
		if (!(user.getPassword().equals(user.getRepassword())))
			errors.add(new Message("password-validate",
					"re password is invalid"));
		if (userService.containsUserWithLogin(user.getUsername())) {
			errors.add(new Message("username_exists-validate", "username_already_exists"));
		}
		if (userService.contaisUserWithEmail(user.getEmail())) {
			errors.add(new Message("email_exists-validate", "Email_already_exists"));
		}

	}
	public void validateUpdate(ValidationErrors errors, User user) {
		User user_indb = userService.getUser(user.getUserId());
		if(!(user.getUsername().equals(user_indb.getUsername()))){
			if (userService.containsUserWithLogin(user.getUsername())) {
				errors.add(new Message("username_exists-validate", "username_already_exists"));
			}
		}
		if(!(user.getEmail().equals(user_indb.getEmail()))){
			if (userService.contaisUserWithEmail(user.getEmail())) {
				errors.add(new Message("email_exists-validate", "Email_already_exists"));
			}
		}
		if (!(user.getPassword().equals(user.getRepassword())))
			errors.add(new Message("password-validate",
					"re password is invalid"));
	}

}



@In,@Out,@Parameter三个注解搞定页面和Model的传值
写spring的插件,通过构造函数注射UserService

验证约定在方法上,such as:
public void validateSave(ValidationErrors errors, User user) {
}


或者在Model中
@Email
private String email;


Action通过@Component让框架自动扫描

零配置约定,如果UserAction的save方法执行成功,自动转到一个约定的user/save.ok.jsp,这个路径可以用正则重写

要访问Servlet的API ,看怎么个优雅法:
@In
private VRaptorServletRequest request;


类似struts2框架使用优雅的拦截器,比如我的文件上传Action
@Component
@InterceptedBy( MyMultipartRequestInterceptor.class )
public class UploadAction {
	private UploadService uploadService;
	
	@In
	private VRaptorServletRequest request;
	
	@In(required=false)
    private UploadedFileInformation fileInfo;
	@Out
	@Parameter
	private Page<UploadFile> page = new Page<UploadFile>();

}


在我们公司已经有相当多的人扔掉了struts2,爱上了vraptor,引用该框架官网上的一段话吧:
Guilherme Silveira 写道

It is known that there is no silver bullet, don't try to use something that claims to be the one, VRaptor is not one, it simply solves some problems that other frameworks left behind or created when they tried to solve everything at the same time.

If you need an easy to use controller and your team needs to start producing some handsome code today, VRaptor is a good starting point.


研读vraptor框架的源码,我发现了艺术!是好东西就拿出来分享一下吧!有vraptor开发经验的希望多多交流!!
0 请登录后投票
   发表时间:2009-05-28  
kjj 写道
struts2 已经有一个插件支持类似rest的风格,不需要再在xml里一个个配置action了,可以说约定》配置的插件!你对这个还不满意!

啊?没有不满意,我就是建议楼主这么做啊。我是想引出后续的话,这些零配置的东西其实是变相的“配”在action中,所以action这一层并不是鸡肋。
0 请登录后投票
   发表时间:2009-05-28  
icewubin 写道
黑暗浪子 写道
用SpringMVC的很少啊。
呵呵,有JROR嘛?比较支持这个。

要考虑新人的学习成本和学习积极性,Struts2的资料还是很多的,新人们也认为这玩意儿学了不愁找不到工作。

还有就是做方案的时候,评审方案的人都认识Struts2,其他的框架有些人就不认识。


个人觉得如果评审的人只知道struts2,其他不是很明了的话,那是没资格做评审的。
连各个框架优缺点都不清楚,怎么能去评审?
还有seam,不知道有人有什么好见地。
我最近听说银联的人开始大量采用seam框架。

1 请登录后投票
   发表时间:2009-05-28  
黑暗浪子 写道
个人觉得如果评审的人只知道struts2,其他不是很明了的话,那是没资格做评审的。
连各个框架优缺点都不清楚,怎么能去评审?
还有seam,不知道有人有什么好见地。
我最近听说银联的人开始大量采用seam框架。


严重关切严重同意
0 请登录后投票
   发表时间:2009-05-28   最后修改:2009-05-28
黑暗浪子 写道
icewubin 写道
黑暗浪子 写道
用SpringMVC的很少啊。
呵呵,有JROR嘛?比较支持这个。

要考虑新人的学习成本和学习积极性,Struts2的资料还是很多的,新人们也认为这玩意儿学了不愁找不到工作。

还有就是做方案的时候,评审方案的人都认识Struts2,其他的框架有些人就不认识。


个人觉得如果评审的人只知道struts2,其他不是很明了的话,那是没资格做评审的。
连各个框架优缺点都不清楚,怎么能去评审?
还有seam,不知道有人有什么好见地。
我最近听说银联的人开始大量采用seam框架。


我这里说的评审不是公司里的人(在我们公司这部分是我说了算的),往往是客户那里的人,我们作为乙方如何去评判甲方是否有资格做评审。

客户那里总有些自以为是的IT部(或者信息公司)的人,这是没办法的事。

至于Seam么,只要他们公司有个大牛能够搞定相关的一些攻坚问题,订好规范,没什么问题,完全可以采用。
0 请登录后投票
   发表时间:2009-05-28  
to:楼上
-------------
我这里说的评审不是公司里的人,往往是客户那里的人,我们作为乙方如何去评判客户是否有资格做评审。
客户那里总有些自以为是的IT部的人,这是没办法的事。
----------------------------------------------------------
我们只讨论技术层面的问题,你提的这些问题提当然确实存在,但是我们是无能为力的,所以不要把这种因素纳入我们的话题,那样就大了,呵呵,华山论剑只谈剑术。
0 请登录后投票
   发表时间:2009-05-28   最后修改:2009-05-28
betafox 写道
to:楼上
-------------
我这里说的评审不是公司里的人,往往是客户那里的人,我们作为乙方如何去评判客户是否有资格做评审。
客户那里总有些自以为是的IT部的人,这是没办法的事。
----------------------------------------------------------
我们只讨论技术层面的问题,你提的这些问题提当然确实存在,但是我们是无能为力的,所以不要把这种因素纳入我们的话题,那样就大了,呵呵,华山论剑只谈剑术。

这个不可能的,就好比单考虑技术层面普元EOS的东西没什么特别不好的地方,但是公司里就是绝大部分的人不愿意做EOS相关的东西,想留住人必须高薪,这个成本必须要考虑的。再或者我认为JavaFX技术体系也不错嘛,但是想想这东西能成功么?(历史上优秀的技术最终没有成功的多了去了)

一个技术相关的成本有很多,学习成本之类的难道不考虑么?

回过头来说,客户也不会很无理的说,“我没听说过,不能用这个方案”,例如我们现在用的SpringMVC也算是不太普及的MVC框架,客户知道我们一直在用这个框架,所以不会有太多意见,有分歧早就沟通过了。但是如果我们公司突然要换框架,他们当然有询问为什么要换,理由风险等等等。

假设我说要换“Tapestry”,好,你想想他们会怎么做,首先就是google,然后旁敲侧击的问同行等各种手段来了解,而国内Tapestry的好评和成功案例并不是太多,无形中增加我们乙方的成本。

还有,比如现在有一个系统,不考虑甲方、不考虑技术学习成本、不考虑维护成本、不考虑交接成本,需要招人,马上就要开工,而这个系统既可以用存储过程、也可以J2EE(Struts2)、也可以ROR,光是一个招人成本就决定了,我一定是招J2EE(Struts2)的。

当然有了这么多假设好像没有意义,有点先有鸡还是先有蛋的问题,那就回头来说为什么国内招Struts2的好招又便宜呢?表面上看是因为很多培训学校教这个,很多公司确实也是用这个。再深究为什么会产生“表面上看到”的原因呢?间接证明Struts2确实是一个优秀的框架(即使曾经是),能够(相对的)提高生产效率、减少维护成本等,所以慢慢在国内普及(当然还有Struts1大大的功劳)。
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics