步骤复盘:
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)