1. 程式人生 > >Struts2註解+JDBC+MySQL小專案應用

Struts2註解+JDBC+MySQL小專案應用

很簡易的Struts2,用JDBC連線MySQL資料庫。用於學習Struts2註解和JDBC基礎。

一、建立資料庫。小哆安裝的MySQL資料庫

/*
Navicat MySQL Data Transfer

Source Server         : myStruts
Source Server Version : 50142
Source Host           : localhost:3308
Source Database       : myStrutsDB

Target Server Type    : MYSQL
Target Server Version : 50142
File Encoding         : 65001

Date: 2012-01-01 10:30:30
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `userName` varchar(20) NOT NULL,
  `passWord` varchar(20) NOT NULL,
  `registeredTime` char(12) NOT NULL,
  PRIMARY KEY (`userName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('111111', '111111', '201112311022');
INSERT INTO `user` VALUES ('admin', 'admin', '201112311026');

二、建立Struts2 Project

New – Dynamic Web Project<myStruts2>

匯入jar包

1、專案中各部分介紹

1.1  WEBContent包含:

     1.1.1 login.jsp(可根據url直接登入)

     1.1.2 WEB-INF中: 1.1.2.1 web.xml

                   

1.1.2.2 success.jsp

                   1.1.2.3  failure.jsp

PS:一般web應用將jsp放在WEB-INF資料夾下的用意:WEB-INF下面的檔案會受到保護,通過瀏覽器無法直接訪問,必須通過servlet,action跳轉訪問

1.2. src包含:

     1.2.1 action包:所有Action類,必須實現getter/setter,與jsp直接互動

     1.2.2 dao包:連線資料庫的類

     1.2.3 dmo包:實體類,與資料表字段對應

     1.2.4 impl包:業務操作的實現類



2、編寫web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">

	<display-name>myStruts2</display-name>

	<!-- 使用者鍵入的URL不包含action名稱、JSP頁面或其他資源,依次尋找檔案 -->
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>

	<filter>
		<!--過濾器名字 -->
		<filter-name>struts2</filter-name>
		<!-- struts2過濾器支援的StrutsPrepareFilter類 -->
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

		<!-- 新增使用註解必須的引數,指定查詢Action類的路徑 -->
		<!-- 
		<init-param>
			<param-name>actionPackages</param-name>
			<param-value>action</param-value>
		</init-param>
 		-->
	</filter>

	<filter-mapping>
		<!--過濾器攔截名字 -->
		<filter-name>struts2</filter-name>
		<!--過濾器攔截檔案路徑名字 -->
		<!-- 萬用字元/*表示攔截所有HTTP請求 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

3、編寫login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>login</title>
</head>

<body>

<form action="register!register.action">
<table>
	<tr>
		<td>使用者名稱:</td>
		<td colspan=2><input type="text" name="userName" /></td>
	</tr>
	<tr>
		<td>密碼:</td>
		<td colspan=2><input type="password" name="passWord" /></td>
	</tr>
	<tr>
		<td><input type="reset" name="reset" value="重置" /></td>
		<td colspan=2><input type="submit" name="register" value="註冊" /></td>
	</tr>
</table>
</form>

<form action="login!login.action">
<table>
	<tr>
		<td>使用者名稱:</td>
		<td colspan=2><input type="text" name="userName" /></td>
	</tr>
	<tr>
		<td>密碼:</td>
		<td colspan=2><input type="password" name="passWord" /></td>
	</tr>
	<tr>
		<td><input type="reset" name="reset" value="重置" /></td>
		<td colspan=2><input type="submit" name="login" value="登入" /></td>
	</tr>
</table>
</form>

</body>
</html>

4、建立操作結果提示JSP<success.jsp/failure.jsp>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!-- Struts2標籤taglib -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset= UTF-8">
<title> success </title>
</head>
<body>
<!-- 用session傳輸資料 -->
${sessionScope.userName}
<!-- 先宣告taglib,value即對應傳輸資料,對應欄位名;為接收到資料時,顯示預設default -->
success<h1><s:property value="resultMsg" default="未接收到資訊"/></h1>
</body>
</html>
 failure.jsp 
    

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!-- Struts2標籤taglib -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset= UTF-8">
<title>failure</title>
</head>
<body>
failure<h1><s:property value="resultMsg" default="未接收到資訊"/></h1>
</body>
</html>

5、建立JDBC連線<dao.DBConn.java>

     

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 
 * 資料庫操作
 *
 * @author 莫小哆_ly 2011-12-31
 */
