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

Struts2之登录注册功能

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

1 . Struts环境的搭建

① 创建JavaWeb项目

在这里插入图片描述在这里插入图片描述

② 导入相关jar包

在这里插入图片描述

③ 在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();
		}
	}
}

在这里插入图片描述

② 创建用户实体类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>用于零时存储用户信息
		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,可以不写)得到首页如下:
在这里插入图片描述

进行用户注册,结果如下:
在这里插入图片描述
用户注册成功,截图如下:
在这里插入图片描述
输入用户名与密码,如下:
在这里插入图片描述

运行结果如下图所示:
在这里插入图片描述

假设输入错误用户名与密码,如下:
在这里插入图片描述
结果如下所示:
在这里插入图片描述
至此此次练习完毕。

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实战Nginx:取代Apache的高性能Web服务器 作者: 张宴 出版社: 电子工业出版社 出版年: 2010年2月 内容简介   Nginx (“engine x”) 是俄罗斯人Igor Sysoev编写的一款高性能HTTP 和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达50 000个并发连接数的响应,运行稳定,且内存、CPU等系统资源消耗非常低。   本书主要分为4个部分,第1部分为基础篇,介绍了Nginx服务器的安装与配置方法;第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──基于Nginx的NCache网页缓存系统;第3部分为实战篇,分析了Nginx在国内知名网站(如新浪播客、搜狐博客等)中的应用案例;第4部分为模块篇,对Nginx的基本模块和第三方模块进行了集中介绍。   本书是为对配置管理Nginx服务器感兴趣的读者准备的,适用于以前没有接触过Nginx,或者对Nginx有一些了解并希望能够进一步深入学习的专业系统工程师、个人网站站长及Linux/Unix从业人员。   作者简介   张宴,就职于北京金山软件公司,金山游戏官方网站──逍遥网(xoyo.com)系统架构师,技术支持部平台组组长。曾在新浪网、赶集网等公司任系统工程师、系统架构师,工作内容主要涉及:服务器系统架构设计与部署、系统运维与调优、网络故障解决、网站后端以及接口类PHP程序开发、Unix开源软件二次开发、服务器监控系统开发、系统运维与平台研发团队管理。 第1章 Nginx简介.pdf 第2章 Nginx服务器的安装与配置.pdf 第3章 Nginx的基本配置与优化.pdf 第4章 Nginx与PHP(FastCGI)的安装、配置与优化.pdf 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置.pdf 第6章 Nginx HTTP负载均衡和反向代理的配置与优化.pdf 第7章 Nginx的Rewrite规则与实例.pdf 第8章 Nginx模块开发.pdf 第9章 Nginx的Web缓存服务与新浪网的开源NCACHE模块.pdf 第10章 Nginx在国内知名网站中的应用案例.pdf 第11章 Nginx的非典型应用实例.pdf 第12章 Nginx的核心模块.pdf 第13章 Nginx的标准HTTP模块.pdf 第14章 Nginx的其他HTTP模块.pdf 第15章 Nginx的邮件模块.pdf
好的,我可以为你提供一个简单的Struts2和Hibernate框架整合实现注册和登录功能的示例。 首先,你需要创建一个基于Struts2和Hibernate的Web应用程序。接下来,你可以按照以下步骤来实现注册和登录功能: 1. 创建一个User实体类,包括id、username和password属性以及相应的getter和setter方法。 2. 创建一个UserDao类,实现用户信息的增、删、改、查等操作。在这个类中,你需要使用Hibernate提供的API来访问数据库。 3. 创建一个UserAction类,处理用户的注册和登录请求。在这个类中,你需要使用Struts2提供的API来接收用户提交的表单数据,并将其传递给UserDao类进行处理。 4. 创建一个注册页面和一个登录页面,让用户输入必要的信息。 5. 配置Struts2和Hibernate框架,确保它们能够正确地协同工作。 下面是一个简单的注册和登录功能的示例代码: User实体类: ``` public class User { private Integer id; private String username; private String password; // getter and setter methods public Integer getId() { return id; } public void setId(Integer 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; } } ``` UserDao类: ``` public class UserDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public void save(User user) { Session session = sessionFactory.getCurrentSession(); session.save(user); } public User findByUsername(String username) { Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("from User where username = :username"); query.setParameter("username", username); return (User) query.uniqueResult(); } } ``` UserAction类: ``` public class UserAction extends ActionSupport { private User user; private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String register() { userDao.save(user); return SUCCESS; } public String login() { User u = userDao.findByUsername(user.getUsername()); if (u != null && u.getPassword().equals(user.getPassword())) { return SUCCESS; } else { return ERROR; } } } ``` 注册页面: ``` <s:form action="register"> <s:textfield name="user.username" label="Username" /> <s:password name="user.password" label="Password" /> <s:submit value="Register" /> </s:form> ``` 登录页面: ``` <s:form action="login"> <s:textfield name="user.username" label="Username" /> <s:password name="user.password" label="Password" /> <s:submit value="Login" /> </s:form> ``` 以上代码仅供参考,你可以根据自己的需求进行修改和完善。同时,确保你已经正确地配置了Struts2和Hibernate框架,以便它们能够协同工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值