- 浏览: 69451 次
- 性别:
- 来自: 绍兴
最新评论
一个好的基类可以帮助开发者减少很多开发工作,像我这种爱偷懒的人比较喜欢在这方面较真,项目需求和时间计划出来后工作进度就靠个人效率了,如果不花点时间把重复的劳动工作封装一下,那经常加班加点也怨不得别人.
今天分享下我专为ajax访问封装的action基类,依然用的全注解方式,主要使用基于泛型的模板模式实现;先来看下类头吧
首先他是一个泛型抽象类,子类需要传参一个BaseEntity的派生类,同时子类还需要实现查询列表,查询单个,删除,新增修改这几个抽象方法.还定义了一个Result注解,他的作用是当action方法返回"jsonall"时,会把当前action上下文中所有的属性转成json数据返回给web端,excludeNullProperties:true就是过滤掉值为null的属性
然后再来看其他代码
基类定义了常用的属性包括success(操作是否成功)msg(操作结果信息)limit start(分页条件)totalProperty(查询总条数) 比较重要的是 entity和searchList两个属性,他们都是泛型类型的,他们在程序执行中既承担参数的载体又作为结果的返回,比如通过用户名查用户信息时,前台会传递entity.name到entity属性,后台会把查询到的entity信息赋值个entity,这一切都是泛型在控制节奏.对于前端来讲节省了很多规范成本.基类还定义了常用的增删改方法,注意这些方法都是直接对外访问的(可以看下web架构2convention插件),子类只负责实现业务,具体的接口和逻辑都在这个基类完成,比如分页功能基类会把用户端的参数封装成一个page对象传递个子类,一个很典型的模板模式列子.看到这里如果你还看不出其中的好处那确实有点跟不上节奏了,基类定义的 success msg entity searchList对于web端都是统一的,调用任何模块的返回值都是这些属性,查列表信息就从searchList获取,明细信息就从entity取 操作是否成功就从success取等等,而且对web端来说封装公共的grid的插件也变的容易的多,再来看看子类,代码会变的清爽的多
这是一个关于角色的action,它传递给基类的泛型是Role,它实现了增删改查那几个方法而且不用关心返回值,同时它也可以有自己的方法saveRolePermission,拿searchList方法来说当web端通过role!query.action访问(convention插件)的时候,会先走到基类的,然后通过基类访问该类的searchList方法对searchList进行赋值,然后统一返回给web端,最后展示下我在Extjs4中封装的公共的Stroe,因为属性的约定让事情变的非常简单
今天分享下我专为ajax访问封装的action基类,依然用的全注解方式,主要使用基于泛型的模板模式实现;先来看下类头吧
@Results({ // 返回Action堆栈内所有对象 ignoreHierarchy=false(取消父子分离,将父类的属性也作为json传递) // excludeNullProperties 排除为null的对象 // excludeProperties 排除指定属性 @Result(name = "jsonall", type = "json", params = { "excludeNullProperties", "true"}) }) @SuppressWarnings("serial") public abstract class JsonBaseAction<T extends BaseEntity> extends ActionSupport { // 需要子类实现的查询列表方法 public abstract void searchList(Page page) throws ServiceException; // 查询明细 public abstract void searchEntity() throws ServiceException; // 删除 public abstract void deleteEntity() throws ServiceException; // 新增或修改 public abstract void addOrUpdEntity() throws ServiceException; public abstract void setEntity();
首先他是一个泛型抽象类,子类需要传参一个BaseEntity的派生类,同时子类还需要实现查询列表,查询单个,删除,新增修改这几个抽象方法.还定义了一个Result注解,他的作用是当action方法返回"jsonall"时,会把当前action上下文中所有的属性转成json数据返回给web端,excludeNullProperties:true就是过滤掉值为null的属性
然后再来看其他代码
// 返回所有josn的字符串 public static final String JSON = "jsonall"; // json返回执行结果 private boolean success = true; // json返回执行信息 private String msg; private Integer start; private Integer limit; private Long totalProperty; protected void putResult(boolean success, String msg) { this.setSuccess(success); this.setMsg(msg); } public JsonBaseAction(){ setEntity(); } // 查询的集合 protected List<T> searchList = null; // 明细实体 也是作为参数的载体 protected T entity; public String query() { Page p = new Page(); if(limit!=null) p.setPageSize(limit); if(start!=null) p.setCurrentPage(start); try { searchList(p); totalProperty = p.getCount(); } catch (ServiceException e) { this.setSuccess(false); this.setMsg(e.getMessage()); } catch (Exception e){ this.setSuccess(false); this.setMsg(e.getMessage()); e.printStackTrace(); } if (this.success) { this.setMsg("查询成功"); } return JSON; } public String find() { try { searchEntity(); } catch (ServiceException e) { this.setSuccess(false); this.setMsg(e.getMessage()); } if (this.success) { this.setMsg("查询成功"); } return JSON; } public String save(){ try { addOrUpdEntity(); } catch (ServiceException e) { this.setSuccess(false); this.setMsg(e.getMessage()); } if (this.success) { this.setMsg("保存成功"); } return JSON; } public String delete(){ try { deleteEntity(); } catch (ServiceException e) { this.setSuccess(false); this.setMsg(e.getMessage()); } if (this.success) { this.setMsg("删除成功"); } return JSON; }
基类定义了常用的属性包括success(操作是否成功)msg(操作结果信息)limit start(分页条件)totalProperty(查询总条数) 比较重要的是 entity和searchList两个属性,他们都是泛型类型的,他们在程序执行中既承担参数的载体又作为结果的返回,比如通过用户名查用户信息时,前台会传递entity.name到entity属性,后台会把查询到的entity信息赋值个entity,这一切都是泛型在控制节奏.对于前端来讲节省了很多规范成本.基类还定义了常用的增删改方法,注意这些方法都是直接对外访问的(可以看下web架构2convention插件),子类只负责实现业务,具体的接口和逻辑都在这个基类完成,比如分页功能基类会把用户端的参数封装成一个page对象传递个子类,一个很典型的模板模式列子.看到这里如果你还看不出其中的好处那确实有点跟不上节奏了,基类定义的 success msg entity searchList对于web端都是统一的,调用任何模块的返回值都是这些属性,查列表信息就从searchList获取,明细信息就从entity取 操作是否成功就从success取等等,而且对web端来说封装公共的grid的插件也变的容易的多,再来看看子类,代码会变的清爽的多
package cn.sdh.action; import java.util.List; import org.apache.struts2.convention.annotation.Namespace; import org.springframework.beans.factory.annotation.Autowired; import cn.sdh.common.Page; import cn.sdh.common.base.JsonBaseAction; import cn.sdh.common.exception.ServiceException; import cn.sdh.entity.Role; import cn.sdh.service.RoleService; import cn.sdh.utils.MyJsonUtil; @Namespace("/") @SuppressWarnings("serial") public class RoleAction extends JsonBaseAction<Role> { @Autowired private RoleService roleService; @Override public void searchList(Page page) { try { searchList = roleService.query(entity); } catch (ServiceException e) { this.putResult(false, e.getMsg()); } } @Override public void searchEntity() { try { roleService.findById(entity); } catch (ServiceException e) { this.putResult(false, e.getMsg()); } } @Override public void deleteEntity() { try { String [] idsarr = getMsg().split(","); roleService.deletes(idsarr); } catch (ServiceException e) { this.putResult(false, e.getMsg()); } } @Override public void addOrUpdEntity() { @SuppressWarnings("unchecked") List<Role> roleList = MyJsonUtil.getObjectsByJson(getMsg(), Role.class); try { roleService.saves(roleList); } catch (ServiceException e) { this.putResult(false, e.getMsg()); } } /** * 保存角色拥有的权限 * @return */ public String saveRolePermission(){ try { roleService.saveRolePermission(entity.getId(), getMsg()); this.putResult(true, "保存成功"); } catch (ServiceException e){ this.putResult(false, e.getMsg()); } return JSON; } @Override public void setEntity() { entity = new Role(); } }
这是一个关于角色的action,它传递给基类的泛型是Role,它实现了增删改查那几个方法而且不用关心返回值,同时它也可以有自己的方法saveRolePermission,拿searchList方法来说当web端通过role!query.action访问(convention插件)的时候,会先走到基类的,然后通过基类访问该类的searchList方法对searchList进行赋值,然后统一返回给web端,最后展示下我在Extjs4中封装的公共的Stroe,因为属性的约定让事情变的非常简单
Ext.define("app.base.store", { extend : "Ext.data.Store", pageSize:50, sorters: [{ property: 'id', direction: 'DESC' }], constructor : function(config){ this.proxy = { type:'ajax', reader : { type:'json', root:"searchList", totalProperty:'totalProperty' }, actionMethods: { read: 'POST' }, url : config.url }; this.model = config.model; this.listeners = { load : function(s,r,f,o,e){ if(!f){ app.alert("查询失败"); } } }; this.callParent(); } });
- code.rar (2.3 KB)
- 下载次数: 1
发表评论
-
Web开发学习13聊聊java反射
2016-07-12 18:41 762很喜欢一本叫《走出软件作坊》的书,其中有一句话让我较为深刻,“ ... -
Web开发学习12 浅谈设计模式
2016-07-01 13:33 1322在我刚接触 ... -
Web开发学习11 全局缓存控制
2015-10-12 14:27 743缓存用的好可以减少数据库的压力,在大并发的情况下极大的提升服务 ... -
Web开发学习10 hadoop实战
2015-10-09 14:02 758前一篇说到项目记录了很多埋点日志,当有一天项目需求需要对这些日 ... -
Web开发学习(9)全局埋点
2015-07-27 11:10 2018埋点的作用是把客户端每次访问服务端的操作记录下来,包括请求连接 ... -
Web开发学习7按钮级别权限控制
2015-07-23 16:21 13340这个功能的思路是自己原创的,没看过其他例子,其实是在做之前网上 ... -
Web开发学习6添加liqiubase
2015-07-22 14:29 1461开发过程中经常碰到数据库更改的情况,在日常环境下如果每位开发人 ... -
浅列JavaEnum
2014-01-05 16:42 787enum Province{ ZHEJIANG,SHANGHA ... -
maven常用命令
2013-07-08 10:20 7911、创建普通Java项目: ... -
canvas绘制科赫雪花
2012-12-20 17:24 2158<html> <head> ... -
html5 audio与video方法属性事件概括
2012-12-20 14:46 1119play() 继续播放 pause() ... -
spring 整合mina
2012-12-20 11:48 1119首先定义自定义过滤器 <bean id=" ... -
Web开发学习(5)添加springsecurity应用
2011-12-14 15:00 961我学习公司这个架构多半就是为了把springsecurity搞 ... -
Web开发学习(4)添加spring应用
2011-12-14 14:45 797印象中似乎没做过不用spring的项目,因为它在web开发中的 ... -
Web开发学习(3)配置struts-tiles插件(附带json插件)
2011-12-05 15:22 2564struts的tiles插件是非常实用的,从某些方面可以很好的 ... -
使用线程删除导出临时文件
2011-12-01 16:33 2271项目支持大数据量导出e ... -
jQuery实现表格行点击选中复选框
2011-11-23 12:36 6000这个需求是在项目完成后客户提出的要求,看似简单但是还需要一点小 ... -
Web开发学习(2)配置convention插件
2011-11-04 10:28 1390注解的方式某些程度上能减少xml的配置量,个人感觉使程序更加清 ... -
Web开发学习(1)使用eclipse搭建maven项目
2011-10-20 10:04 5746首先用eclipse创建工程 ne ... -
数据库连接泛型基类创建
2011-06-30 11:49 999记录 以便以后参考---- 基类代码 public cl ...
相关推荐
以上就是关于Struts2的一些基础知识点,学习Struts2不仅可以帮助理解MVC模式在实际应用中的工作原理,还能提升Java Web开发的技能。通过观看教学视频,结合实践操作,可以更好地掌握这些概念和技术。
Struts2是一个强大的Java Web应用程序开发框架,基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性、可扩展性良好的Web应用的解决方案。本笔记将全面总结Struts2的核心概念、主要功能以及实际...
通过上述对比可以看出,Struts2相比Struts1在很多方面进行了改进和优化,尤其是在灵活性、可测试性以及对现代Web开发的支持上有着显著的优势。尽管如此,在某些特定的应用场景下,Struts1可能仍然有其适用之处。选择...
Struts2 是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它是Struts 1和WebWork技术的结合体,提供了更为强大的功能和灵活性。Struts2的核心是WebWork的拦截器机制,这一机制使得业务逻辑...
### Struts2与Struts1的主要区别 #### 控制器类设计差异 ...通过简化控制器类的设计、增强依赖注入支持、优化验证机制等方面的努力,Struts2已经成为了一个更为现代、更符合当前Web开发需求的框架。
Struts2是一个强大的Java web开发框架,它简化了MVC(模型-视图-控制器)架构的实现,提供了丰富的功能和灵活的配置选项。在Struts2中,访问web元素是开发过程中常见的需求,比如获取请求参数、session数据或者...
在Action实现、线程模型、Servlet依赖、请求参数封装、表达式语言、视图技术绑定、类型转换和数据校验等方面,Struts2相比Struts1都有显著改进,例如Action不再需要继承特定基类,可以是普通的POJO,且不再依赖...
通过这个网上书店项目,开发者可以深入学习Struts2.0的MVC模式、Action设计、JSP动态页面开发、数据库访问、业务逻辑处理以及拦截器的使用。同时,这也为其他Web应用提供了参考和实践基础,有助于提升开发者在实际...
总的来说,尽管Struts1在历史上有着重要的地位,但随着Web开发技术的发展,Struts2已经成为了更为先进和广泛采用的选择。Struts2提供了一套更为现代化的解决方案,使得开发人员可以更高效地构建复杂的企业级Web应用...
Struts1和Struts2是两个著名的MVC框架,它们都是Apache软件基金会的Apache Struts项目的一部分,用于构建基于Java的Web应用程序。然而,两者在设计和实现上有显著的...这使得Struts2成为Java Web开发中更受欢迎的选择。
- **Struts1**采用ActionForm模式来封装用户输入的数据,它通常继承自ActionForm基类,并且可以通过JavaBean的属性进行数据绑定。 - **Struts2**虽然不再强制要求使用ActionForm模式,但仍然支持类似的功能,例如...
此外,Struts 2还提供了一个`ActionSupport`基类,该类已经实现了常见的接口,进一步减轻了开发者的负担。值得注意的是,在Struts 2中,即使是简单的POJO(Plain Old Java Object)对象,只要包含`execute`方法,就...
Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,为开发者提供了构建可维护性和可扩展性高的Web应用程序的工具。以下是对Struts2核心概念和特性的详细说明: 一、Struts2的作用:...
在Eclipse中开发Struts2应用,首先需要在项目中配置Tomcat服务器,然后创建Web项目,添加Struts2的依赖库,接着配置struts.xml等配置文件,最后编写Action和视图。 #### 七、Struts2与WebWork框架的关联 由于...
Struts2是一个广泛使用的Java Web应用程序框架,它基于Struts1的基础上进行了大量的改进和优化,旨在提供更为灵活、高效的Web开发体验。本教程旨在帮助初学者及有经验的开发者更好地理解和掌握Struts2的核心概念和...
Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发中,用于构建高效、可维护的Web应用程序。本项目"struts2简单登录...通过不断实践和学习,可以深化对Struts2框架的理解,提升Web开发技能。
### Struts与Struts2比较学习 #### 一、引言 随着Web开发技术的不断发展,框架的选择成为了项目成功与否的关键之一。Struts 和 Struts2 是Java Web领域内两个非常重要的MVC(Model-View-Controller)框架。本文...