1. 程式人生 > >Struts2入門 > 影視網demo

Struts2入門 > 影視網demo

影視網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();
		}
	}

}