剛開始將hibernate和struts2一塊兒做程序就出現很多問題,現總結如下,以後肯定還會出現問題,再總結。
1.在做struts2項目時,一定要把配置文件拼寫對。爲struts.xml,而不是struts2.並且該文件可以位於src文件夾下,只要文件名寫對。
在寫action選項時,name是什麼,就在form表單跳轉到什麼。如
<action name="userAction" class="com.bjsxt.action.UserAction" ></action>
則在提交表單時,可以用
<form method="post" action="userAction!add">
表示將表單內容提交到UserAction的add方法
2.關於拼寫,一些配置文件名,最好複製,自己寫容易出錯。比如:hibernate.cfg.xml,User.hbm.xml。一旦出錯,後果讓人蛋疼。
3.java裏properties文件的作用
properties文件就是一個文件,保存一些配置信息,和xml類似,裏邊的格式就是
a=111
b=222
c=3
UserDao =com.bjsxt.dao.UserDao
這樣的鍵值對格式。java有個類java.util.Properties,專門處理這個文件。getProperty()方法是根據屬性獲取對應的值
如有個文件dao.properties,內容爲
UserDao =com.bjsxt.dao.UserDao //注意後邊沒有分號,且key爲UserDao,value爲com.bjsxt.dao.UserDao
則可以用下列方式獲取
String path = ServletActionContext.getRequest().getRealPath("WEB-INF/classes/dao.properties");//文件一般置於固定位置
Properties pro = new Properties();
pro.load(new FileinputStream(new File(path)));
Set<Object> set = pro.keySet();//用keySet()方法獲取所有的Set中key
for(Iterator iterator=set.iterator;iterator.hasNext();){
String key = (String)iterator.next();//key爲UserDao
String clazz = pro.getProperty(key);//獲取key所對應的value
//clazz爲com.bjsxt.dao.UserDao
}
在項目中,一般把properties文件放到WEB- INF\classes目錄下,放到其它文件夾也行,但是還得配置classpath路徑。實際上做項目時只要放到src目錄下即可,在項目跑起來時,tomcat會自動將其放到WEB- INF\classes目錄。
4.用keySet()方法可以獲取Set或map等集合中所有的key
5.static{}即static塊,會在類被加載的時候執行,並且只執行一次,
SessionFactory是hibernate中很重要的類,創建該類的實例對象時會消耗較多的資源,若每次需要時都創建一個該類,那麼會降低程序執行效率。此時應該把一些代碼寫到static{}中,只會在第一次調用時執行,提高了效率。
static代碼塊是在類中獨立於類成員的語句塊,可位於任意位置,它不在任何方法體內,可以有多個,此時JVM會按照它們在類中出現的順序依次執行。每個代碼塊只執行一次。如hibernate中的工具類HiberUtil
public class HiberUtil(){
private static SessionFactory factory;
static{
Configution conf = new Configution().configure;
factory = conf.buildSessionFactory();
}
public static Session getSession(){
return factory.openSession();//開啓session
}
}
這樣以後用時,直接用下邊的即可
Session session = HiberUtil.getSession();//獲取session
6.struts2的action默認情況下返回的是String類型,不能返回int或其他類型。因爲返回的每一個String類型的結果對應一個頁面或者action 的chain的跳轉。這string類型的相當於索引,struts2根據其跳轉頁面。
<action name="firstAction" class="com.bjsxt.action.FirstAction">
<result name="success">/ok.jsp</result>
<result name="getList" type="redirect">userAction!getList.action</result>
</action>
result的默認類型是dispatcher(用來轉向jsp頁面)
7.關於s標籤和c標籤
當把roleMap放到作用域後,可以分別用c標籤和s標籤獲取
ServletContext sc = sce.getServletContext();
sc.setAttribute("roleMap", roleMap);
利用c標籤獲取,用el表達式獲取作用域的值
<c:forEach items="${roleMap}" var="result">
<option value="${result.key }">${result.value }</option>
</c:forEach>
利用s標籤獲取。注意爲#
<s:iterator value="#application.roleMap" var="result">
<option value="${result.key }">${result.value }</option>
</s:iterator>
注意二者區別。
8.若想讓某項值在服務器開啓時就執行,可以讓該類實現(即implements)ServletContextListener,再釋放到作用域中。還要在web.xml進行配置,要放在過濾器filter前邊。類似於下
<listener>
<listener-class>com.bjsxt.init.InitListener</listener-class>
</listener>