1. 设计思想
首先,设计个接口用来定义公共调用的DAO的方法,然后再定义个类用来实现这个接口。这样一来,我们就不要重复去写那些增、删、改、查的语句了。当然这个接口需要注入到BaseSevlet的类中,这个类就作为所有其它业务的父类,也就是,其它类,如,用户登录、用户注册的类都要继承这个类,而这个类唯一独特的地方就是,它是开启Spring的主要入口。
2. 设计类图
3. 代码实现
1) 业务操作数据库的接口。
public interface AlbumService
{
/**
* 验证用户登录是否成功。
* @param name 登录的用户名
* @param pass 登录的密码
* @return 用户登录的结果,成功返回true,否则返回false
*/
boolean userLogin(String name , String pass);
/**
* 注册新用户
* @param name 新注册用户的用户名
* @param pass 新注册用户的密码
* @return 新注册用户的主键
*/
int registUser(String name , String pass);
/**
* 添加照片
* @param user 添加相片的用户
* @param title 添加相片的标题
* @param fileName 新增相片在服务器上的文件名
* @return 新添加相片的主键
*/
int addPhoto(String user , String title , String fileName, String uuidName);
/**
* 根据用户获得该用户的所有相片
* @param user 当前用户
* @param pageNo 页码
* @return 返回属于该用户、指定页的相片
*/
List<PhotoHolder> getPhotoByUser(String user , int pageNo);
/**
* 验证用户名是否可用,即数据库里是否已经存在该用户名
* @param name 需要校验的用户名
* @return 如果该用户名可用,返回true,否则返回false。
*/
boolean validateName(String name);
}
2) 接口的实现类的具体实现方法。
public class AlbumServiceImpl implements AlbumService
{
//业务逻辑组件所依赖的2个DAO组件
private UserDao userDao = null;
private PhotoDao photoDao = null;
/**
* 依赖注入2个DAO组件所需要的setter方法
* @param userDao
*/
public void setUserDao(UserDao userDao)
{
this.userDao = userDao;
}
public void setPhotoDao(PhotoDao photoDao)
{
this.photoDao = photoDao;
}
@Override
public boolean userLogin(String name, String pass)
{
try
{
//使用UserDao根据用户名查询用户
User user = userDao.findByName(name);
if (user != null && user.getPass().equals(pass))
{
return true;
}
return false;
}
catch ( Exception e)
{
e.printStackTrace();
throw new AlbumException("处理用户登录出现异常!");
}
}
@Override
public int registUser(String name, String pass)
{
try
{
//创建一个新的User实例
User user = new User();
user.setName(name);
user.setPass(pass);
userDao.save(user);
return user.getId();
}
catch (Exception e)
{
e.printStackTrace();
throw new AlbumException("新用户注册出现异常!");
}
}
@Override
public int addPhoto(String user, String title, String fileName, String uuidName)
{
try
{
//创建一个新的Photo实例
Photo photo = new Photo();
photo.setTitle(title);
photo.setFileName(fileName);
photo.setUuidName(uuidName);
photo.setUser(userDao.findByName(user));
//持久化Photo实例
photoDao.save(photo);
return photo.getId();
}
catch (Exception e)
{
e.printStackTrace();
throw new AlbumException("添加相片过程出现异常!");
}
}
@Override
public boolean validateName(String name)
{
try
{
//根据用户名查询对应的User实例
User user = userDao.findByName(name);
if (user != null)
{
return false;
}
return true;
}
catch (Exception e)
{
e.printStackTrace();
throw new AlbumException("验证用户名是否存在的过程中出现异常!");
}
}
@Override
public List<PhotoHolder> getPhotoByUser(String user, int pageNo)
{
try
{
List<Photo> pl = photoDao.findByUser(userDao.findByName(user), pageNo);
List<PhotoHolder> result = new ArrayList<PhotoHolder>();
for (Photo p : pl)
{
result.add(new PhotoHolder(p.getTitle(), p.getFileName(), p.getUuidName()));
}
return result;
}
catch (Exception e)
{
e.printStackTrace();
throw new AlbumException("查询相片列表过程中出现异常!");
}
}
}
3) 其它业务的父类函数。
public class BaseServlet extends HttpServlet
{
protected AlbumService as;
/**
* 图片放大时,需要要给服务 提示字符
*/
protected static String IMG_CHANGE_STYLE_BIG = "big";
/**
* 图片缩小需要给服务器的提示字符
*/
protected static String IMG_CHANGE_STYLE_SMALL = "small";
/**
* 放大的比例
*/
protected static double IMG_CAHNGE_BIG_FLOAT = 1.1f;
/**
* 缩小的比例
*/
protected static double IMG_CHANGE_SMALL_FLOAT = 0.9f;
/**
* 最大放大的比例
*/
protected static double IMG_CHANGE_BIG_BIG_FLOAT = 1000.0f;
/**
* 最小缩小的宽度比例
*/
protected static double IMG_CHANGE_SMALL_WIDTH = 100.0f;
/**
* 最小缩小高度比例
*/
protected static double IMG_CHANGE_SMALL_height = 300.0f;
/**
* 图片默认的宽度
*/
protected static double IMG_WIDTH = 500f;
/**
* 图片默认的高度
*/
protected static double IMG_HEIGHT = 400f;
/**
* 定义初始化方法,获取Spring容器的引用
*/
@Override
public void init(ServletConfig config) throws ServletException
{
super.init(config);
ApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(getServletContext());
as = (AlbumService)ctx.getBean("albumService");
}
}
4) 其它的具体调用父类的类,这里竹笔者就不给出了,读者可以自己看源码。