Struts2入門 > 影視網demo
阿新 • • 發佈:2018-12-11
影視網demo
- 目的 以專案為驅動,學習Struts2的基本知識點。
- 專案介紹 影視網demo網站,前端佈局boostrap+js,後端Struts2,資料庫mysql+redis; 實現功能:使用者登入註冊、我喜歡; 主要知識點:攔截器,比如使用者在未登入狀態下點選“喜歡”,將會被攔截請求,通過判斷來進一步後續操作。
Just code it
- struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 實時更新到伺服器 --> <constant name="struts.devMode" value="true" /> <package name="movies" extends="struts-default"> <!-- 攔截器 --> <interceptors> <interceptor name="loginStatus" class="com.jackpon.interceptors.loginStatusInterceptor"></interceptor> <!-- 攔截棧 --> <interceptor-stack name="iloginStatus"> <!-- defaultStack一定要寫,不然無法傳引數 --> <interceptor-ref name="defaultStack" /> <interceptor-ref name="loginStatus" /> </interceptor-stack> </interceptors> <action name="like-add" class="com.jackpon.actions.likeAction" method="add"> <result>./WEB-APP/like-success.jsp</result> <!-- 呼叫攔截器 --> <interceptor-ref name="iloginStatus"></interceptor-ref> <result name="login">./WEB-APP/like-error.jsp</result> </action> <action name="like-ilist" class="com.jackpon.actions.likeAction" method="ilist"> <result>./WEB-APP/ilist.jsp</result> </action> <!-- 萬用字元匹配action,命名規範要做好才有用,比如頁面最好唯一,下面就不是很好 --> <action name="*-*" class="com.jackpon.actions.{1}Action" method="{2}"> <result>./WEB-APP/{1}-success.jsp</result> <result name="error">./WEB-APP/{1}-error.jsp</result> </action> </package> </struts>
- 專案結構 action、javabean、資料庫DB、攔截器interceptors、服務service要單獨建包,需要注意的是構建資料庫的語句要寫在資料夾mysql裡,方便他人使用,引用外部的框架放在WEB-INF>lib;
- 構建Model層 model也稱bean,在此demo中,我們只需要構建使用者User和電影Movies,由於在註冊時,有確認密碼這項,我們還需要建立UserDTO,它的作用就是User的爸爸(UserDTO包含User),User就可以從UserDTO獲取所需要的屬性值;由於專案比較小,我們可以同時建立資料庫,bean與資料庫的名字最好一致;
- 資料庫服務 DB.java用於啟動mysql服務
package com.jackpon.DB; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DB implements DBConfig{ public static Connection createConn() { Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, user, passwd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; } public static void close(Connection conn) { try { conn.close(); conn = null; //將其設定為null,系統就會自動回收 } catch (SQLException e) { e.printStackTrace(); } } public static void close(Statement stmt) { try { stmt.close(); stmt = null; } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { rs.close(); rs = null; } catch (SQLException e) { e.printStackTrace(); } } }
呼叫DB服務,以UserService.add()為例
public String add(User user) {
Connection conn= (Connection) DB.createConn();
String sql = "insert into user(name,password) values (?, ?)";
PreparedStatement ps = (PreparedStatement) DB.prepare(conn, sql);
try {
ps.setString(1, user.getName());
ps.setString(2, user.getPassword());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return ERROR;
}finally {
DB.close(ps);
DB.close(conn);
}
return SUCCESS;
}
- 攔截器
package com.jackpon.interceptors;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class loginStatusInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map session=invocation.getInvocationContext().getSession();
if (session.get("username")==null) {
return Action.LOGIN;
}else {
//表示執行成功,繼續下一個攔截器或action
return invocation.invoke();
}
}
}