文档章节

micro-mvc与主流mvc整合说明

杰睿宁
 杰睿宁
发布于 2018/01/26 13:49
字数 1392
阅读 608
收藏 5

micro-mvc框架,可以与springmvc和springcloud整合,使所有的controller、servicebean、dao和sql业务逻辑代码都支持热部署方便开发人员调式和生产部署。

与springmvc整合过程

编写Controller接口

整合后Springmvc的controller只编写接口,参数名称必须用RequestParam注解。 使用InjectGroovy注解在接口中声明对应的groovy实现名称。 其他与传统springmvc的controller无异。

package foo.web;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.nh.micro.service.InjectGroovy;

@Controller
@RequestMapping("test")
@InjectGroovy(name="TestController")
public interface TestController {
@RequestMapping("echo")
@ResponseBody
public  Map echo(@RequestParam(value="str") String str,HttpServletRequest httpRequest);

}

编写Controller层的实现groovy

package groovy;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import com.nh.micro.rule.engine.core.plugin.MicroAop;
import com.nh.micro.rule.engine.core.plugin.MicroDefaultLogProxy;
import com.nh.micro.service.InjectGroovy;
import com.nh.micro.template.MicroDbProxy;
import com.nh.micro.template.MicroTMProxy;

import foo.service.TestService;

@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])
class TestController  {  
	@Resource
	public TestService testService;
	

	public Map echo(String str,HttpServletRequest httpRequest) {
		System.out.println("this is controller proxy");
		testService.test("111");
		Map retMap=new HashMap();
		retMap.put("status", "0");
		return retMap;
	}

}

配置controller层包扫描

使用GroovyBeanScannerConfigurer代替context:component-scan对controller进行扫描。

	<bean class="com.nh.micro.service.GroovyBeanScannerConfigurer">
		<property name="scanPath" value="foo.web"></property>
	</bean>
<!-- <context:component-scan base-package="foo.web" /> -->

Service层

编写ServiceBean接口

并进行包扫描,使controller层能够是resource加载到ServiceBean代理对象。注意在接口中使用@InjectGroovy注解声明对应的实现业务逻辑的groovy文件名字 编写ServiceBean接口

package foo.service;
import com.nh.micro.service.InjectGroovy;
@InjectGroovy(name="TestService")
public interface TestService {
	public void test(String id);
}

Service层groovy实现

package groovy.service;
import javax.annotation.Resource;
import foo.dao.TestDao;
import foo.dto.MicroTestDto;
import foo.repository.*;
import groovy.json.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.transaction.annotation.Transactional;
import com.nh.micro.dao.mapper.DefaultPageInfo;
import com.nh.micro.dao.mapper.InjectDao;
import com.nh.micro.rule.engine.core.plugin.MicroAop;
import com.nh.micro.rule.engine.core.plugin.MicroDefaultLogProxy;
import com.nh.micro.template.MicroDbProxy;
import com.nh.micro.template.MicroServiceTemplateSupport;
import com.nh.micro.template.MicroTMProxy;

@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])
class TestService  {  
	
	@Resource
	public TestDao testDao;

	public void test(String id){
		
		Map paramMap=new HashMap();
		paramMap.put("id", id);
		MicroTestDto microTestDto=testDao.queryInfoById(paramMap);

		List<MicroTestDto> list=testDao.getInfoListAllMapper(microTestDto, ""); 
		
		DefaultPageInfo pageInfo=new DefaultPageInfo();
		pageInfo.setPageNo(1);
		List<MicroTestDto> retList=testDao.queryInfosByPage(paramMap, pageInfo);
		Long total=pageInfo.getTotal();
		System.out.println("total="+total);

	}

}

Service层包扫描配置

	<bean class="com.nh.micro.service.GroovyBeanScannerConfigurer">
		<property name="scanPath" value="foo.service"></property>
	</bean>

Dao层

使用micro-dao模块,需要编写dto类,dao接口和sql文件。通过扫描sql文件和dao接口,使service层能够使用Resource注解加载dao代理对象。

