Upgrade to Pro — share decks privately, control downloads, hide ads and more …

部门后台框架

cssrain
September 02, 2014

 部门后台框架

部门后台框架

cssrain

September 02, 2014
Tweet

More Decks by cssrain

Other Decks in Technology

Transcript

  1. 项目框架结构 Broswer、Phone、Pad等终端 系统表结构 客户端 项 目 前 台 模 版

    项 目 后 台 模 版 数据库 Request Web Services JSON JSON JDBC 请求参数验证(XML) 代 码 插 件 Action控制类 IControlService 统一调用接口 Action控制类 IControlService 统一调用接口 IControlService Service服务类 Dao操作类 Java Bean InputObject OutputObject 统一调用接口 JSON JSON
  2. Html Filter Interceper Action IControlService Service Dao || tp Converter

    IControlService (1) 页面请求 (3) (2) (4) (5) (6) (10) (9) (8) (7) WebService调用 WebService调用 (1) 验证参数个数、顺序、正则表达式 (2) 根据control.xml封装InputObject对象, 存 储在ActionContext中 (3) 获取InputObject对象 (4) 将InputObject对象转成Json (5)将Json转换成InputObject (6)数据处理 (7)封装OutputObject对象 (8)将OutputObject对象转成Json (9) 将Json转换成OutputObject对象 (10) 封装Json 项目框架流程 返回数据,处理完成
  3. <control> <action path="" service="" method=""> <input uid="1" service="" method=""> <parameter

    key="" order="" regex="" scope="" toKey=""/> <parameter key="" order="" regex="" scope="" toKey=""/> ……… </input> <output uid="1" convertor="" method=""/> ……… </action> …….. </control> control.xml文件配置
  4.  <control>标签 整个应用的控制请求,control.xml的根标签。 control.xml详解  <action>标签 <!ELEMENT control (action+)> 请求动作标签,代表一个请求动作,各请求根据path属性进行区别。

    <path>属性: Request请求路径; #REQUIRED <service>属性:Request请求调用后台的WebService服务类,值为后台工程中 spring-services.xml中Service对应的id值; #IMPLIED <method>属性:服务类中的方法; #IMPLIED  <input>标签 <!ELEMENT action (input,output?)*> 请求参数标签,<action>中可包含多个<input>标签,各标签通过uid区别。 <uid>属性: 请求的唯一编号; #IMPLIED <service>属性:若填写,则重写父类action属性的service; #IMPLIED <method>属性:若填写,则重写父类action属性的method; #IMPLIED
  5.  <parameter>标签 <!ELEMENT input (parameter*)> Request的参数映射标签,参数列表 <key>属性: Request中对应的key; #REQUIRED <toKey>属性:InputObject对象中params属性中的key值;

    #IMPLIED <order>属性:参数的顺序,按照验证需求添加; #IMPLIED <regex>属性:正则表达式验证,按照验证需求添加; #IMPLIED <scope>属性: key属性对应值的取值范围; (request|session|constants|properties) #IMPLIED control.xml详解 注意: 1、若scope不配置,则默认为“request”,从前台请求中获取数据; 2、若scope为“session” ,则根据key到session中获取对应值,并以toKey属性的值作为 params的键值存储,key的配置规则为: session中key值[.属性][.属性]; 3、若scope为“constants”,则从com.ai.***.util.Constants.java中读取属性为key的值; 4、若scope为“properties”,则从config/system.properties中读取数据; 5、若toKey属性不配置,则以key为params的键值存储。
  6. control.xml详解  <output>标签 <!ELEMENT action (input,output?)*> 请求返回结果转换标签,output标签通过uid属性和input匹配 <uid>属性: 请求的唯一编号; #REQUIRED

    <convertor>属性:Json转换类 ; #REQUIRED <method>属性:调用的方法; #IMPLIED 注意: 1、 output标签是否需要可视Action返回给前台的Json而定; 2、 convertor属性为转换类全称,形如“com.ai.***. convertor.****Convertor”; 3、转换类需要继承com.ai.frame.convertor.BaseConvertor; 4、方法定义: public String XXX(InputObject inputObject , OutputObject outputObject);
  7. InputObject对象 private String service; // 调用后台服务类的名称 private String method; //

    服务类中的方法名 private String serverIp; // 调用服务的主机IP private String userId; // 用户信息 private Map<String, String> params; // 参数信息 private List<Map<String, String>> beans; // 参数集 private Map<String, String> logParams ; // 日志参数 // 将params属性转换成JavaBean public <T> T convertParams2Bean(Class<T> clz); // 将beans属性转化成List<JavaBean> public <T> List<T> convertBeans2Beans(Class<T> clz);
  8. InputObject对象获取 从ActionContext中获取 InputObject input= (InputObject) ServletActionContext.getContext().get("inputObject"); 自创建InputObject对象 InputObject inputObject =

    new InputObject(); 注意:框架中已对该方法进行封装,在Action中可调用父类BaseAction中的 getInputObject()方法获得。 提醒:创建的inputObject对象中的params、 beans等属性已被实例化,可直接通过 getter方法获取使用。
  9. public String getWaitCheckByPage(){ String start = getRequest().getParameter("start"); String everyPage =

    getRequest().getParameter("limit"); User user = (User)getSession().getAttribute("User"); int userId = user.getId(); InputObject inputObject = new InputObject(); inputObject.setService("mediastoreService"); inputObject.setMethod("getWaitCheckByPage"); Map<String,String> map= new HashMap<String,String>(); map.put("compareName", String.valueOf(userId)); map.put("start", start); map.put("everyPage", everyPage); inputObject.setParams(map); OutputObject outputObject = getControlService().execute(inputObject); String json = JsonDataUtil.getWaitCheckJson(outputObject); sendJson(json); return null; } 使用示例1 当 前 开 发 模 式
  10. public String execute() { OutputObject object = super.getOutputObject(); super.sendJson(super.convertOutputObject2Json(object)); return

    null; } <control> <action path="/front/sh/common!execute"> ………. <input uid= "4" service="mediastoreService" method="getWaitCheckByPage"> <parameter key="start" order="0" regex="" toKey="start"/> <parameter key="limit" order= "1" regex="" toKey="everyPage"/> <parameter key="User.id" regex="" scope="session" toKey ="compareName" /> </input> <output uid= "4" convertor="com.ai.mpt.convertor.NoticeConvertor" /> </action> </control> 框 架 模 式
  11. Tools是一个可实现常规代码的自动生成的插件! 代码生成插件Tools 公告表: CREATE TABLE DB_AP_MPT_NOTICE( ID NUMBER NOT NULL,

    --公告ID REGION_ID VARCHAR2(2), --归属地市 NAME VARCHAR2(100), --公告名称 CONTENT VARCHAR2(2000), --公告内容 CREATE_OPID VARCHAR2(50), --创建人 CREATE_DATE DATE --创建时间 );
  12. 文件名称 文件路径 备注 Notice.java java/**/bean/ 创建Bean文件 Notice.xml resources/orm/ 创建Ibatis配置文件 SqlMapConfig.xml

    resources/orm/ 修改主配置文件 INoticeDao.java java/**/dao/ 创建Dao接口类 NoticeDaoImpl.java java/**/dao/impl/ 创建Dao接口的实现类 INoticeDaoTest.java test/**/dao/ 创建Dao的测试类 INoticeService.java java/**/service/ 创建Service接口类 NoticeServiceImpl.java java/**/service/impl/ 创建Service接口的实现类 INoticeServiceTest.java test/**/service/ 创建Service的测试类 spring-dao.xml resources/spring/ 修改文件,添加Dao声明 spring-services.xml resources/spring/ 修改文件,添加Service声明 生成文件列表:
  13. 多表操作 后台工程中选择AILK_TOOLSMulti-Table,输入SQL、选择Dao、输入方法名、选择是否同 步Service,点击确定即可。 文件名称 文件路径 备注 Notice.xml resources/orm/ 修改Bean的ORM文件 INoticeDao.java

    java/**/dao/ Dao中添加声明方法 NoticeDaoImpl.java java/**/dao/impl/ Dao实现类实现该方法 INoticeDaoTest.java test/**/dao/ 测试该方法 INoticeService.java java/**/service/ 不勾选则不生成 NoticeServiceImpl.java java/**/service/impl/ 不勾选则不生成 INoticeServiceTest.java test/**/service/ 不勾选则不生成 生成文件列表:
  14. 使用示例2 需求:获取当前登录用户所在地区的公告名称包含“test”的 信息列表。 Region.java int id; String regionName; User.java int

    id; String name; Region region; Notice.java int id; String regionId; String name; String content; String createOpid; Date createDate; 假设: session.setAttribute("user",user);
  15. 步骤1:使用Tools生成后台服务 SQL: SELECT * FROM DB_AP_FWE_NOTICE N WHERE N.REGION_ID =

    #regionId# AND N.NAME LIKE '%' || #name# || '%' 选中的DAO: INoticeDao 方法名: getNoticesByName 同步Service: √
  16. 步骤2:配置前台control.xml文件 <control> <action path="/front/sh/common!execute"> ………. <input uid="2" service="noticeService " method="getNoticesByName">

    <parameter key= "a" order="0" regex="" toKey="name"/> <parameter key="user.region.id" regex="" scope="session" toKey ="regionId" /> </input> <output uid="2" convertor="com.ai.fwe.convertor.NoticeConvertor" method=“convert2Json" /> </action> </control> 配置output标签,需 自行编写Json转换类
  17. 步骤3:编写转换类(如果需要) public class NoticeConvertor extends BaseConvertor { public String convert2Json(InputObject

    input, OutputObject output) { String json = "{\"colmodel\":[],\"rows\":"; json += JsonUtil.convertObject2Json(output.getBeans()); json += ",\"total\":"+output.getBean.get("total")+"}"; return json; } } Json工具:JsonView \\192.168.1.217\software\tools
  18. 步骤4:前台请求 $.AjaxJson(contextPath+"/front/sh/common! execute?a="+$("#name").val(), dealData); function dealData (state,data){ //处理数据 } common.js

    $.extend({ AjaxJson: function(url,callback){ $.ajax({ url:url, type:"post", cache:false, dataType : "json", success:function(data){ callback("success", data); }, error:function(){ callback("error", null); } }); } }); 框架示例 FrameWork Example svn://192.168.1.217/fwe