当前位置:  编程技术>综合
本页文章导读:
    ▪利用spring AOP和Annotation来简化DAO实现      通常在数据库DAO层的查询中,我们会定义一个DAO接口,而在实现中我们只是拼接查询参数并且指定一个ibatis的sqlmap中的sqlid进行查询, Dao的实现很类似,而且非常简单,其实可以简化这种的实.........
    ▪springmvc @SessionAttributes @ModelAttribute 取session值问题      springmvc @SessionAttributes  @ModelAttribute 取session值问题 public class User implements Serializable{ private String id; @Controller @SessionAttributes(Constants.USER_INFO_SESSION) public class LoginControll { @RequestMapping(value = "lo.........
    ▪【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法       本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接: http://blog.csdn.net/zhmxy555/article/details/8475261作者:毛星云(浅墨)    邮箱: happylifemxy@163..........

[1]利用spring AOP和Annotation来简化DAO实现
    来源:    发布时间: 2013-11-07

通常在数据库DAO层的查询中,我们会定义一个DAO接口,而在实现中我们只是拼接查询参数并且指定一个ibatis的sqlmap中的sqlid进行查询,

Dao的实现很类似,而且非常简单,其实可以简化这种的实现,不需要这些实现代码,下面我们通过annotation机制来简化这块的实现。

比如

 

public class TestDaoImpl extends SqlMapClientDaoSupport implements TestDao {
    @Override
    public int updateBrandOfferStatusByBrandMemberId(Long brandMemberId, String operator, String status) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("brandMemberId", brandMemberId);
        map.put("operator", operator);
        map.put("status", status);
        return this.getSqlMapClientTemplate().update("BRANDOFFER.UPDATE-BRANDOFFER-BY-BRANDMEMBERID", map);
    }

    @Override
    public List<Long> queryOfferIdsByBrandMemberId(Long brandMemberId, Integer start, Integer end) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("brandMemberId", brandMemberId);
        map.put("start", start);
        map.put("end", end);
        return this.getSqlMapClientTemplate().queryForList("BRANDOFFER.SELECT-OFFERIDLIST-BY-BRANDMEMBERID", map);
    }
 ......
}

 

首先,我们使用建立一个spring的工程,依赖如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>mySpringWeb</groupId>
	<artifactId>springDemo</artifactId>
	<packaging>jar</packaging>
	<version>1.0.0-SNAPSHOT</version>

	<name>Started with Laurel</name>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.2.0.RELEASE</version>
		</dependency>

	</dependencies>

	<repositories>
		<repository>
			<id>springsource-repo</id>
			<name>SpringSource Repository</name>
			<url>http://repo.springsource.org/release</url>
		</repository>
	</repositories>

</project>
 

我们定义两个annotation

DAO是用来加在DAO接口的方法上的annotaion,可以通过name指定ibatis中的sql id,这个annotation可以添加type之类的参数,可以用来指定dao查询的类型,inserti,update,query,delete等类型。

 

 

package mySpringWeb;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)    
@Inherited
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface Dao {
	String name() default "[defaultMethod]";
}
 

DaoParam是用来在DAO方法的参数上加的annotation,用来指定ibatis查询map参数的构造,map的key名称

 

package mySpringWeb;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)    
@Inherited
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.PARAMETER})
public @interface DaoParam {
	String name() default "paramName";
}

 

然后定义一个DAO接口,里面有一个方法,

 

package mySpringWeb;

import java.util.List;

public interface MyDao {
	@Dao(name="MyDaoAnnotataion")
	public List<Object> query(@DaoParam(name="param1")String param1, @DaoParam(name="param2")int param2);
}

 

我们写一个空的DAO实现类,

 

package mySpringWeb;

import java.util.List;

public class MyDaoImpl implements MyDao{

	@Override
	public List<Object> query(@DaoParam(name="param1")String param1, @DaoParam(name="param2")int param2) {
		// TODO Auto-generated method stub
		return null;
	}

}
 

然后就是写一个spring AOP的 拦截器类了,

 

package mySpringWeb;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.core.annotation.AnnotationUtils;

public class MyIntercept implements MethodInterceptor{