编写dto对象类

使用@MicroTableName映射数据中表名,使用@MicroMappingAnno映射表中列名。

package foo.dto;

import java.util.Date;
import com.nh.micro.orm.MicroMappingAnno;
import com.nh.micro.orm.MicroTableName;

@MicroTableName(name="micro_test")
public class MicroTestDto {
	@MicroMappingAnno(name="id")
	private String id;
	@MicroMappingAnno(name="meta_key")
	private String metaKey;
	@MicroMappingAnno(name="meta_name")
	private String metaName;
	@MicroMappingAnno(name="meta_type")
	private String metaType;
	@MicroMappingAnno(name="create_time")
	private Date createTime;
	
	@MicroMappingAnno(name="meta_num")
	private Integer metaNum;

	public Integer getMetaNum() {
		return metaNum;
	}

	public void setMetaNum(Integer metaNum) {
		this.metaNum = metaNum;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getMetaKey() {
		return metaKey;
	}

	public void setMetaKey(String metaKey) {
		this.metaKey = metaKey;
	}

	public String getMetaName() {
		return metaName;
	}

	public void setMetaName(String metaName) {
		this.metaName = metaName;
	}

	public String getMetaType() {
		return metaType;
	}

	public void setMetaType(String metaType) {
		this.metaType = metaType;
	}
}

编写Dao接口

package foo.dao;
import java.util.List;
import java.util.Map;
import com.nh.micro.dao.mapper.ListInnerClass;
import com.nh.micro.dao.mapper.MicroCommonMapper;
import com.nh.micro.dao.mapper.MicroPageInfo;
import com.nh.micro.orm.MicroDbName;
import foo.dto.MicroTestDto;

@MicroDbName
public interface TestDao extends MicroCommonMapper<MicroTestDto> {
		public int updateInfo(Map paramMap);
		public int insertInfo(Map paramMap);
		@ListInnerClass(name=MicroTestDto.class)
	public List<MicroTestDto> queryInfosByPage(Map paramMap,MicroPageInfo pageInfo);	
	public MicroTestDto queryInfoById(Map paramMap);	
}

Dao层包扫描配置

	<bean id="daoScan" class="com.nh.micro.dao.mapper.scan.BeanScannerConfigurer">
		<property name="scanPath" value="foo.dao"></property>
	</bean>

编写sql模板

类似jsp的语法编写sql,支持#和$两种替换符。不必区分select还是update,统一用<sql id=”xxx”>标签,id与dao接口方法名一致,sql文件名与dao接口名一致。

<%! <sql id="queryInfoById"> %>
select * from micro_test where 1=1 
<% if(paramArray[0].get("id")!=null){ %>		
	and id = #{paramArray[0].id} 			
<% 	} %>
<%! </sql> %>

<%! <sql id="queryInfosByPage"> %>
select * from micro_test 
<%! </sql> %>

<%! <sql id="insertInfo"> %>
insert into micro_test(id,meta_key) values( 
?			
<% repList.add(paramArray[0].get("id"));%>
,?		
<% repList.add(paramArray[0].get("meta_key"));%>	
	)
<%! </sql> %>
 
<%! <sql id="updateInfo"> %>
update micro_test set  
			
<% if(paramArray[0].get("meta_key")!=null){%>
,meta_key=#{paramArray[0].get("meta_key")}	
<% } %>	
<% if(paramArray[0].get("meta_name")!=null){%>
,meta_name=#{paramArray[0].get("meta_name")}	
<% } %>	

where id=#{paramArray[0].get("id")}
<%! </sql> %>

Sql文件扫描配置

