針對 department 資料表實作建立、更新、刪除、查詢。採四層架構:mid、midimpl、application、presentation。
四層劃分非絕對,視專案調整,但有助於職責清晰、擴展性佳。
getInstance() 取得實作類別,定義兩個抽象方法供實作。init() 取得資料源、getDepartmentDAO() 回傳 DepartmentDAOImpl 實例、getConnection() 取得資料庫連線。DepartmentDAO 介面,具體 SQL 操作。selectDepartment(String depid)、createDepartment()、updateDepartment()、deleteDepartment()。Department 相似 (引發關於合併的思考)國際化訊息資源檔。
index.jsp 入口register.jsp、success.jsp、failure.jspdepartmentList.jsp、failure.jspupdate.jsp、failure.jsp<struts-config>
<form-beans>
<form-bean name="departmentForm" type="cn.haose.struts.presentation.DepartmentForm"/>
</form-beans>
<action-mappings>
<action path="/create" type="cn.haose.struts.presentation.CreateDepartmentAction"
name="departmentForm" scope="request" input="/create/register.jsp">
<forward name="success" path="/create/success.jsp"/>
<forward name="failure" path="/create/failure.jsp"/>
</action>
<action path="/list" type="cn.haose.struts.presentation.ListDepartmentAction">
<forward name="success" path="/list/departmentList.jsp"/>
<forward name="failure" path="/list/failure.jsp"/>
</action>
<action path="/select" type="cn.haose.struts.presentation.SelectDepartmentAction">
<forward name="success" path="/update/update.jsp"/>
<forward name="failure" path="/update/failure.jsp"/>
</action>
<action path="/delete" type="cn.haose.struts.presentation.DeleteDepartmentAction">
<forward name="success" path="/list.do"/>
<forward name="failure" path="/update/failure.jsp"/>
</action>
<action path="/update" type="cn.haose.struts.presentation.UpdateDepartmentAction"
name="departmentForm" scope="request" input="/update/update.jsp">
<forward name="success" path="/list.do"/>
<forward name="failure" path="/update/failure.jsp"/>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources"/>
</struts-config>
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
<welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
<taglib>...</taglib> (bean, html, logic)
<resource-ref>
<res-ref-name>jdbc/SAMPLE</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
<Context path="/sample" docBase="sample" debug="0" reloadable="true" crossContext="true">
<Resource name="jdbc/SAMPLE" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/SAMPLE">
<parameter><name>factory</name><value>org.apache.commons.dbcp.BasicDataSourceFactory</value></parameter>
<parameter><name>driverClassName</name><value>oracle.jdbc.OracleDriver</value></parameter>
<parameter><name>url</name><value>jdbc:oracle:thin:@hao-se:1521:haose</value></parameter>
<parameter><name>username</name><value>test1</value></parameter>
<parameter><name>password</name><value>test1</value></parameter>
<parameter><name>maxActive</name><value>10</value></parameter>
<parameter><name>maxIdle</name><value>1</value></parameter>
<parameter><name>maxWait</name><value>-1</value></parameter>
</ResourceParams>
</Context>
本案例展示分層架構在 Struts 專案中的落地實作,適合初學者理解 MVC 與分層設計精髓。