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,就可以保證資料庫結構的安全。