GWT中的RPC机制可以让我们在前台页面直接调用后台的servlet,而且还能在前台就封装成一个对象,调用后台的方法,免去了中间的拆装。
但是一般前台展示用的是VO,而后台程序用的是PO,2者之间的转换还是有些麻烦,要写很多get set方法,很不利与整个程序的模块化与扩展性。
以下是我的一个方案,暂时感觉还不错。
写一个注解,通过这个注解来绑定VO与PO
package com.single.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.single.onlineoffice.main.server.convert.Convert;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BindConvert {
@SuppressWarnings("unchecked")
Class<? extends Convert> convert();
}
写一个转换接口Convert
package com.single.convert;
import java.util.Collection;
public interface Convert<DOMAIN,CLIENT> {
public CLIENT convertToClient(DOMAIN domain,Object... params);
public DOMAIN convertToDomain(CLIENT client,Object... params);
public Collection<CLIENT> convertCollectionToClient(Collection<DOMAIN> domains,Object... params);
public Collection<DOMAIN> convertCollectionToDomain(Collection<CLIENT> clients,Object... params);
}
下面是Employee这个PO
package com.single.domain;
import com.single.annotation.BindConvert;
import com.single.onlineoffice.main.server.convert.EmployeeConvert;
@BindConvert(convert=EmployeeConvert.class)
public class Employee {
private Long id;
private String name;
private Account account;
}
下面是ClientEmployee这个VO,与PO的差别是有一个username,他只是account中的一个属性
package com.single.domain;
import java.io.Serializable;
import com.single.annotation.BindConvert;
import com.single.onlineoffice.main.server.convert.EmployeeConvert;
@BindConvert(convert=EmployeeConvert.class)
public class ClientEmployee implements Serializable{
private Long id;
private String name;
private String username;
}
下面是Employee与ClientEmployee之间的转换器
package com.single.onlineoffice.main.server.convert;
import java.util.Collection;
import com.single.onlineoffice.main.client.domain.ClientEmployee;
import com.single.onlineoffice.main.server.domain.Employee;
public class EmployeeConvert implements Convert<Employee, ClientEmployee> {
@Override
public ClientEmployee convertToClient(Employee domain,Object... params) {
ClientEmployee clientEmployee=new ClientEmployee();
clientEmployee.setId(domain.getId());
clientEmployee.setName(domain.getName());
clientEmployee.setUsername(domain.getAccount().getUsername());
return clientEmployee;
}
@Override
public Employee convertToDomain(ClientEmployee client,Object... params) {
Employee employee=new Employee();
employee.setId(client.getId());
employee.setName(client.getName());
return employee;
}
@SuppressWarnings("unchecked")
@Override
public Collection<ClientEmployee> convertCollectionToClient(
Collection<Employee> domains, Object... params) {
Collection<ClientEmployee> collection=null;
try {
collection=domains.getClass().newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("创建集合对象出错");
}
for(Employee employee:domains){
collection.add(convertToClient(employee, params));
}
return collection;
}
@SuppressWarnings("unchecked")
@Override
public Collection<Employee> convertCollectionToDomain(
Collection<ClientEmployee> clients, Object... params) {
Collection<Employee> collection=null;
try {
collection=clients.getClass().newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("创建集合对象出错");
}
for(ClientEmployee clientEmployee:clients){
collection.add(convertToDomain(clientEmployee, params));
}
return collection;
}
}
再写一个辅助类就可以轻松的进行转换了
package com.single.onlineoffice.main.server.util;
import com.single.annotation.BindConvert;
import com.single.onlineoffice.main.server.convert.Convert;
public class DomainClientConvertUtils {
@SuppressWarnings("unchecked")
public static <X>X convertToClient(Object object,Object... params) {
BindConvert anno=object.getClass().getAnnotation(BindConvert.class);
Convert<Object, Object> convert=null;
try {
convert=anno.convert().newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Domain转换Client异常");
}
return (X)convert.convertToClient(object,params);
}
@SuppressWarnings("unchecked")
public static <X>X convertToDomain(Object object,Object... params) {
BindConvert anno=object.getClass().getAnnotation(BindConvert.class);
Convert<Object, Object> convert=null;
try {
convert=anno.convert().newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Client转换Domain异常");
}
return (X)convert.convertToDomain(object,params);
}
}
如果需要转换,使用以下语句就可以了
Employee employee=null;
ClientEmployee ce=DomainClientConvertUtils.convertToClient(employee);
ClientEmployee clientEmployee=null;
Employee e=DomainClientConvertUtils.convertToDomain(clientEmployee);
分享到:
相关推荐
在实体框架或ORM(对象关系映射)工具中,PO对象作为桥梁,将Java对象与数据库记录相互转换,使得开发者能够以面向对象的方式操作数据库数据。 ### 值对象(VO) 值对象(VO)是一种无状态的对象,它代表了一组值...
POJO、DTO、VO 等都是 Java 中常用的类别,但是它们之间的转换却是一件复杂的事情,需要我们对 Java 的反射机制、泛型、基本类型等有深入的了解。 首先,我们需要了解什么是 POJO、DTO、VO。POJO 是 Plain Ordinary...
POJO常被用作VO或BO的基础,它们可以轻易地转换为其他类型的对象,如PO或VO,这使得它们成为构建复杂应用的基石。 ### 关系与应用场景 这些概念并非孤立存在,它们之间存在着紧密的联系和相互转化的过程。例如,PO...
- VO与PO之间的相互转换可以使用`BeanUtils.copyProperties()`方法实现。 #### 十、延迟加载与非延迟加载 - **延迟加载**: - 如果采用了延迟加载机制但希望在某些情况下实现非延迟加载,可以通过`Hibernate....
Action接受用户的数据,Action将数据从Action中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再forward。而业务层Bean收到这个PO对象之后,会调用DAO接口方法,进行持久化操作。 SSH框架是由...
这不仅涵盖了输入电压范围、输出电压、电流密度、电感等关键指标,还涉及了设计过程中考虑的各种物理量之间的相互关系和计算方法。 ### 一、基本设计参数 #### 输入电压范围 输入电压范围设定为90VAC到264VAC,这...
数据的流向是:ActionFormBean接受用户的数据,Action将数据从ActionFormBean中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再Forward。 4. SSH框架的优点 Hibernate的最大好处就是根据数据库的...
在项目开发中,业务分层会涉及不同类型的Bean之间需要相互转换,如PO与DTO之间,PO与VO之间等。手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。 如何引入Map...
例如,PO(Persistent Object)层就是用于将领域对象转化为数据库中的持久化对象,如ORM(对象关系映射)框架。视图对象(View Object,如VO)则是用于在展示层中传递数据的对象,它们通常用于界面渲染。 分层架构...
1. **解析**:对象关系映射(ORM)是一种将对象模型与数据库模型相互转换的技术。这部分内容提供了关于如何正确使用ORM框架的指导,以提高开发效率和代码质量。 #### 六、工程结构 1. **解析**:工程结构部分主要...