	static{
		try {
			Class.forName("mySpringWeb.Dao");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		Dao dao = AnnotationUtils.findAnnotation(invocation.getMethod(), Dao.class);//递归查找该方法是否定义了这个annotation
		if(dao != null){
				List<String> list = new ArrayList<String>();
				list.add(dao.name());
				System.out.println(dao.name());
				//method name就是ibatis sqlid,这里可以注入一个dao,然后传入sqlid,执行返回
				System.out.println(invocation.getMethod().getName());
				Map<String,Object> paraMap = new HashMap<String,Object>();
				Annotation[][] annotations = invocation.getMethod().getParameterAnnotations();
				Object[] object = invocation.getArguments();
				for(int i = 0; i < annotations.length;i++){
					for(Annotation an: annotations[i]){
						if(an.annotationType().isAssignableFrom(DaoParam.class)){
							System.out.println(an.toString());
							paraMap.put(((DaoParam)an).name(), object[i]);	
						}
					}
				}
				
				//dao查询参数map
				System.out.println(paraMap.toString());
				//这里ibatis sqlid和查询参数map都知道,那么就可以进行数据库查询,然后返回了,对于返回类型也可以通过定义返回的annotation进行返回参数类型的几种定义
				//当前这里需要注入spring的DAO的一个实现,这里根据annotation的类型和参数以及sqlid就可以进行数据库查询,然后返回,这里就比较简单了。
				
				return list;
		}
		System.out.println("go to here error");
		return null;
	}

}

 

再进行spring的bean xml配置,bean.xml,这里可以对多个DAO进行配置同一个拦截器,然后就可以统一处理了。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

	<bean id="mydao"  />
	<bean id="myintercept"  />
	<bean id="mydaobean" >
		<property name="proxyInterfaces">
			<value>mySpringWeb.MyDao</value>
		</property>
		<property name="interceptorNames">
			<list>
				<value>myintercept</value>
				<value>mydao</value>
			</list>
		</property>
	</bean>

</beans>

 

写一个测试类:

 

 

package mySpringWeb;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
//	@Resource
//	private MyDao myDao;
//	
//	public void test(){
//		List<Object> list = myDao.query();
//		System.out.println(list);
//	}

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		MyDao myDao = (MyDao) new ClassPathXmlApplicationContext("bean.xml").getBean("mydaobean");
		List<Object> list = myDao.query("test1", 1);
		System.out.println(list);
//		System.out.println(myDao.toString());
		
//		MyDao myDao1 =  (MyDao) Class.forName("mySpringWeb.MyDaoImpl").newInstance();  
//		Method[] methods = myDao1.getClass().getMethods();
//		for(Method method: methods){
//			Annotation[] annos = method.getAnnotations();
//			for(Annotation anno: annos){
//				System.out.println(anno.getClass().getName());
//			}
//		}
	}
}
 

输出:

 

MyDaoAnnotataion
query
@mySpringWeb.DaoParam(name=param1)
@mySpringWeb.DaoParam(name=param2)
{param1=test1, param2=1}
[MyDaoAnnotataion]

 

这种方式就可以简化DAO实现的一堆重复逻辑,通过在DAO 的interface中annotation定义好就可以了。

不过有个优化,不知道有没有办法不用定义每一个DAO的空实现类,应该是有办法的。具体的后面再研究。还有annotation如果直接通过invocation.getMethod().getAnnotation()是获取不到接口中定义的annotation的,必须得通过AnnotationUtils.findAnnotation(invocation.getMethod(), Dao.class);这个方法查询方法的annotation。

 



已有 0 人发表留言,猛击->>这里<<-参与讨论
    
[2]springmvc @SessionAttributes @ModelAttribute 取session值问题
    来源:    发布时间: 2013-11-07
springmvc @SessionAttributes  @ModelAttribute 取session值问题


