這學期的Web作業要求用這個框架來搭建一個Web App,這里快樂地記一下自己的實現步驟。
本工程沒有使用maven、gradle等構建工具。
本框架對應使用數據庫MySQL,並采用C3P0連接池,下載地址:https://sourceforge.net/projects/c3p0/
創建項目
新建項目。左側選擇Spring,右側選擇Struts2, Application Server, Hibernate,點擊庫名后會在下方出現相應的配置,沒有本地庫的選擇Download就可以,在配置選項完成之后IDE會自動下載對應的jar。
之后Next→工程起名→Finish。
接下來會有或長或短的一段配置時間。如果之前有選過Download,則會先自動下載對應的jar包。
導入其他相關的jar包
項目創建完成之后,需要手動往項目中導入需要的其他jar包。導入方法是將jar文件放入工程的lib目錄下,然后在IDE中進行相關配置。
- mysql-connector-java:MySQL的java驅動,下載地址:https://dev.mysql.com/downloads/connector/j/
- c3p0連接池相關的包,本文最開始已提供下載地址:https://sourceforge.net/projects/c3p0/
- spring-web,下載地址:https://mvnrepository.com/artifact/org.springframework/spring-web
- struts2-spring-plugin,下載地址:https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin
添加數據庫
接下來配置數據庫。
選擇IDE最右側欄的Database標簽,點擊加號,選擇Data Source中的MySQL:
先填URL,之后Name、Host、Database等會自動生成,然后填好用戶名和密碼,單擊Test Connection,顯示連接成功后,單擊OK。
這是就會在窗口中看到剛連接好的數據庫了:
我們可以通過這個小工具代替MySQL的Shell或者Workbench使用。
創建實體類和ORM文件
接下來要創建的是數據庫各表對應的實體類了,這里IDE可以全部自動生成。具體操作見下:
單擊IDE左下方的Persistence,在彈出標簽頁的工程名那里右鍵,選擇Generate Persistence Mapping中的By Database Schema。
按下圖所示進行操作:
配置完成后,就可以看到在所選的包下生成了數據表對應的實體類和hbm.xml文件。
至此,持久化類已生成完畢。
本框架會涉及到4個xml配置文件:
- web.xml - web application
- struts.xml - struts2
- hibernate.cfg.xml - Hibernate
- applicationContext.xml - Spring
配置web.xml
web.xml需要添加對struts2和spring的支持,其中struts2的部分(過濾器)已經自動配置好了:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
接下來只需要配置spring的部分:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/applicationContext.xml</param-value> </context-param>
配置struts.xml
struts.xml中主要配置的是各種action,在和spring搭配使用的情況下,action的class需要與spring生成的JavaBean的id對應。
添加action的示例如下:
<struts> <constant name="struts.objectFactory" value="spring"/>
<package name="blogPkg" namespace="/blogs" extends="struts-default"> <action name="login" class="login"> <result name="login">UserLogin.jsp</result> </action> <action name="signup" class="signup"> <result name="signup">UserSignup.jsp</result> </action> </package>
</struts>
<struts></struts> 是struts.xml文件的根標簽,其下的標簽結構為:
- <constant/> 用於定義常量,name屬性為常量名,value屬性為常量值。
- <include/> 用於包含其他的struts.xml配置文件,這里沒有用到。
- <package></package> 用於將多個action組織成一個模塊。
- <action></action> 用於注冊action。name屬性用來標識action,class為action所在類的位置,method指要訪問action類中的方法名。
- <param></param> 參數設置。name對應Action中的bean屬性名。
- <result></result> 對應Action類的返回值。name屬性和返回值內容一致。
- <action></action> 用於注冊action。name屬性用來標識action,class為action所在類的位置,method指要訪問action類中的方法名。
配置hibernate.cfg.xml
這個是Hibernate框架的核心配置文件。
實際上Hibernate框架相關的配置文件有兩種:一個是核心配置文件hibernate.cfg.xml;另一個是針對每個實體類都有的一個OR映射文件xxx.hbm.xml,這個文件在之前的步驟中已經自動創建好了。
hibernate.cfg.xml主要涉及MySQL的驅動和登錄,以及Hibernate的相關配置。
此文件在前面生成持久化類的時候選擇創建。自動生成的配置文件已經包含了OR映射的部分,我們只需要添加MySQL的部分就可以了:
<!--MySQL驅動--> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/servlet_db?serverTimezone=GMT</property> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <!--MySQL的用戶名和密碼--> <property name="connection.username">root</property> <property name="connection.password">yourPassword</property>
配置applicationContext.xml
這個是有關spring的配置。Spring本質上是一個BeanFactory,可以按照業務邏輯的需求生產出各種JavaBean。
在本工程里涉及C3P0連接池的配置、SessionFactory的配置、各層(Action、業務邏輯、DAO)的配置。
此文件需要手動創建:在工程目錄的src處右鍵,選擇XML Configuration File下的Spring Config,然后起好名字就可以了。
創建完成之后,需要先配置一下Spring的Application Context。一般來說IDE會在頁面上方自動提示,按照提示完成即可。如果沒有提示,需要進入Project Structure(Ctrl+Alt+Shift+S),在Facets中的Spring里,單擊加號創建新的application context,把剛才創建的xml添加進來即可,如下圖。
初創建的ApplicationContext.xml文件是一個只包含一個根節點<beans></beans>的xml文件,我們需要手動向<beans></beans>中添加bean標簽。
關於c3p0連接池,這里將其封裝為一個JavaBean:
<!-- 數據源(C3P0連接池) --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/servlet_db?serverTimezone=GMT"/> <property name="user" value="root"/> <property name="password" value="yourPassword"/> <property name="maxPoolSize" value="80"/> <property name="minPoolSize" value="1"/> <property name="initialPoolSize" value="1"/> <property name="maxIdleTime" value="20"/> </bean>
對於其他類的配置,基本格式如下:
<bean id="規定Bean的ID" class="來自於哪個類"> <property name="來自於那個類的某個屬性名" ref="依賴的bean的ID"/> </bean>
Bean有以下的屬性,除了class屬性必須配置,其他屬性都可以不配置:
- id - 在整個IoC容器中的唯一標識
- class - 實例化的Bean類
- scope - 作用域,有5種類型:
- singleton - 單例,bean容器
- prototype - 每次請求創建新的實例
- request - 每次請求創建新的實例,僅在當前request有效
- session - 每次請求創建新的實例,僅在當前sessioni有效
- global session - 這里同session
- constructor arguments - 構造器參數
- proterties - 屬性,構造器注入還是設值注入
- autowriting mode - 自動裝配模式
- lazy-initialization mode - 懶加載模式
- initialization/destruction method - 構造/析構方法