延續前例,將硬編碼帳密改為從 MySQL 查詢,成功導向 success.jsp 顯示歡迎訊息,失敗導向錯誤頁。

在 struts-config.xml 內 <data-sources> 區段宣告:
<data-sources>
<data-source key="DataSource" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="url" value="jdbc:mysql://localhost:3306/struts1_login"/>
<set-property property="username" value="root"/>
<set-property property="password" value="5ihpp1314"/>
</data-source>
</data-sources>
需導入 JAR:commons-dbcp.jar、commons-pool.jar、struts-legacy.jar、mysql-connector-java-5.0.5-bin.jar。
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginActionForm f = (LoginActionForm) form;
String username = f.getUsername();
String userpass = f.getUserpass();
ServletContext ctx = getServlet().getServletContext();
DataSource ds = (DataSource) ctx.getAttribute("DataSource");
boolean ok = false;
String sql = "SELECT * FROM user WHERE username=? AND password=?";
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, username);
ps.setString(2, userpass);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) ok = true;
}
} catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("username", username);
return mapping.findForward(ok ? "success" : "error");
}
}
改良點:使用 PreparedStatement 防 SQL 注入,try-with-resources 自動關閉資源。
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html><body>
<h1>welcome <font color="red" size="8"><bean:write name="username"/></font> here,thanks</h1>
</body></html>
Struts 1 將資料源放在 Controller 層(Action)並非最佳實踐。實務上建議:
context.xml(Tomcat JNDI)或 Spring 容器。