当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪单例模式(singleton)      单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,只有一个实例是很重要的,虽然系统中可以有许多打印机,但却只应该有.........
    ▪SpringMVC      SpringMVC+SpringJDBC+SpringTransaction 之前学习使用过Spring2.5以及和Hibernate和Struts2的集成,初步了解了Spring,业界对Spring的评价很高,我对其强大的功能只有蜻蜓点水般的体验,一直想学习接.........
    ▪struts2技术实现用户名唯一的验证处理详解      在项目的开发过程中离不开用户名唯一的验证或者邮件唯一的验证.那通过struts2技术是怎么实现,下面以用户名唯一验证案例讲解。 实现效果:       当用户名输入框失去焦.........

[1]单例模式(singleton)
    来源: 互联网  发布时间: 2013-11-19
单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,只有一个实例是很重要的,虽然系统中可以有许多打印机,但却只应该有一个打印机假脱机,只应该有一个文件系统和一个窗口管理器,一个数字滤波器只能有一个A/D转换器,一个会计系统只能专用于一个公司。怎样才能保证一个类只有一个实例并且这个实例易于被访问,一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象,一个更好的方法是让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,这就是Singleton模式。

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

实用性:在下面的情况下可以使用Singleton模式。
l         当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
l         当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

例如:
一个产生随机数的例子,整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。
 
