1. 程式人生 > >許可權系統設計-day02

許可權系統設計-day02

練習中的問題:

1,<s:url action="employee_input" />
這個標籤用來讓struts自動生成請求的路徑,struts生成的路徑是一個全路徑,包含了context/package/action_method.action
  1),context:就是我們在tomcat裡面配置的path
  2),package:struts中的包路徑;
  3),action_method:寫在s:url標籤中的action;
  4),.action:就是在struts中配置的字尾名;

2,<s:a action="employee_input"><s:param name="employee.id" value="#u.id"/>編輯</s:a>


這個標籤用來讓struts自動生成<a>標籤;
  1),生成的a標籤的href也是全路徑;
  2),在a標籤中可以加上<s:param>,
  <s:param name="" value=""/>
    1),name屬性代表新增到url中的引數的名字;
    2),value屬性代表新增到url中引數的值;

3,修改掉值的問題:
現象:在修改的時候,如果修改頁面中有一些屬性不需要修改,在修改之後,這些屬性的值就沒了;
原因:在編輯的時候,資料包裝到這個Employee中的,由於表單資料缺失,employee中會少一些屬性;

在update方法中,直接修改這個例項,hibernate中,會根據物件生成完整的UPDATE語句,所以屬性被null覆蓋了

解決方法:在包裝引數之前,先把employee查詢出來,在查詢出來的物件上面再包裝值;

prepare攔截器:
1,如果我們的Action實現了Preparable介面,prepare攔截器就會在我這個action所有的方法執行之前呼叫;
2,可以只攔截指定的方法;
  1),比如 要攔截的方法名字叫做save;
  2),在Action中建立一個public void prepareSave()方法,這個方法就可以在save方法執行之前執行;
3,預設情況下,在defalut-stack中,prepare攔截器是先於params攔截器執行的,所以在prepare攔截器中不能直接得到引數;
4,把預設攔截器棧修改為paramsPrepareParamsStack;

 

4,opensessioninview:
問題的出現:當我的employee和dept關聯,在列表裡面就顯示不出來dept相關資訊(no session的錯誤)
解決:提前開啟session,延遲關閉session(把sesion的開啟和關閉放到filter中);我們就把這種模式稱為open session in view;這種模式專門用來處理延遲載入的問題;

注意,使用了Opensessioninview的模式,我們必須保證,這個opensessioninview的filter使用的是spring提供的;
spring處理session是一整套方案:
1,在filter中開啟session,放到current thread中;
2,在aop的事務中,得到當前的session,開啟事務;
3,在dao中(sessionFactory),得到當前的session,處理DML+QUERY;
4,在aop的事務結束時,提交事務(並不會關閉session);
5,請求返回的時候,在filter中關閉session;

 

5,在修改employee的時候,修改了department,報錯;
問題原因:因為使用了opensessioninviewfilter,所以在prepareSave中查詢到的employee和employee關聯的department都是持久化物件,在提交資料的時候,我們修改了department的OID值,在hibernate中,是不允許修改持久化物件的OID的;所以hibernate報錯;
解決問題:在prepareSave方法中,設定得到的employee物件關聯的部門物件為空;