很简易的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
- <pre class="html" name="code"><%@ 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></pre>
- <pre></pre>
- failure.jsp
- <p></p>
- <p></p>
- <pre class="html" name="code"><%@ 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></pre><br>
- 5、创建JDBC连接<dao.DBConn.java><br>
- <p> </p>
- <pre class="java" name="code">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();
- }
- }
- }
- }</pre>6、创建实体类<dmo.User.java>
- <p></p>
- <p></p>
- <pre class="java" name="code">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;
- }
- }</pre><br>
- 7、创建业务实现类,包括登录、注册、数据库操作<impl>
- <p></p>
- 7.1 impl. InsertConOpera.java(实现insert操作)
- <p></p>
- <p></p>
- <pre class="java" name="code">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;
- }
- }</pre><br>
- 7.2 impl. SelectConOper.java (实现select操作)<br>
- <p></p>
- <p></p>
- <pre class="java" name="code">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;
- }
- }</pre><br>
- 此处动态SQL和静态SQL二选其一即可。
- <p></p>
- <p>7.3 impl.RegisterImpl.java (实现注册相关业务操作)<br>
- </p>
- <p></p>
- <pre class="java" name="code">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;
- }
- }</pre><br>
- 7.4 impl. LoginImpl.java (实现insert操作)<br>
- <p></p>
- <p></p>
- <pre class="java" name="code">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;
- }
- }</pre><br>
- 8、编写Action类,与jsp交互<action.LoginAction.ava>
- <p></p>
- <p></p>
- <pre class="java" name="code">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;
- }
- }</pre><br>
- 这样,一个很简单的Struts2注解的WEB项目,就完成了。