文档章节

struts2+spring实现简单用户登录注册

赵世传
 赵世传
发布于 2011/06/15 00:23
字数 1522
阅读 10098
收藏 6

在前面demo的基础上再做一个涉及数据库访问,分层结构的简单用户登录注册例子,步骤如下:

1.新建user表,sql语句如下

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `name` char(128) NOT NULL,
  `credits` int(11) default '0',
  `password` varchar(32) NOT NULL,
  `last_visit` datetime default NULL,
  `last_ip` varchar(23) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2.新建注册页面register.jsp,登录的页面还是前面的index.jsp,两者很相似

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
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>
    <base href="<%=basePath%>">
    
    <title>My JSP 'register.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  	<form action="Register" method="post">
  	
	<Table>
		<Tr>
			<td>用户名:</Td>
			<td><input type="text" name="username" /></Td>
		</Tr>
		<Tr>
			<td>密码:</Td>
			<td><input type="password" name="password" /></Td>
		</Tr>
		<Tr>
			<td><input type="submit" name="submit" value="注册"/></Td>
			<td><input type="reset" name="reset" value="重置"/></Td>
		</Tr>
	</Table> 
  	
  	
  	</form>  
  </body>
</html>

3.导入所需要的包mysql-connector-java(jdbc驱动),spring里的jdbc,transaction包,commoms-dbcp,commons-pool(两者配合使用完成数据库连接池),导入完成后要在spring配置文件中进行配置,配置文件在后面给出

4.由于用户注册需对密码进行md5加密,所以先给出md5加密的工具类Md5Encode.java,此文件为网上看到的,直接拿来用的

package com.struts2.util;

import java.security.MessageDigest;

public class Md5Encode {
	
