使用SSH框架实现简单的登录功能
2018-01-29 14:59
513 查看
一、准备工作
1.数据库
数据库使用mysql,下载链接https://dev.mysql.com/downloads/mysql/安装配置完成后,使用控制台进入mysql,创建数据库ssh_example
2.开发工具
开发工具与环境:MyEclipse2017,jdk1.8,tomcat8.0二、环境搭建
1.打开MyEclipse,创建web工程ssh_example
点击finish即可
2.导入jar包
jar包下载地址https://pan.baidu.com/s/1htoiLQO,密码vtf8将所有的jar包复制到工程的WebRoot/WEB-INF/lib目录下,并Add to Build Path
接下来就开始写代码了。
三、代码实现
1.创建实体类User和hibernate映射配置文件
首先在src下创建包entity,在此包下创建User.java和User.hbm.xml文件User.java:
package entity; public class User { private Integer uid; private String username; private String password; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsernam 4000 e(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [uid=" + uid + ", username=" + username + ", password=" + password + "]"; } }
User.hbm.xml:映射文件中配置的是数据库表和实体类User的映射关系
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 数据库表与实体类的映射配置 --> <hibernate-mapping> <!-- name:实体类的全路径;table:数据库中的表名 --> <class name="entity.User" table="user"> <!-- id:主键,property:一般属性 name:实体类中的属性名;column:数据库表的字段名,若不配置则默认与属性名相同 --> <id name="uid" column="uid"> <!-- 主键自增策略 --> <generator class="native"></generator> </id> <property name="username" column="username"></property> <property name="password" column="password"></property> </class> </hibernate-mapping>
2.创建UserDao类
在src下创建dao包,并在包内创建UserDao.javaUserDao.java:
package dao; import java.util.List; import org.springframework.orm.hibernate5.HibernateTemplate; import entity.User; public class UserDao { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } // 添加用户 public boolean addUser(User user) { if(!verifyUsername(user.getUsername())) { hibernateTemplate.save(user); return true; } return false; } // 验证用户名是否存在 public boolean verifyUsername(String username) { List<User> users = (List<User>) hibernateTemplate.find("from User where username=?", username); return users.isEmpty() ? false:true; } // 验证密码是否正确 public boolean verifyPassword(String username, String password) { List queryList = hibernateTemplate.find("select password from User where username=?", username); return ( queryList.get(0).toString() ).equals(password); } }
3.创建UserService类
在src下创建service包,并在包内创建UserService.javapackage service; import org.springframework.transaction.annotation.Transactional; import dao.UserDao; import entity.User; @Transactional public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public boolean loginVerify(String username, String password) { boolean passLogin = false; passLogin = userDao.verifyUsername(username); if(passLogin) { passLogin = userDao.verifyPassword(username, password); } return passLogin; } public boolean userRegister(String username, String password) { User user = new User(); user.setUsername(username); user.setPassword(password); return userDao.addUser(user); } }
4.创建action类
由于需要实现登录和注册两个功能,所以编写两个action类LoginActon和RegisterAction,分别实现登录和注册功能在src下创建action包,并在此包内创建LoginAction.java和RegisterAction两个类
LoginAction.java
package action; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; import entity.User; import service.UserService; public class LoginAction extends ActionSupport implements SessionAware { private UserService userService; private String username; private String password; private Map session; public void setSession(Map session) { this.session = session; } public void setUserService(UserService userService) { this.userService = userService; } 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 void validate() { super.clearErrorsAndMessages(); if("".equals(username)) { super.addActionError("用户名不能为空!"); } if("".equals(password)) { super.addActionError("密码不能为空!"); } } public String execute() { if(userService.loginVerify(username, password)){ User user = new User(); user.setUsername(username); user.setPassword(password); session.put("user", user); return "success"; } else { super.addActionError("登录失败!"); return INPUT; } } }
RegisterAction.java
package action; import com.opensymphony.xwork2.ActionSupport; import service.UserService; public class RegisterAction extends ActionSupport { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } private String username; private String password; 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 void validate() { super.clearErrorsAndMessages(); if("".equals(username)) { super.addActionError("用户名不能为空!"); } if("".equals(password)) { super.addActionError("密码不能为空!"); } } public String execute() { if(userService.userRegister(username, password)) { super.addActionMessage("注册成功!"); } else { super.addActionError("注册失败,该用户名已存在!"); } return "success"; } }
5.创建并编写相关配置文件
(1)log4j配置文件工程需要使用log4j作为日志输出工具,故需要log4j的配置文件
在src下创建log4j.properties文件,内容如下:
#log4j.properties log4j.rootLogger=info, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] -%m%n
(2)struts2的配置文件
在src下创建struts.xml文件,注册action,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="demo" namespace="/" extends="struts-default"> <!-- class属性中不写action的路径,因为在spring已经配置过了,应该写spring中bean的id --> <action name="loginAction" class="loginAction"> <result name="success">/loginSuccess.jsp</result> <result name="input">/login.jsp</result> </action> <action name="registerAction" class="registerAction"> <result name="success">/register.jsp</result> <result name="input">/register.jsp</result> </action> </package> </struts>
(3)hibernate核心配置文件
在该例中将hibernate核心配置文件中的配置写在了下面的spring配置文件中
(4)spring的配置文件
spring配置文件起到了整合struts2和hibernate的重要作用
在src目录下创建spring配置文件applicationContext.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 数据源的配置,使用C3P0连接池,用户名和密码需要根据实际情况配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssh_example"></property> <property name="user" value="root"></property> <property name="password" value="123456"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <!-- hibernate核心配置 --> <property name="hibernateProperties"> <props> <!-- 是否需要打印sql语句 --> <prop key="hibernate.show_sql">true</prop> <!-- 是否对打印的sql语句进行格式化(容易阅读) --> <prop key="hibernate.format_sql">true</prop> <!-- 是否自动创建表,update:若表存在则更新,不存在则自动创建 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- hibernate映射文件的引入 --> <property name="mappingResources"> <list> <value>entity/User.hbm.xml</value> </list> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 配置hibernateTemplate --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 管理struts2的action对象,scope="prototype"表示多例 --> <bean id="loginAction" class="action.LoginAction" scope="prototype"> <property name="userService" ref="userService"></property> </bean> <bean id="registerAction" class="action.RegisterAction" scope="prototype"> <property name="userService" ref="userService"></property> </bean> <bean id="userService" class="service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="dao.UserDao"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> </beans>
(5)web.xml配置
在WebRoot/WEB-INF目录下创建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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>ssh_example</display-name> <!-- 指定spring配置文件的路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- struts2核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <!-- context监听器的配置,此监听器会监听到servletContext对象的创建,然后加载spring配置文件,创建spring配置文件中声明的对象,并保存到servletContext容器中去 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
6.前台界面
最后就是编写简单的前台界面,与后台进行交互需要的界面由登陆界面,注册界面和登录成功的界面
在WebRoot目录下分别创建login.jsp,register.jsp和loginSuccess.jsp三个jsp文件,内容如下:
(1)login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>login page</title> </head> <body> <h3>登录</h3> <span style="color:red"><s:actionerror/></span> <form method="post" action="<%=path%>/loginAction.action"> <span>用户名:</span><input type="text" name="username" value="${username}"/><br/> <span>密码 :</span><input type="text" name="password" value="${password}"/><br/> <input type="submit" style="height:25px;width:237px" value="登录" /> </form> <a href="<%=path%>/register.jsp">注册页面</a> </body> </html>
(2)register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>register page</title> </head> <body> <h3>注册</h3> <s:actionmessage/> <span style="color:red"><s:actionerror/></span> <form method="post" action="<%=path%>/registerAction.action"> <span>用户名:</span><input type="text" name="username" value="${username}"/><br/> <span>密码 :</span><input type="text" name="password" value="${password}"/><br/> <input type="submit" style="height:25px;width:237px" value="注册" /> </form> <a href="<%=path%>/login.jsp">登录页面</a> </body> </html>
(3)loginSuccess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>login success page</title> </head> <body> <h1>登录成功!</h1> <h3>当前登录用户为:<s:property value="#session.user.username" /></h3> </body> </html>
整个工程的目录结构:
四、部署测试
代码终于编写完了,现在开始部署工程,测试功能有没有实现吧!部署工程后启动tomcat服务器,在浏览器的地址栏输入http://localhost:8080/ssh_example,回车就进入了下面的界面
然后点击注册页面先去注册一个账号吧
注册成功后再进入登陆页面,输入刚才注册的用户名和密码,点击登陆,如果出现下面的界面就表示大功告成了
注:如果要使密码栏不可见,只需修改jsp中密码的input标签即可
<span>密码 :</span><input type="password" name="password" value="${password}" /><br/>
最后附上整个工程的代码链接:
https://pan.baidu.com/s/1qZQ2jmc,密码:zh4k
相关文章推荐
- SSH-使用注解整合实现简单的登录功能
- 一个使用监听器模式实现的J2ME网络编程框架,包括一个简单的登录功能实现(含源代码)
- Servlet自学第13讲:使用纯Servlet实现简单登录功能
- 使用node.js实现简单注册登录功能
- 一个使用监听器模式实现的J2ME网络编程框架,包括一个简单的登录功能实现(含源代码)
- Java使用cookie实现简单的单点登录功能
- 【邂逅Filter】使用filter&servlet实现简单的登录功能
- ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
- webx学习总结(一)——使用webx框架实现简单的登录功能
- ASP.NET jQuery 食谱11 (通过使用jQuery validation插件简单实现用户登录页面验证功能)
- 使用js简单实现登录功能
- ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
- J2EE实践第四部分-使用SAP CAF实现功能的简单小例子
- 使用Javascript实现一种简单的数字混淆功能(高手绕过)
- 用最简单的函数实现功能:判断一个int数据是否是2的x次幂(不能使用循环)。
- 使用jQuery实现的简单滚动新闻功能
- 用Python 实现刷钻网上抢任务,并实现一个简单的限制使用时间的功能
- 使用.htaccess实现简单的防盗链功能
- shell 实现简单的登录和注册功能
- 使用 Raphael js 和JSON 来实现具备保存功能的简单的仿QQ秀