Struts2框架-实战练习之登录注册功能

Struts2之登录注册功能

需求:使用Struts2框架来接收请求并响应客户端,下面我们开始练习:

1 . Struts环境的搭建

① 创建JavaWeb项目

Struts2框架-实战练习之登录注册功能_第1张图片Struts2框架-实战练习之登录注册功能_第2张图片

② 导入相关jar包

Struts2框架-实战练习之登录注册功能_第3张图片

③ 在web.xml配置文件中注册过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>struts2</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置struts2的过滤器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

至此Struts2环境搭建完毕

2 . 创建用户模块

用户模块功能包括用户注册与用户登录两个功能

① 创建数据库工具类DBConnection.java

该工具用于获取数据库连接,并具有对数据库进行增删改查的功能,其本质上是对JDBC的封装。
代码如下:

package com.muke.util;

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

/**
 * 数据库工具类
 * @author kenewstar
 *
 */
@SuppressWarnings("all")
public class DBConnection {
	private static final String DBDRIVER = "com.mysql.jdbc.Driver";
	private static final String DBURL = "jdbc:mysql://localhost:3306/test";
	private static final String DBUSER = "root";
	private static final String DBPWD = "1234";
	
	private static Connection conn = null;
	private static PreparedStatement ps = null;
	private static ResultSet rs = null;
	private static int index = 0;
	