	private final static String[] hexDigits={
		"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
	

	public static String byteArrayToHexString(byte[] b){
		StringBuffer resultSb=new StringBuffer();
		for(int i=0;i<b.length;i++){
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}
	
	private static String byteToHexString(byte b){
		int n=b;
		int d1=0;
		int d2=0;
		if(n<0){
			n=256+n;
			d1=n/16;
			d2=n%16;
		}
		return hexDigits[d1]+hexDigits[d2];
	}
	
	public static String MD5Encode(String origin){
		String resultString=null;
		try{
			resultString=new String(origin);
			MessageDigest md=MessageDigest.getInstance("MD5");
			resultString=byteArrayToHexString(md.digest(resultString.getBytes()));
		}catch(Exception e){
			
		}
		return resultString;
	}
}

5.在程序里添加dao,model与service(前面例子已经添加过)

    加好后,先在model package里加入实体类Usre.java

package com.struts2.model;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{
	private int uid;
	private String username;
	private String password;
	private int credits;
	private String lastIp;
	private Date lastVisit;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	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 int getCredits() {
		return credits;
	}
	public void setCredits(int credits) {
		this.credits = credits;
	}
	public String getLastIp() {
		return lastIp;
	}
	public void setLastIp(String lastIp) {
		this.lastIp = lastIp;
	}
	public Date getLastVisit() {
		return lastVisit;
	}
	public void setLastVisit(Date lastVisit) {
		this.lastVisit = lastVisit;
	}
	
	
}

dao与Service里最好加上接口包,在这里,我只在dao里加了接口包,并在里面写了dao接口类IUserDao.java

package com.struts2.dao.impl;

import com.struts2.model.User;

public interface IUserDao  {
	public void addUser(User user);
	public void delUser(User user);
	public User findUserByName(String username);
	public void updateUser(User user);
	public boolean checkUser(String username,String password);
	public boolean register(User user);
}

下面是实现接口的UserDao.java

package com.struts2.dao;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import com.struts2.dao.impl.IUserDao;
import com.struts2.model.User;

public class UserDao implements IUserDao  {
	private JdbcTemplate jdbcTemplate;
	
	//注入
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public void addUser(User user) {
		// TODO Auto-generated method stub
		
	}

	

	public void delUser(User user) {
		// TODO Auto-generated method stub
		
	}

	public User findUserByName(String username) {
		// TODO Auto-generated method stub
		return null;
	}

	public void updateUser(User user) {
		// TODO Auto-generated method stub
		
	}

	public boolean checkUser(String username, String password) {
		// TODO Auto-generated method stub
		System.out.println(password);
		String sql="select count(*) from user where name=? and password=? ";
		int count=jdbcTemplate.queryForInt(sql,new Object[]{username,password});
		return count>0;
	}

	public boolean register(User user)  {
		// TODO Auto-generated method stub
		System.out.println("beign dao");
		String sql="insert into  user (name,credits,password,last_visit,last_ip) values (?,?,?,?,?)";
		Object[] args={user.getUsername(),user.getCredits(),user.getPassword(),user.getLastVisit(),user.getLastIp()};
		try{
			jdbcTemplate.update(sql, args);
			
		}catch (DataAccessException e)
		{
			e.printStackTrace();
			return false;
		}
	
		return true;
		
	}
	
	
}

有些方法加上了,没实现,其中对数据库的操作是使用了spring里封装的jdbc

最后就是Service了,我把登录和注册写成了两个Service类,好的做法应该写成一个UserService类,里面写两个方法就可以了

既然写了两个文件,就都贴出来吧

LoginService.java

package com.struts2.service;

import com.struts2.dao.UserDao;
import com.struts2.model.User;

public class LoginService {
	private UserDao userdao;
	public boolean login(User user) throws Exception{
		boolean flag=false;
		if(userdao.checkUser(user.getUsername(), user.getPassword())){
			flag=true;
		}
		return flag;
	}
	public void setUserdao(UserDao userdao) {
		this.userdao = userdao;
	}
	
	
}

RegisterService.java

package com.struts2.service;

import com.struts2.dao.UserDao;
import com.struts2.model.User;

public class RegisterService {
	private UserDao userDao;
	public boolean Register(User user){
		System.out.println("begin Service");
		return userDao.register(user);
		
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	

}

6.在编写完分层后,添加ReigsterAction.java并修改前面的LoginAction.java

RegisterAction.java

package com.struts2.action;

import java.util.Date;
import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.struts2.model.User;
import com.struts2.service.RegisterService;
import com.struts2.util.Md5Encode;

import org.apache.struts2.ServletActionContext;

public class RegisterAction extends ActionSupport implements Action{
	private String username;
	private String password;
	
	private RegisterService registerService;
	public String execute() throws Exception{
		System.out.println("begin action");
		
		
		User user=new User();
		user.setUsername(username);
		user.setPassword(Md5Encode.MD5Encode(password));
		user.setCredits(10);
		user.setLastVisit(new Date());
		user.setLastIp(ServletActionContext.getRequest().getRemoteAddr());
		if(this.registerService.Register(user)){
			return this.SUCCESS;
		} else{
			return this.ERROR;
		}
		
		
	}
	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 setRegisterService(RegisterService registerService) {
		this.registerService = registerService;
	}
	
}

LoginAction.java

package com.struts2.action;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.struts2.model.User;
import com.struts2.service.LoginService;
import com.struts2.util.Md5Encode;

public class LoginAction extends ActionSupport implements Action{
	private static final long serialVersionUID  =   1L ;
	private String username;
	private String password;
	
	private LoginService loginService;
	
	@Override
	public void validate()
	{
		
	}
	
	
	public String execute() throws Exception
	{	
		
		User user=new User();
		user.setUsername(username);
		user.setPassword(Md5Encode.MD5Encode(password));
		boolean result=this.loginService.login(user);
		if(result){
			return this.SUCCESS;
		}else{
			return this.ERROR ;
		}	
		
	}

	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 LoginService getLoginService() {
		return loginService;
	}

	public void setLoginService(LoginService loginService) {
		this.loginService = loginService;
	}
	
	
	
}

7.配置struts.xml,配置新的action

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.i18n.encoding" value="utf-8"></constant>
   
   <constant name="struts.objectFactory" value="spring"></constant>
   
   
	<package name="strutsqs"  extends="struts-default">
		<action name="Login" class="com.struts2.action.LoginAction">
			<result name="success">/welcome.jsp</result>
			<result name="error">/error.jsp</result>
		</action>
		<action name="Register" class="com.struts2.action.RegisterAction">
			<result name="success">/welcome.jsp</result>
			<result name="error">/error.jsp</result>
		</action>
	</package>
</struts>

8.最后给出最重要的spring配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC    
    "-//SPRING//DTD BEAN//EN"   
    "http://www.springframework.org/dtd/spring-beans.dtd">  
<beans> 
	<!-- 数据源配置 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/spring"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root"></property>
	</bean> 
	<!-- 定义Spring JDBC模板类bean -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- dao -->
	<bean id="userDao" class="com.struts2.dao.UserDao">
		<property name="jdbcTemplate" ref="jdbcTemplate" ></property>
	</bean>
	<!-- service -->
	<bean id="registerService" class="com.struts2.service.RegisterService">
		<property name="userDao" ref="userDao"></property>
	</bean>
	<bean id="loginService" class="com.struts2.service.LoginService">
		<property name="userdao" ref="userDao"></property>
	</bean>
	<!-- action -->
    <bean id="login" class="com.struts2.action.LoginAction">
    	<property name="loginService" ref="loginService"></property>
    </bean> 
    <bean id="register" class="com.struts2.action.RegisterAction">
    	<property name="registerService" ref="registerService"></property>
    </bean> 
</beans>

从上面明显可以看出层之间的依赖关系,action-->service-->dao--->jdbc模板--->数据源

© 著作权归作者所有

共有 人打赏支持
赵世传

赵世传

粉丝 19
博文 15
码字总数 11141
作品 0
浦东
程序员
私信 提问
加载中

评论(2)

pounds
pounds
楼主,你的web.xml代码怎么不贴出来啊
克松
克松
你这能运行起来吗?
Bmob用户功能详解(一)

在开发应用程序的时候,很多情况下我们需要进行用户注册、登录、修改密码等等一系列和用户相关的功能。 那么要实现这些功能比较普遍的做法是,有一个服务器端,包括数据库设计、服务器部署、...

2013020735
2017/01/04
429
0
请教,《订单时效性,如何实现》?

最近,在完善一个综合业务系统,其中有一个占位订单管理。 现在存在的问题: 客户在下订单后,由于订单太多,业务人员不能按时处理,导致大量空位被 没有成交的订单占用。 改进解决方案: 给...

叶城主
2011/07/26
593
0
基于Struts2+Spring下搭建WebSocket

如何在基于Struts2+Spring框架下搭建websocket? 这个是spring websocket文档地址:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html 我按照里面的......

隔壁小陈
2017/04/02
539
1
Bmob用户功能详解(二)

扩展用户 上一篇文章中我介绍了怎么使用BmobSDK进行简单的用户注册、登录操作。 文中我们是使用BmobSDK默认的BmobUser类来设置用户名、密码注册登录的。这是一种非常简单的用户对象,只包含了...

2013020735
2017/01/11
243
0
快速开发之-用Bmob实现APP用户功能(二)

上一篇文章中我介绍了怎么使用BmobSDK进行简单的用户注册、登录操作。 文中我们是使用BmobSDK默认的BmobUser类来设置用户名、密码注册登录的。这是一种非常简单的用户对象,只包含了用户名和...

大王12
2017/03/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
48分钟前
2
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
3
0
3分钟总结Mybatis别名

1.系统内置别名: 把类型全小写(resultType/paramType) 2.给某个类起别名 2.1 alias=”自定义” <typeAliases> <typeAlias type="com.bjsxt.pojo.People" alias="peo"/> </typeAli......

KingFightingAn
昨天
2
0
JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
昨天
8
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部