	<!-- micro-dao sql文件加载 -->
	<bean class="com.nh.micro.nhs.NhsInitUtil"
		init-method="initGroovyAndThread" lazy-init="false">
		<property name="fileList">
			<list>
				<bean class="com.nh.micro.rule.engine.core.GFileBean">
					<property name="ruleStamp" value="true"></property>
					<property name="jarFileFlag" value="true"></property>
					<property name="dirFlag" value="true"></property>
					<property name="rulePath" value="/groovy/"></property>
				</bean>
			</list>
		</property>
	</bean>

MicroDao说明

同时支持mysql和oracle MicroDao相对mybatis的优点: 1,sql脚本支持修改后热部署实时生效。 2,bean与数据库字段映射关系,通过注解设置到bean中,不必在sql脚本中体现。 3,sql脚本支持类似jsp的写法,且不必区分select、update使用不同标签,更加灵活。 4,不需要使用插件,内置支持物理分页。 5,不需要使用插件,内置支持针对bean的标准增删改查功能。 6,不需要使用插件,内置支持读写分离,分库分表。 7,针对mysql5.7支持动态字段。 支持mapper、template、非orm三种模式支撑业务系统 1,mapper指,通过扫描接口,运行时自动生成dao实例; 2,template指,通过继承template标准父类,生成dao子类; 3,非orm指,直接使用microDao实例,可以执行非orm更灵活的数据库操作。

关于事务

由于serviceBean接口对象通过包扫描发布为springbean,所以仍可以使用原有的spring事务机制。

    <!-- 配置platform transaction manager-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean> 

    <!-- 声明式事物管理,配置事物管理advice-->
     <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>

            <tx:method name="get*" read-only="true"/>
<tx:method name="test*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice> 

    <!-- 配置事物管理advice作用范围与作用条件-->
    <aop:config>
        <aop:pointcut id="serviceLayerTransaction" expression="execution( * foo.service.*..*(..))"/>
        <aop:advisor pointcut-ref="serviceLayerTransaction" advice-ref="txAdvice"/>
    </aop:config>

SpringCloud整合

SpringCloud整合controller,service、dao层与springmvc整合均一致。 具体查看demo项目 Micro-springcloud-mvc

Nhmicro的Aop机制

加载groovy时提供aop代理机制,默认提供事务aop和数据源切换aop 事务aop,可在加载时,识别Transactional注解,实现事务控制。 可自行别写特定功能代理。 开启代理需要在groovy的类中设置MicroAop注解指定代理类

@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])

© 著作权归作者所有

杰睿宁

杰睿宁

粉丝 9
博文 21
码字总数 15442
作品 10
东城
私信 提问
微型 PHP 框架--FocusPHP

FocusPHP FocusPHP is a micro php framework TODO 完善docker开发环境 增加后台管理 框架与项目分离 完善单元测试,使用Travis CI持续集成 备注 数据库文件中,username=admin, password=ad...

mylxsw
2015/10/30
649
0
有关Spring3.x 整合myBatis3.1的轻量级框架简要说明

主题:有关Spring3.x 整合myBatis3.1的轻量级框架 对于现在主流的j2ee企业级开发而言,ssh(struts+hibernate+spring)依然是一个事实的标准。 由struts充当的mvc调度控制;hibernate的orm持...

后海
2013/02/01
495
0
PhalconPHP 3.2.0 正式发布,高性能 PHP 框架

PhalconPHP 3.2.0 正式发布了,PhalconPHP 是一个使用 C 扩展开发的 PHP Web 框架,提供高性能和低资源占用。 下载地址: https://github.com/phalcon/cphalcon/archive/v3.2.0.tar.gz 更新内...

mia0x75
2017/06/20
1K
11
NHMicro 1.1.7 发布,支持 MVC 各层代码热部署

NHMicro 1.1.7 已发布,该版本添加了 micro-mvc 模块。 micro-mvc框架,借助 nhmicro 框架和 groovy 技术使所有的 controller、servicebean、dao 和 sql 脚本都支持动态热部署和调试。 详见:...

杰睿宁
2018/01/12
922
4
新一代java模板引擎典范 Beetl

Beetl目前版本是2.1,大小667K,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下: 功能完备:同主流的...

kevin728971010
2016/11/07
216
0

没有更多内容

加载失败,请刷新页面

加载更多

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
34分钟前
5
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
35分钟前
4
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
37分钟前
8
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
41分钟前
7
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
55分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部