	//获取数据库连接
	public static Connection getConn() {
		try {
			//1.加载驱动
			Class.forName(DBDRIVER);
			//2.获取数据库连接
			conn = DriverManager.getConnection(DBURL,DBUSER,DBPWD);
			
		}catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	//执行数据库更新操作
	public static int executeUpdate(String sql,Object[] obj) {
		try {
			//获取连接
			conn = getConn();
			//预处理
			ps = conn.prepareStatement(sql);
			//给占位符赋值
			for(int i=0;i<obj.length;i++) {
				ps.setObject(i+1, obj[i]);
			}
			//执行sql语句
			index = ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(conn,ps,null);
		}
		return index;
	}
	//执行数据库插入操作
	public static int executeInsert(String sql,Object[] obj) {
		index = executeUpdate(sql,obj);
		return index;
	}
	//执行数据库删除操作
	public static int executeDelete(String sql,Object[] obj) {
		index = executeUpdate(sql,obj);
		return index;
	}
	//执行数据库查询操作
	public static ResultSet executeQuery(String sql,Object[] obj) {
		try {
			//获取连接
			conn = getConn();
			//预处理
			ps = conn.prepareStatement(sql);
			//给占位符赋值
			for(int i=0;i<obj.length;i++) {
				ps.setObject(i+1, obj[i]);
			}
			//执行sql语句
			rs = ps.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		return rs;
	}
	//关闭数据库资源
	public static void close(Connection conn,PreparedStatement ps,ResultSet rs) {
		try {
			if(rs!=null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(ps!=null) {
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(conn!=null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

Struts2框架-实战练习之登录注册功能_第4张图片

② 创建用户实体类User.java

首先我们创建一个用户实体类,用于临时存储数据,代码如下:

package com.muke.domain;
/**
 * 用户实体类
 * @author kenewstar
 *
 */
public class User {
	
	private int id;				//数据库编号
	private String username; 	//用户名---->对应数据库字段名
	private String password;	//用户密码--->对应数据库字段名
	//生成getter与setter方法
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	
}

③ 创建DAO层,创建UserDAO接口以及UserDaoImpl实现类

DAO层用于对数据库操作,创建SQL语句,调用步骤①中的DBConnection工具类,代码如下:

1.UserDao接口为如下:
package com.muke.dao;

import java.util.List;

import com.muke.domain.User;

/**
 * 数据访问层
 * 用于对数据库进行操作的接口
 * @author kenewstar
 *
 */
public interface UserDao {
	//用户注册
	//返回结果大于 0 则表示用户注册成功
	//否则表示用户注册失败
	int userRegister(User user);
	
	//用户登录
	//首先判断session作用域中是否有用户信息
	//若session作用域中没有用户信息,
	//则执行此接口操作用于从数据库中查找是否有此用户
	//返回用户信息
	User userLogin(User user);

}
2.创建UserDao接口实现类,如下:
package com.muke.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import com.muke.dao.UserDao;
import com.muke.domain.User;
import com.muke.util.DBConnection;

/**
 * 数据访问层的实现类
 * @author kenewstar
 *
 */
public class UserDaoImpl implements UserDao {
	
	//此obj数组用于给sql语句的占位符进行赋值
	private Object[] obj = null;
	
	@Override
	public int userRegister(User user) {
		//创建SQL语句
		String sql = "insert into user(username,password) values(?,?)";
		//给obj数组添加数据
		obj = new Object[] {user.getUsername(),user.getPassword()};
		//调用数据库工具类执行数据操作
		int i = DBConnection.executeInsert(sql, obj);
		//返回值用于验证用户注册是否成功
		return i;
	}

	@Override
	public User userLogin(User user) {
		//创建SQL语句
		String sql = "select * from user where username=? and password=?";
		//给obj数组添加数据
		obj = new Object[] {user.getUsername(),user.getPassword()};
		//调用数据库工具类执行数据查询操作
		ResultSet rs = DBConnection.executeQuery(sql, obj);
		//创建List用于零时存储用户信息
		User u= null;
		try {
			//取出结果集
			if(rs.next()) {
			    u =  new User();
				u.setId(rs.getInt(1));
				u.setUsername(rs.getString(2));
				u.setPassword(rs.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBConnection.close(null, null, rs);
		}
		return u;
	}

}
④ 创建用户模块的控制器UserAction.java类

由于本练习功能简单,因此不创建业务逻辑层,若读者想创建业务逻辑层,可自行添加。控制器代码如下:

package com.muke.action;

import java.util.Map;

import com.muke.dao.UserDao;
import com.muke.dao.impl.UserDaoImpl;
import com.muke.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 用户Action
 * @author kenewstar
 *
 */
@SuppressWarnings("all")
public class UserAction extends ActionSupport implements ModelDriven<User>{
	//声明Dao层对象,用于调用接口
	private UserDao userDaoImpl = new UserDaoImpl();
	
	//实体对象,用于接收前台请求的数据
	private User user = new User();
	
	//创建session
	Map<String,Object> session = ActionContext.getContext().getSession();	

	@Override
	public User getModel() {
		return this.user;
	}
	//用户注册功能
	public String userRegister() {
		//使用userDaoImpl调用注册方法
		int i = userDaoImpl.userRegister(user);
		if(i>0) {
			//i>0表示注册成功,跳转至登录页面,并给予用户提示,注册成功!
			//注册成功后将用户信息放在session作用域中,以便登录使用
			session.put("user", user);
			//用户注册成功的提示信息
			session.put("msg","注册成功!");
			return "login";
		}else {
			//用户注册失败
			session.put("msg", "注册失败!");
			//跳转至注册页面
			return "register";
		}
		
	}
	//用户登录功能
	public String userLogin() {
		//当用户发出登录功能请求时,首先从session域中查询是否有用户信息
		User u = (User)session.get("user");
		if(u!=null) {	//session作用域中存在该用户信息,则直接判断
			if(u.getUsername().equals(user.getUsername())&&
					u.getPassword().equals(user.getPassword())) {
				//用户信息匹配成功则跳转至main.jsp页面,并显示登录用户名
				return "main";
			}else {
				//用户登录失败,给予提示信息,返回登录页面
				session.put("msg", "登录失败!");
				return "login";
			}
		}else {
			//session作用域中不存在用户的信息,则从数据库中查找
			u = userDaoImpl.userLogin(user);
			if(u!=null) {
				//若u不等于空,则登录成功,并将信息存储在session作用域中,在主页面面显示登录用户名
				session.put("user", u);
				return "main";
			}else {
				//用户登录失败,返回至登录页面,提示用户信息
				session.put("msg", "登录失败!");
				return "login";
			}
			
		}
	}
	
}

⑤ 在struts.xml文件中配置UserAction的映射信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<!-- 打开动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	<!-- 声明常量,当struts.xml修改后,自动加载 -->
	<constant name="struts.configuration.xml.reload" value="true"/>
	<!-- 声明包 -->
	<package name="myPackage" extends="struts-default" namespace="/">
		<global-allowed-methods>regex:.*</global-allowed-methods>
		<!--UserAction配置信息-->
		<action name="user" class="com.muke.action.UserAction">
			<result name="login" type="redirect">login.jsp</result>
			<result name="main" type="redirect">main.jsp</result>
			<result name="register" type="redirect">register.jsp</result>
		</action>
	</package>
</struts>

⑥ 创建所需jsp页面

  1. 创建index.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>struts2首页</title>
</head>
<body>
	<a href="register.jsp">用户注册</a>
	<hr>
	<a href="login.jsp">用户登录</a>
</body>
</html>
  1. 创建register.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户注册页面</title>
</head>
<body>
	<h2>用户注册</h2>
	<h4 style="color:red;"><s:property value="#session.msg"/></h4>
	<hr>
	<s:form action="user" method="post">
		<s:textfield name="username" label="用户名"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:submit value="注册"></s:submit>
	</s:form>
</body>
</html>
  1. 创建login.jsp页面,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录页面</title>
</head>
<body>
	<h2>用户登录</h2>
	<h4 style="color:red;"><s:property value="#session.msg"/></h4>
	<hr>
	<s:form action="user!userLogin" method="post">
		<s:textfield name="username" label="用户名"/>
		<s:password name="password" label="密码"/>
		<s:submit value="登录"/>
	</s:form>
</body>
</html>
  1. 创建main.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
	<h2>欢迎访问</h2>
	<hr>
	<h4 style="color:red;"><i>欢迎用户 : </i>
	  <i><s:property value="#session.user.username"/></i></h4>
</body>
</html>

至此所有代码书写完毕,启动项目

⑦ 项目运行结果

输入localhost/struts2(默认端口80,可以不写)得到首页如下:
Struts2框架-实战练习之登录注册功能_第5张图片

进行用户注册,结果如下:
Struts2框架-实战练习之登录注册功能_第6张图片
用户注册成功,截图如下:
Struts2框架-实战练习之登录注册功能_第7张图片
输入用户名与密码,如下:
Struts2框架-实战练习之登录注册功能_第8张图片

运行结果如下图所示:
Struts2框架-实战练习之登录注册功能_第9张图片

假设输入错误用户名与密码,如下:
Struts2框架-实战练习之登录注册功能_第10张图片
结果如下所示:
Struts2框架-实战练习之登录注册功能_第11张图片
至此此次练习完毕。

你可能感兴趣的:(JavaEE)