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.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