步驟覆盤:
1)建數據庫和表。
2)建實體類,注意用包裝類代替基本數據類,如Integer 代替int.
3)建Action類,繼承ActionSupport;
在此類中調用Service 層,利用IDE 的提示創建Service 接口和實現類,5個基本方法:增、刪、改、查多個、查單個,後期加一個getPage() 用於分頁。
在Service 實現類調用Dao 層,利用IDE 的提示創建Dao 接口和實現類,除Service 層6個方法以外,還有一個getCount() 用於獲取數據總條數。
4)建數據庫連接類:
public class DBManager {
private final static String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private final static String USERNAME = "root";
private final static String PASSWORD = "root";
private final static String URL = "jdbc:mysql://localhost:3306/1801_struts2";
public static Connection getConnection() {
try {
Class.forName(DRIVER_CLASS);
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection connection, PreparedStatement prst, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (prst != null) {
try {
prst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (prst != null) {
try {
prst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5)建數據庫工具類
public class DBUtils<T> {
public static int commonUpdate(String sql, Object... args) {
Connection connection = DBManager.getConnection();
PreparedStatement prst = null;
try {
prst = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
prst.setObject(i + 1, args[i]);
}
return prst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBManager.close(connection, prst, null);
}
return 0;
}
public List<T> commonQuery(String sql, Class<T> cls, Object... args) {
List<T> list = new ArrayList<>();
Connection connection = DBManager.getConnection();
PreparedStatement prst = null;
ResultSet resultSet = null;
try {
prst = connection.prepareStatement(sql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
prst.setObject(i+1, args[i]);
}
}
resultSet = prst.executeQuery();
while(resultSet.next()){
T ins = cls.newInstance();
Field[] declaredFields = cls.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
Object value = resultSet.getObject(field.getName());
field.set(ins, value);
}
list.add(ins);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}finally{
DBManager.close(connection, prst,resultSet);
}
return list;
}
public int commonCount(String sql) {
Connection connection = DBManager.getConnection();
PreparedStatement prst = null;
ResultSet resultSet = null;
try {
prst = connection.prepareStatement(sql);
resultSet = prst.executeQuery();
if(resultSet.next()){
return resultSet.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBManager.close(connection, prst,resultSet);
}
return 0;
}
}
6)用數據庫工具類完成Dao 的實現類方法,並用JUnit 測試:在要創建測試用例的類中按 Ctrl + Shift + T,選擇需測試的方法即可;寫一個方法測一個方法;順便在add 方法循環添加數據,用於測試分頁。
第一步至此大概用時50分鐘。
7)Action 類方法 findUserList(), 注意實體類需要setter getter.
8)userlist.jsp, 標籤;後加分頁。
JSTL & EL:
<c:forEach items="${page.list}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td>${user.age}</td>
<td><a href="findUserById?user.id=${user.id}">編輯</a> <a
href="deleteUser?user.id=${user.id}">刪除</a></td>
</tr>
</c:forEach>
...
<jsp:include page="common/page.jsp"></jsp:include>
Struts2 labels & OGNL:
<!--添加分頁後 value 改爲"page.list" -->
<s:iterator value="#request.list" var="user">
<tr>
<td><s:property value="#user.id"/> </td>
<td><s:property value="#user.username"/> </td>
<td><s:property value="#user.password"/> </td>
<td><s:property value="#user.age"/> </td>
<td>
<s:a href="findUserById?user.id=%{#user.id}">編輯</s:a>
<s:a href="deleteUser?user.id=%{#user.id}">刪除</s:a>
</td>
</tr>
</s:iterator>...
<s:include value="common/page.jsp"></s:include>
9)