1. 如何利用VO层操作数据库
一、PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。
二、VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.
有一种观点就是:PO只能用在数据层,VO用在商业逻辑层和表示层。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。如果将PO用在各个层中就相当于我们使用全局变量,我们知道在OO设计非常不赞成使用全局变量。
但是每次都得进行VO-PO的转换,也确实很烦。我觉得有时候也可以在某个商业逻辑或者表示层使用PO,此时在这个商业逻辑的过程中PO的状态是不发生变化的,比如显示一条商品详细信息的商业逻辑。
在开发过的项目中,规模都很小,我一直都把PO当VO用,因为PO确实很方便,结合Hibernate的DAO,我使用JAVA的集合对象作为值传递的载体,当然Struts也是我的不二之选。
我认为:在一些直观的,简单的,不易发生变化的,不需要涉及多个PO时,传递值还是使用PO好,这样可以减少大量的工作量(也就意味着减少bug,减少风险),也不需要担心未来的维护工作!
2. 前端ajax.request请求后台怎么用vo接收
关于这个你遇到了问题,可以去后盾人看看,那里的教学视频有好多肯定有你所需要的,如果没有你再去网络上搜索
3. bo dto vo po在实际项目开发中是否一定要区分清楚
首先这些bo,dto,vo,po在一些情况下是需要的,在一些情况下是不需要的。我以我自己的理解说一下。
1.为什么需要:当业务复杂了,如果只用了一个po的话,有这么一些情况。a.当前端对此表的查询比较多,如果数据库中存储了创建时间,但是需要根据时间段进行查询,那po就需要加两个字段,startCreatTime和endCreatTime来获取数据,一旦查询复杂了,po的字段可能会变得很多很多,一个表里面几十个字段的po变成100个字段,以后数据库加字段也只能手动加了(不能直接用工具改,不太方便改po)。这是一个问题,会使PO中的字段变得无限大。 b.当数据库中的数据有一些关键字段,比如是密码,加密方式,用户创建时间,更新时间,但是前端不需要显示,会导致两个问题(1.传递冗余数据,增大流量开销。2.传递关键信息,暴露数据库表结构和用户其他信息。 一些破解的哥们就喜欢你这样搞)c.当比如查询用户的详情时,就会有第三个问题:PO中会加其他的子表数据,List<Subject> subjects,List<Grade> grades。或者很多很多其他的子表数据,这样一个PO就变得更加臃肿了。 在这三种情况下的叠加的话,我一个接口返回到前端就有几十到100个字段。那我遇到这么个情况:同事改我写的类的时候会问,这个前端这里应该填哪个属性呀?我也蒙蔽,。这么多字段,我忘了,所以在某一些情况下是需要相互转换的。特别是系统比较大,前后端分离需要。一定只把响应状态,显示的必要的参数,抛去不需要的参数,减少前后端的沟通成本和自己维护成本。
2.为什么不需要:反之是业务比较简单的情况下,一个表也就十几个字段,整个系统不大。应该尽可能减少这种转换。需要维护多个实体类,心累。
3.如何衡量什么时候需要呢:我觉得写代码就尽量流程化,前期多花点时间,以后维护少很多时间,这种实体类的转换BeanUtils就特别好转换,就一行代码,用多了,你的思路清晰,接收参数哪个O,显示用哪个O,就很方便(如果项目催得紧,小项目,项目经理没有要求,就用尽少用吧)。
觉得不对的地方,希望留言交流
4. 怎么在前端判断两个变量的值如果一个有值则另一个不显示
可以这样做:首先在前端获取到你的数据之后判断,如果$vo['yinhou']不为空则显示{$vo.xliao},如果$vo['yinhou']为空则直接显示
5. JAVA 框架 BO VO BVO SOABO 在企业用的JAVA业务和视图的对象的封装中,常常遇到这几个词
BO 业务类型 对应于具体的业务,可能含有面向业务的处理过程
VO 值类型 纯粹的值,基本只用于前端页面的值绑定,框架和业务处类之间的值传递
BVO 包含以上两者
SOABO SOA面向服务的架构,是一种分布式的应用架构,在其上使用的业务对象即为 SOABO
应用分层是这么着的:
终端用户 > web前端 > mvc框架 > spring之类的服务集成,也可能是EJB、SOA之类的分布式服务集成 > 后端的真正的业务处理 > ORM之类的存储中间件 > 真实的存储关系数据库之类
6. java项目中VO和DTO以及Entity,各自是在什么情况下应用的
通常这三个破东西很迷惑新人,因为我们眨眼一看三个东西竟然一样...好吧,废话少说
按照标准来说:
entity里的每一个字段,与数据库相对应,这是绝大多数公司采用的叫法
dto里的每一个字段,是和你前台页面相对应,主要表示前端->后端,其中t表示transport,是传输的意思,dto就是传输对象,它可以用来表示前端传递给后端的对象,也可以表示服务与服务(后台与后台)之间的对象,有些公司把dto也叫做form,也有叫pojo,还有叫po的,
vo里的每个字段,也是和你前台页面相对应的,主要表示后端->前端(注意与DTO区别),其中vo中的v表示view,视图的意思,如果你了解spring mvc的ModelAndView,那么vo层应该很好理解
接下来我举一个例子
-------------------------下面你读懂了,就一下明白了-------------------
你的html页面上有三个字段,name,pass,age
你的数据库表里,有两个字段,name,pass(注意没有age)
而你的dto里,就应该有下面三个(因为对应html页面上三个字段)
privatestringname;
privatestringpass;
privatestringage;
这个时候,你的entity里,就应该有两个(因为对应数据库表中的2个字段)
privatestringname;
privatestringpass;
到了这里,好了,业务经理让你做这样一个业务“年龄大于20的用户才能存入数据库,否则不让,入库成功之后,需要跳转到用户列表页面(比方说是个分页查询页面),用户分页列表页面只显示name”
这个时候,你就要用到vo了,vo只有一个字段,所以你会返回一个List的列表,List里装的VO
private string name;
VO,DTO,ENTITY只是为了软件分层,如果你不分层,也完全可以做到程序完美运行,甚至可以抬杠的说,内存开销反而更小,但是分层是有巨大好处的,尤其是在架构上,比方说
可以对所有的DTO进行一个拦截,然后进行同意的数据校验,而不用在每个接口(比方说Spring MVC的controller)中判断
可以对所有返回值进行封装,比方说如果返回值是vo结尾的类名,或者在你们公司xxx.vo包下,那么就可以对这个返回值都包装一层,多出code,status等字段,方便前端接受请求
具体这些东西叫vo,还是vvvvoooo,完全取决于你们公司,主要是理解分层这个概念就好了
7. 前端调用接口404报错
今天遇到了一个很离奇的场景,使用ajax请求后台结果 后台处理成功了页面还报了404错误。
程序员不说话,默默上代码:
JS:
[javascript] view plain
var save = function(){
$.ajax({
url: urlMap.saveOrUpdateGroupInfo,
type: 'post',
async: false,
dataType: 'json',
data: $("#groupInfo").serialize()
}).done(function(res) {
console.log(res);
if(res.success) {
}else{
bootbox.alert(res.msg);
}
});
}
后端:
[java] view plain
@RequestMapping(value = "/saveOrUpdate", method = RequestMethod.POST)
public ResponseVo saveOrUpdate(String id, String name, String parentId, String parentName, String operate){
ResponseVo result = new ResponseVo();
GroupInfo info = new GroupInfo();
Date now =new Date();
info.setUpdateTime(now);
try{
if(operate.equals("add")){
info.setParentId(Integer.parseInt(parentId));
info.setName(name);
info.setCreateTime(now);
groupInfoService.addGroup(info);
}else if (operate.equals("edit")) {
info.setId(Integer.parseInt(id));
info.setName(name);
info.setParentId(Integer.parseInt(parentId));
groupInfoService.updateGroup(info);
}else if (operate.equals("delete")) {
groupInfoService.deleteGroup(Integer.parseInt(id));
}
result.setSuccess(true);
}catch (Exception e){
log.error("operate group error."+ JsonUtil.toString(info), e);
result.setSuccess(false);
result.setMsg(e.getMessage());
}
return result;
}
}
挺奇怪吧?
经分析是请求没有返回状态码,这是因为我用的是SpringMVC框架,前后端使用JSON传递数据,因为返回的是对象,而忘记了添加
@ResponseBody
注解,所以 Spring对我的返回值进行了映射,但是映射结果又对应不到视图,所以返回了404
正常后台代码:
[java] view plain
@RequestMapping(value = "/saveOrUpdate", method = RequestMethod.POST)
@ResponseBody
public ResponseVo saveOrUpdate(String id, String name, String parentId, String parentName, String operate){
ResponseVo result = new ResponseVo();
GroupInfo info = new GroupInfo();
Date now =new Date();
info.setUpdateTime(now);
try{
if(operate.equals("add")){
info.setParentId(Integer.parseInt(parentId));
info.setName(name);
info.setCreateTime(now);
groupInfoService.addGroup(info);
}else if (operate.equals("edit")) {
info.setId(Integer.parseInt(id));
info.setName(name);
info.setParentId(Integer.parseInt(parentId));
groupInfoService.updateGroup(info);
}else if (operate.equals("delete")) {
groupInfoService.deleteGroup(Integer.parseInt(id));
}
result.setSuccess(true);
}catch (Exception e){
log.error("operate group error."+ JsonUtil.toString(info), e);
result.setSuccess(false);
result.setMsg(e.getMessage());
}
return result;
}
8. 用友nc中咋样来获取前端页面中的vo的值
1、比如在ArrayList中存放的是一个bean,则取值方法:
beanname bn=new beanname();
bn=(bn)arraylist.get(i);
bn.getXXX();就是要取的值
2、如果在ArrayList中存放的是一般的数值:
String s=(String)arraylist.get(i);
int i=(int)arraylist.get(i);
9. 关于CPU前端总线和内存频率的问题
问题太多了,一个一个来。
首先:
Intel的CPU的带宽=FSB*数据总线宽度.目前的数据总线都是位宽64bits,若FSB为1066Mhz,则CPU的带宽就是1066Mhz*64bits.
内存的带宽=内存的频率*总线位宽.总线位宽目前都是64bits,若频率为533Mhz,
则内存的带宽为533Mhz*64bits.若组建双通道内存,则数据线变成64bits*2=128bits.则内存带宽=533Mhz*128bits,这样和CPU的带宽刚好吻合.
在自己组装电脑时要遵循一个原则,就是内存的带宽最好要大于或等于CPU的带宽.若内存的带宽小于CPU的带宽,那么内存就成了系统的瓶颈,内存就抑制了CPU的性能,使得CPU的性能不能充分发挥出来.
这样来说就不会因为内存带宽影响CPU的性能发挥。
假如你用DDR2 800组建双通道话,可以考虑把外频超至400MHZ。
再说DDR3,DDR3比DDR2 提供更高的内存带宽与更低的工作电压。
AMD的CPU在K8时代使用了一种HyperTransport技术即HT总线它摆脱了外频对前端总线的限制,可以为CPU到主板提供更快的频率更高的带宽。
而intel在新的CPU中也使用了相应的技术即QPI总线
10. vO dto为啥不能注入
因为他们不是注入函数。
VO(viewobject/valueobject)表示层对象为前端展示的数据,在接口数据返回给前端的时候需要转成VO。DTO(DataTransferObject)数据传输对象,是在服务间的调用中,传输的数据对象。都不是注入函数,所以无法注入。
用户姓名name、用户密码password、用户的年龄age。首先数据库层获取PO数据包含这三个字段的数据,可是password不应该暴露出去,怎么做呢,在发送给服务层的时候做一次处理,转成只有name和password的DTO,这样就能减少出数据的传输,同时将name可以改为username,就可以保证数据库结构的安全。