public class DBConn {
    
    private Connection conn;
    /**
     * 連線資料庫
     * @return
     */
    public Connection getConn(){
        String url = "jdbc:mysql://localhost:3308/myStrutsDB"; // 資料庫地址[jdbc:mysql://<IP>:<db-port>/<db-name>]
        String user = "root"; // 資料庫使用者名稱
        String pwd = ""; // 資料庫密碼
        try {
            Class.forName("com.mysql.jdbc.Driver"); // 載入驅動
            conn = DriverManager.getConnection(url, user, pwd);// 註冊驅動程式
            if (!conn.isClosed()) {
                System.out.println("連線成功");
            }
            if (conn == null) {
                System.out.println("連線資料庫失敗,從檢查後重新啟動!");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 關閉資料庫連線
     */
    public void closeConn(){
        if(conn!=null) {
            try{
                conn.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}
6、建立實體類<dmo.User.java>

package dmo;

/**
 * 
 * 使用者資訊
 *
 * @author 莫小哆_ly 2012-1-1
 */
public class User {
    /**
     * 使用者名稱
     */
    private String userName;
    /**
     * 密碼
     */
    private String passWord;
    /**
     * 註冊時間yyMMddHHmmss
     */
    private String registeredTime;
    
    public User() {
        
    }
    public User(String userName,String passWord,String registeredTime) {
        this.userName = userName;
        this.passWord = passWord;
        this.registeredTime = registeredTime;
    }
    
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    public String getRegisteredTime() {
        return registeredTime;
    }
    public void setRegisteredTime(String registeredTime) {
        this.registeredTime = registeredTime;
    }
}

7、建立業務實現類,包括登入、註冊、資料庫操作<impl>

7.1 impl. InsertConOpera.java(實現insert操作)

package impl;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

import dao.DBConn;

/**
 * 
 * 本頁程式碼包含 【insert】功能
 * 
 * @author 莫小哆_ly 2011-12-31
 */
public class InsertConOpera {
    
    //註冊時間yyMMddHHmmss
    private String registeredTime;
    
    /**
     * 使用者註冊功能
     * @param userName
     * @param passWord
     */
    public int save(String userName, String passWord) {
        int count = 0;
        try {
            DBConn db = new DBConn();
            Connection conn = db.getConn();
            
            // 執行靜態SQL語句
            Statement stmt = conn.createStatement();
            
            //生成註冊時間
            Date now = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");
            registeredTime = format.format(now);

            String sql0 = "INSERT INTO user(userName,passWord,registeredTime) " + " VALUES (" + "'"
                    + userName + "','" + passWord + "','" + registeredTime + "')";
            count = stmt.executeUpdate(sql0);
            if (stmt != null) { // 關閉宣告
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) { // 關閉連線物件
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            db.closeConn();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;
    }
}

7.2 impl. SelectConOper.java (實現select操作)

package impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import dao.DBConn;
/**
 * 
 * 本頁程式碼包含 【select】功能
 *
 * @author 莫小哆_ly 2012-1-1
 */
public class SelectConOper {
    
    /**
     * 註冊時檢測功能
     * @param userName
     * @return
     */
    public int select(String userName) {
        int count=0;
        try {
            DBConn db = new DBConn();
            Connection conn = db.getConn();
            Statement stmt = conn.createStatement() ;
            
            String sq20 = "SELECT count(*) FROM user WHERE userName = " 
                + "'" + userName + "'";
            //執行給定的 SQL 語句,該語句返回單個 ResultSet物件
            ResultSet rs = stmt.executeQuery(sq20) ;
            while(rs.next()){ 
                count = rs.getInt(1);
            }
            if(rs != null){ // 關閉記錄集
                try{ 
                    rs.close() ; 
                }catch(SQLException e){ 
                    e.printStackTrace() ;
                } 
            } 
            if(stmt != null){ // 關閉宣告 
                try{
                    stmt.close() ; 
                }catch(SQLException e){
                    e.printStackTrace() ;
                }
            } 
            if(conn != null){ // 關閉連線物件
                try{
                    conn.close() ;
                }catch(SQLException e){ 
                    e.printStackTrace() ; 
                }
            }
            db.closeConn();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;
    }
    
    /**
     * 靜態SQL語句
     * @param userName
     * @param passWord
     * @return
     */
    public int selectStatement(String userName,String passWord) {
        int count=0;
        try {
            DBConn db = new DBConn();
            Connection conn = db.getConn();
            Statement stmt = conn.createStatement() ;
            
            String sq20 = "SELECT count(*) FROM user WHERE userName = " 
                + "'" + userName + "' and userName = '" + passWord + "'";
            
            ResultSet rs = stmt.executeQuery(sq20) ;
            while(rs.next()){ 
                count = rs.getInt(1);
            }
            if(rs != null){ // 關閉記錄集
                try{ 
                    rs.close() ; 
                }catch(SQLException e){ 
                    e.printStackTrace() ;
                } 
            } 
            if(stmt != null){ // 關閉宣告 
                try{
                    stmt.close() ; 
                }catch(SQLException e){
                    e.printStackTrace() ;
                }
            } 
            if(conn != null){ // 關閉連線物件
                try{
                    conn.close() ;
                }catch(SQLException e){ 
                    e.printStackTrace() ; 
                }
            }
            db.closeConn();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;
    }
    
    /**
     * 動態SQL語句
     * @param userName
     * @param passWord
     * @return
     */
    public int selectPreparedStatement(String userName,String passWord) {
        int count=0;
        try {
            DBConn db = new DBConn();
            Connection conn = db.getConn();
            
            String sq30 = "SELECT count(*) FROM user WHERE userName = ? and passWord = ?";
            PreparedStatement pstmt = conn.prepareStatement(sq30);
            
            pstmt.setString(1,userName);
            pstmt.setString(2,passWord);
            
            ResultSet rs = pstmt.executeQuery() ;
            
            while(rs.next()){ 
                count = rs.getInt(1);
            }
            if(rs != null){ // 關閉記錄集
                try{ 
                    rs.close() ; 
                }catch(SQLException e){ 
                    e.printStackTrace() ;
                } 
            } 
            if(pstmt != null){ // 關閉宣告 
                try{
                    pstmt.close() ; 
                }catch(SQLException e){
                    e.printStackTrace() ;
                }
            } 
            if(conn != null){ // 關閉連線物件
                try{
                    conn.close() ;
                }catch(SQLException e){ 
                    e.printStackTrace() ; 
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;
    }
}

此處動態SQL和靜態SQL二選其一即可。

7.3 impl.RegisterImpl.java (實現註冊相關業務操作)

package impl;

/**
 * 
 * 實現註冊相關業務
 *
 * @author 莫小哆_ly 2012-1-1
 */
public class RegisterImpl {
 
    SelectConOper selectConn = new SelectConOper();
    InsertConOpera insertConn = new InsertConOpera();
    
    //校驗業務,select
    public int findByUserName(String userName) {
        int count = selectConn.select(userName);
        return count;
    }
    
    //註冊業務,insert
    public int register(String userName, String passWord) {
        int count = insertConn.save(userName,passWord);
        return count;
    }
}

7.4 impl. LoginImpl.java (實現insert操作)

package impl;

import dmo.User;

/**
 * 
 * 實現登入相關業務
 *
 * @author 莫小哆_ly 2012-1-1
 */
public class LoginImpl {
    
    SelectConOper selectConn = new SelectConOper();
    
    //登入業務,select
    public int login(User user) {
        int count = selectConn.selectStatement(user.getUserName(), user.getPassWord());
        return count;
    }
}

8、編寫Action類,與jsp互動<action.LoginAction.ava>

package action;

import java.util.Map;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import impl.RegisterImpl;
import impl.SelectConOper;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@Namespace("")
@Results({ @Result(name = "loginSuccess", location = "/WEB-INF/success.jsp"),
        @Result(name = "loginFailure", location = "/WEB-INF/failure.jsp"),
        @Result(name = "checkSuccess", location = "/WEB-INF/success.jsp"),
        @Result(name = "checkFailure", location = "/WEB-INF/failure.jsp") })
public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String            userName;
    private String            passWord;
    private String            resultMsg;
    private int               resultInt;
    
    RegisterImpl              regImpl          = new RegisterImpl();

    // 對應的jsp:
    // Namespace/類名!方法名.action
    // <form action="action/login!login.action">

    // Action!方法名.action
    // <form action="login!login.action">

    // 提交註冊
    @Action("register")
    public String register() {
        // 驗證使用者名稱是否重複
        resultInt = regImpl.findByUserName(userName);
        if (resultInt != 0) {
            resultMsg = "使用者名稱已被使用,請重新輸入";
            return "registerFailure";
        } else {
            resultInt = regImpl.register(userName, passWord);
            if (1 == resultInt) {
                // 1. 將使用者資訊儲存到Session中。
                Map<String, Object> session = ActionContext.getContext().getSession();
                session.put("userName", userName);
                session.put("passWord", passWord);
                // 2. taglib標識傳遞
                resultMsg = "註冊成功";
                return "registerSuccess";
            } else {
                resultMsg = "註冊失敗";
                return "registerFailure";
            }
        }
    }

    // 登入
    @Action("login")
    public String login() {
        resultMsg = null;
        // 對使用者的輸入格式進行驗證//應定義在jsp頁面javScript
        if ("".equals(userName) || userName == null) {
            resultMsg = "使用者名稱不能為空";
            return "checkFailure";
        } else if ("".equals(passWord) || passWord == null) {
            resultMsg = "密碼不能為空";
            return "checkFailure";
        } else {
            if (passWord.length() < 4 || passWord.length() > 10) {
                resultMsg = "密碼必須在4到10之間";
                return "checkFailure";
            }
        }
        // 資料庫查詢,根據使用者輸入與資料庫中資料匹配情況
        SelectConOper selectConOpe = new SelectConOper();
        int resultInt = selectConOpe.selectStatement(userName, passWord);
        // int resultInt =
        // selectConOpe.selectPreparedStatement(userName,passWord);

        if (1 == resultInt) {
            resultMsg = "登入成功";
            return "loginSuccess";
        } else {
            resultMsg = "登入失敗";
            return "loginFailure";
        }
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getResultMsg() {
        return resultMsg;
    }

    public void setResultMsg(String resultMsg) {
        this.resultMsg = resultMsg;
    }
}

這樣,一個很簡單的Struts2註解的WEB專案,就完成了。


另外,小哆在安裝MySQL時,遇到了不大不小的麻煩,安裝總是異常,當時就選了一個文件看了看。

百度文庫MYSQL 

連結http://wenku.baidu.com/view/b7dbf904e87101f69e3195a4.html


我還特意追了下文件源頭

百度文庫mysql5.1()

連結如下: http://wenku.baidu.com/view/4de81840be1e650e52ea99ef.html



原始碼下載: http://download.csdn.net/detail/sdsky1987/4024192