参与者:Singleton:定义一个Instance操作,允许客户访问它的唯一实例,Instance是一个类操作。可能负责创建自己的唯一实例。
协作关系:客户只能通过Singleton的Instance操作访问一个Singleton的实例。
使用Singleton模式有许多优点:
1.        对唯一实例的受控访问,
2.        缩小命名空间,
3.        允许对操作和表示的精化,
4.        允许可变数目的实例。
5.        比类操作更灵活。
代码:
单例模式中需要解决的重要问题是方法的同步问题,同步的粒度有多大等。在本例子中同在获得类的实例的时候使用了同步,代码如下:
publicclass Singleton{
  private Singleton(){
    generator =new Random();
  }
  publicvoid setSeed(int seed){
    generator.setSeed(seed);
  }
  publicint nextInt(){
    returngenerator.nextInt();
  }
  publicstaticsynchronized Singleton getInstance(){
    if (instance == null) {
      instance
    
[2]SpringMVC
    来源: 互联网  发布时间: 2013-11-19
SpringMVC+SpringJDBC+SpringTransaction

之前学习使用过Spring2.5以及和Hibernate和Struts2的集成,初步了解了Spring,业界对Spring的评价很高,我对其强大的功能只有蜻蜓点水般的体验,一直想学习接触一下Spring3.x,这会儿开始写了一个入门的SpringMVC+SpringJDBC和SpringTransaction的登陆案例,如同盲人摸象般地开始探索大象了。

至于Spring3的新特性,网上都有很多介绍,我看了,有很多东西没有实践过,所以一知半解,这里就不写了,那么就先找找感觉吧,开始我的编程之旅了...

看看我们的准备环境:
Spring3是基于JDK1.5的,对JDK1.6全面支持,所以编译Spring3.0必须使用JDK1.5以上,我用的是1.7版本的,数据库是MySQL5.0,开发工具是Meclipse8.5,。

1.工程名:spring3_learning,Jar包的准备:

这些jar包我都有上传,已经分类好了,可以直接去我的博客下载:http://download.csdn.net/detail/ysjian_pingcx/5335834

2.包结构的设计:

model包放的是与数据库有对应表的实体,vo包是一些Value Object用于辅助信息封装的,util放的是一些系统用到的工具类,controller放的是前段控制器
当模块多的时候,有必要在controller,dao,service,model前面加上模块名,便于管理和维护,此时可以讲util包加上system,
test是一个同等于src的目录,用于jUnit4测试的。

3.model的建立:
User:
package com.meritit.ysjian.spring3learning.model;

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

public class User implements Serializable{
	private static final long serialVersionUID = -5271584436847697641L;

	private int userId;

	private String userName;

	private String password;

	private int credits;

	private String lastIp;

	private Date lastVisit;

	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;
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	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;
	}

	@Override
	public String toString() {
		return "User [credits=" + credits + ", lastIp=" + lastIp
				+ ", lastVisit=" + lastVisit + ", password=" + password
				+ ", userId=" + userId + ", userName=" + userName + "]";
	}
}
LoginLog:
package com.meritit.ysjian.spring3learning.model;
import java.io.Serializable;
import java.util.Date;

public class LoginLog implements Serializable{
	
	private static final long serialVersionUID = -1764224611964600980L;

	private int loginLogId;

	private int userId;

	private String ip;

	private Date loginDate;

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public Date getLoginDate() {
		return loginDate;
	}

	public void setLoginDate(Date loginDate) {
		this.loginDate = loginDate;
	}

	public int getLoginLogId() {
		return loginLogId;
	}

	public void setLoginLogId(int loginLogId) {
		this.loginLogId = loginLogId;
	}
	
	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	@Override
	public String toString() {
		return "LoginLog [ip=" + ip + ", loginDate=" + loginDate
				+ ", loginLogId=" + loginLogId + ", userId=" + userId + "]";
	}
}

4.接口的设计,Dao:
IUserDao:
package com.meritit.ysjian.spring3learning.dao;

import com.meritit.ysjian.spring3learning.model.User;

public interface IUserDao {

	/**
	 * 根据用户名和密码获取匹配的个数
	 * @param userName 用户名
	 * @param password 密码
	 * @return 返回匹配的个数
	 */
	public int getMatchCount(final String userName, final String password);

	/**
	 * 根据用户名查找用户
	 * @param userName 用户名
	 * @return 返回用户对象
	 */
	public User findUserByUserName(final String userName);

	/**
	 * 更新登陆信息
	 * @param user 登陆用户
	 */
	public void updateLoginInfo(User user);
}
UserDao:
package com.meritit.ysjian.spring3learning.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;

import com.meritit.ysjian.spring3learning.dao.IUserDao;
import com.meritit.ysjian.spring3learning.model.User;
import com.meritit.ysjian.spring3learning.util.EncryptUtils;

@Repository
// 注解Repository,告诉Spring这是一个仓库
public class UserDao implements IUserDao {

	@Autowired
	// 装配JdbcTemplate,JdbcTemplate在applicationContext.xml中配置了
	private JdbcTemplate jdbcTemplate;

	/**
	 * 根据用户名和密码获取匹配的个数
	 * 
	 * @param userName
	 *            用户名
	 * @param password
	 *            密码
	 * @return 返回匹配的个数
	 */
	public int getMatchCount(final String userName, final String password) {
		String sqlStr = " SELECT count(*) FROM tb_user "
				+ " WHERE user_name =? and password=? ";
		return jdbcTemplate.queryForInt(sqlStr, new Object[] { userName,
				EncryptUtils.encryptByMD5(password) });
	}

	/**
	 * 根据用户名查找用户
	 * 
	 * @param userName
	 *            用户名
	 * @return 返回用户对象
	 */
	public User findUserByUserName(final String userName) {
		String sql = " SELECT user_id,user_name,credits "
				+ " FROM tb_user WHERE user_name =? ";
		final User user = new User();
		jdbcTemplate.query(sql, new Object[] { userName },
				new RowCallbackHandler() {
					public void processRow(ResultSet rs) throws SQLException {
						user.setUserId(rs.getInt("user_id"));
						user.setUserName(userName);
						user.setCredits(rs.getInt("credits"));
					}
				});
		return user;
	}

	/**
	 * 更新登陆信息
	 * 
	 * @param user
	 *            登陆用户
	 */
	public void updateLoginInfo(User user) {
		String sql = " UPDATE tb_user SET last_visit=?,last_ip=?,credits=? "
				+ " WHERE user_id =?";
		jdbcTemplate.update(sql, new Object[] { user.getLastVisit(),
				user.getLastIp(), user.getCredits(), user.getUserId() });
	}
}
@上面的findUserByUserName方法中用到了SpringJDBC的底层薄封装,jdbcTemplate.query(sql,new Object[]{userName},new RowCallbackHandler(){...})是一个匿名类实现的回调函数

ILoginLogDao:
package com.meritit.ysjian.spring3learning.dao;

import com.meritit.ysjian.spring3learning.model.LoginLog;

public interface ILoginLogDao {

	/**
	 * 记录日志
	 * @param loginLog 日志对象
	 */
	public void insertLoginLog(LoginLog loginLog);
}
LoginLog:
package com.meritit.ysjian.spring3learning.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.meritit.ysjian.spring3learning.dao.ILoginLogDao;
import com.meritit.ysjian.spring3learning.model.LoginLog;

@Repository
// 注解Repository,告诉Spring这是一个仓库
public class LoginLogDao implements ILoginLogDao {

	@Autowired
	// 装配JdbcTemplate,JdbcTemplate在applicationContext.xml中配置了
	private JdbcTemplate jdbcTemplate;

	/**
	 * 记录日志
	 * 
	 * @param loginLog
	 *            日志对象
	 */
	public void insertLoginLog(LoginLog loginLog) {
		String sql = "INSERT INTO tb_login_log(user_id,ip,login_datetime) "
				+ "VALUES(?,?,?)";
		Object[] args = { loginLog.getUserId(), loginLog.getIp(),
				loginLog.getLoginDate() };
		jdbcTemplate.update(sql, args);
	}      
    
[3]struts2技术实现用户名唯一的验证处理详解
    来源: 互联网  发布时间: 2013-11-19

在项目的开发过程中离不开用户名唯一的验证或者邮件唯一的验证.那通过struts2技术是怎么实现,下面以用户名唯一验证案例讲解。

实现效果:

     

当用户名输入框失去焦点的时候,能够实现用户名唯一的验证

步骤:

  1、设计界面代码

并且引入js文件

2、在util.js文件中封装

     1、通过id获取dom对象的方法

     2、创建XMLHTTPRequest对象的方法

3、在reg.js文件实现 功能

4、创建Action 

   说明:1、封装的name属性是接受 ajax请求传递的name参数

         2、checkName方法就是处理用户名唯一验证的方法. 此方法是在struts.xml文件中通过通配符配置的(详见struts.xml文件)。

5、配置struts.xml文件

作者:chrp99 发表于2013-5-6 19:03:29 原文链接
阅读:2 评论:0 查看评论

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3