public class User implements Serializable{
private String id;


@Controller
@SessionAttributes(Constants.USER_INFO_SESSION)
public class LoginControll {
@RequestMapping(value = "login.html", method = RequestMethod.POST)
	public String login(
			@RequestParam(value = "username", required = false) String username,
			@RequestParam(value = "password", required = false) String password,
			@ModelAttribute(Constants.USER_INFO_SESSION)SysUser user,
			HttpSession session
			Model model) {
		
			SysUser user = userService.validateLogin(username, password);
			System.out.println(user.getId());
			model.addAttribute(Constants.USER_INFO_SESSION);
			return Constants.RESULT_SUCCESS;
      
     }
}

输出:11000

@Controller
@RequestMapping("/User")
@SessionAttributes(Constants.USER_INFO_SESSION)
public class UserControll {

public @ResponseBody List<?> list(
     @RequestParam(value = "node", required = false)String node,
	 @ModelAttribute(Constants.USER_INFO_SESSION)SysUser user,
	 HttpSession session
      ) {
	System.out.println("user.getId():"+user.getId());
	User u = (User)session.getAttribute(Constants.USER_INFO_SESSION);
	System.out.println("u.getId():"+u.getId());

输出:
user.getId():00
u.getId():00
session去USER对象id值变成了'00'

发现请求参数中有同名id,值是'00'
@Controller
@RequestMapping("/User")
@SessionAttributes(Constants.USER_INFO_SESSION)
public class UserControll {

public @ResponseBody List<?> list(
     @RequestParam(value = "node", required = false)String node,
	 @RequestParam(value = "id", required = false)String id,
	 @ModelAttribute(Constants.USER_INFO_SESSION)SysUser user,
	 HttpSession session
      ) {
        System.out.println("id:" + id);
	System.out.println("user.getId():"+user.getId());
	User u = (User)session.getAttribute(Constants.USER_INFO_SESSION);
	System.out.println("u.getId():"+u.getId());

输出:
id:00
user.getId():00
u.getId():00
请求中参数有同名id,会覆盖session中所有对象同名属性值

改成如下
@Controller
@RequestMapping("/User")
public class UserControll {

public @ResponseBody List<?> list(
     @RequestParam(value = "node", required = false)String node,
	 @RequestParam(value = "id", required = false)String id,
	 HttpSession session
      ) {
        System.out.println("id:" + id);
	User u = (User)session.getAttribute(Constants.USER_INFO_SESSION);
	System.out.println("u.getId():"+u.getId());

输出:
id:00
u.getId():11000


已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—




    
[3]【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法
    来源: 互联网  发布时间: 2013-11-07

 

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

文章链接: http://blog.csdn.net/zhmxy555/article/details/8475261

作者:毛星云(浅墨)    邮箱: happylifemxy@163.com   

 

 

 

本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载。(这标题有些歧义的,这个几种是修饰几何体的,而绘制的方法只有一种 :D)

 

首先需要跟大家道声歉,上个周末因为浅墨个人的原因。没把想写的内容的思路整理好,所以就停更了一次。

 好了,别的废话咱不说了,下面直奔本周主题~

 

 

 

一、D3D中内置的几何体概述

 

 

 

通过前面的讲解大家应该会发现,使用顶点缓存和索引缓存通过绘制三角形单元来绘制图形还是有一点复杂的,需要一定的想象力和大量顶点和索引的设置,我们一般很少去这样通过逐个设置顶点缓存和索引缓存来进行画面上几何体的绘制的。而比较人性化的是,Direct3D为我们提供了几种特殊的生成简单3D几何体的网格数据的方法。可以说是在我们学习从文件载入网格数据之前,为我们创建了很多便利,丰富了我们的学习时的图形素材。下面我们就来看看这几个快捷的几何体绘制函数,他们分别是立方体(Cube),圆环体(Torus),多边形(Polygon),球面体(Sphere),茶壶(Teapot)和圆柱体(Cylinder)。

 

我们可以在DirectX SDK(以目前最新的Microsoft DirectX SDK (June 2010)为例)的Windows DirectX Graphics.chm文档中依次展开【Windows DirectX Graphics Documentation】->【Direct3D 9 Graphics】->【Reference for Direct3D 9】->【D3DX Reference】->【D3DX Functions】->【Shape Drawing Functions】找到这些函数的说明文档,这是这些函数最官方最原始的参考地址了。

不过显然这些DirectX SDK Document都是纯英文的,和大众之间的距离还是比较疏远。

 

先给大家看看这几个函数的全家福,后面我们会全部详细介绍使用方法的:

 

D3DXCreateBox   用于创建一个盒子,立方体

D3DXCreateSphere   用于创建一个球面体

 

D3DXCreateCylinder 用于创建一个柱体

D3DXCreateTeapot 用于创建一个茶壶

D3DXCreatePolygon 用于创建一个多边形

D3DXCreateTorus        用于创建一个圆环体

 

 

我们可以看到这些函数的名字取的都非常的憨厚老实,一开始是D3DX,然后紧跟其后一个Create,表示是在创建某东西,最后跟上对应的几何体名,比如Teapot茶壶,这样连起来就非常好记忆了,D3DXCreateTeapot。

 

 

 

二、D3D中几种内置的几何体绘制四步曲

 

 

首先需要说明的是下面提到的ID3DXMesh接口类型是后面我们在讲解网格相关知识的时候重点讲解的内容,这里大家先对其有一个大概的印象就可以了。

 

想要通过这几个函数快捷绘制出一个几何体,需要以下几步:

 

1.定义一个ID3DXMesh接口类型的对象。

 

2.调用这六个函数的其中一个对我们在第一步里面定义的这个对象进行初始化,也就是把创建好的网格存储在我们定义好的ID3DXMesh类型的对象中

 

3.在Direct3D渲染五步曲的第三步,也就是在BeginScene之后调用DrawSubset方法进行网格图形的绘制,即是拿着第二步里面初始化好的ID3DXMesh接口类型的对象指一下DrawSubset(0)方法就好了

 

4.绘制完成之后,调用ID3DMesh接口的Release方法,或者我们自定义的COM接口释放宏进行资源的释放。

 


    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3