使用UML设计程序
使用 用例图 画出程序的功能模块(小人代表角色,椭圆代表功能)
第一步:画出实体类的关联关系
使用类图设计程序(关键)
单向箭头表示单向关联,没有箭头表示双向关联,线的属性(关联属性)
类的属性和方法一般隐藏
第二步:Dao的设计与实现
BaseDao定义每个Dao都会使用到的通用接口<<Interface>>
BaseDaoImpl实现BaseDao的抽象类(用斜体表示抽象,用虚线空心箭头表示实现接口)
每一个实体类都会有一个Dao的实现类(用实现空心箭头表示继承一个类,用虚线三角箭头表示引用一个类)
BaseDao<T>
package com.atguigu.surveypark.dao;
import java.util.List;
/**
* BaseDao接口
*/
public interface BaseDao<T> {
//写操作
public void saveEntity(T t);
public void saveOrUpdateEntity(T t);
public void updateEntity(T t);
public void deleteEntity(T t);
public void batchEntityByHQL(String hql,Object...objects);
//读操作
public T loadEntity(Integer id);
public T getEntity(Integer id);
public List<T> findEntityByHQL(String hql,Object...objects);
}
BaseDaoImpl<T>
package com.atguigu.surveypark.dao.impl;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import com.atguigu.surveypark.dao.BaseDao;
/**
* 抽象的dao实现,专门用于继承
*/
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
//注入sessionFactory
@Resource
private SessionFactory sf ;
private Class<T> clazz ;
public BaseDaoImpl(){
//得到泛型话超类
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class<T>) type.getActualTypeArguments()[0];
}
public void saveEntity(T t) {
sf.getCurrentSession().save(t);
}
public void saveOrUpdateEntity(T t) {
sf.getCurrentSession().saveOrUpdate(t);
}
public void updateEntity(T t) {
sf.getCurrentSession().update(t);
}
public void deleteEntity(T t) {
sf.getCurrentSession().delete(t);
}
/**
* 按照HQL语句进行批量更新
*/
public void batchEntityByHQL(String hql, Object... objects) {
Query q = sf.getCurrentSession().createQuery(hql);
for(int i = 0 ; i < objects.length ; i ++){
q.setParameter(i, objects[i]);
}
q.executeUpdate();
}
public T loadEntity(Integer id) {
return (T) sf.getCurrentSession().load(clazz, id);
}
public T getEntity(Integer id) {
return (T) sf.getCurrentSession().get(clazz, id);
}
public List<T> findEntityByHQL(String hql, Object... objects) {
Query q = sf.getCurrentSession().createQuery(hql);
for(int i = 0 ; i < objects.length ; i ++){
q.setParameter(i, objects[i]);
}
return q.list();
}
}
第三步:Service设计与实现
分两种情况:一种是单体Service(只操作一个Dao),一种是多体Service(操作多个Dao)
不是每一个Dao都有一个对应的Service
BaseService<T>:定义基本的接口,这个接口是所有的Service通用的
package com.atguigu.surveypark.service;
import java.util.List;
/**
* 基本的dao接口
*/
public interface BaseService<T> {
//写操作
public void saveEntity(T t);
public void saveOrUpdateEntity(T t);
public void updateEntity(T t);
public void deleteEntity(T t);
public void batchEntityByHQL(String hql,Object...objects);
//读操作
public T loadEntity(Integer id);
public T getEntity(Integer id);
public List<T> findEntityByHQL(String hql,Object...objects);
}
BaseServiceImpl<T>:实现基本的接口
package com.atguigu.surveypark.service.impl;
import java.util.List;
import javax.annotation.Resource;
import com.atguigu.surveypark.dao.BaseDao;
import com.atguigu.surveypark.service.BaseService;
/**
* 抽象的baseService,专门用于继承
*/
public abstract class BaseServiceImpl<T> implements BaseService<T> {
private BaseDao<T> dao ;
//注入dao
@Resource
public void setDao(BaseDao<T> dao) {
this.dao = dao;
}
public void saveEntity(T t) {
dao.saveEntity(t);
}
public void saveOrUpdateEntity(T t) {
dao.saveOrUpdateEntity(t);
}
public void updateEntity(T t) {
dao.updateEntity(t);
}
public void deleteEntity(T t) {
dao.deleteEntity(t);
}
public void batchEntityByHQL(String hql, Object... objects) {
dao.batchEntityByHQL(hql, objects);
}
public T loadEntity(Integer id) {
return dao.loadEntity(id);
}
public T getEntity(Integer id) {
return dao.getEntity(id);
}
public List<T> findEntityByHQL(String hql, Object... objects) {
return dao.findEntityByHQL(hql, objects);
}
}
UserService:定义一个扩展接口,这个接口的方法特定义User这个实体类。这里实现BaseServcie这个接口是为了面向接口编程。
package com.atguigu.surveypark.service;
import com.atguigu.surveypark.model.User;
/**
* UserService
*/
public interface UserService extends BaseService<User> {
}
一个简单的示例:可以将UserServiceImpl类注入到BaseServcie这个接口,这样就可以调用BaseServcie的基本方法和扩展方法了
注意:需要覆盖父类的public void setDao(BaseDao<User> dao) {这个方法,因为@Resource先匹配名字再匹配类型,类型已经被BaseServiceImpl使用了一次,多个类使用同一个类型所以是不行的,覆盖这个方法然后使用特定的名字的类的dao进行注入
package com.atguigu.surveypark.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.atguigu.surveypark.dao.BaseDao;
import com.atguigu.surveypark.model.User;
import com.atguigu.surveypark.service.UserService;
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements
UserService {
@Resource(name="userDao")
public void setDao(BaseDao<User> dao) {
super.setDao(dao);
}
}
第四步:action的设计与实现
BaseAction<T>
package com.atguigu.surveypark.struts2.action;
import java.lang.reflect.ParameterizedType;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
/**
* 抽象action,专门用于继承
*/
public abstract class BaseAction<T> extends ActionSupport implements
ModelDriven<T>, Preparable {
private static final long serialVersionUID = 9180917383072055589L;
public T model ;
public BaseAction(){
try {
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
Class clazz = (Class) type.getActualTypeArguments()[0];
model = (T) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public void prepare() throws Exception {
}
public T getModel(){
return model ;
}
}
一个简单的例子
package com.atguigu.surveypark.struts2.action;
import javax.annotation.Resource;
import org.apache.struts2.interceptor.validation.SkipValidation;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.atguigu.surveypark.model.User;
import com.atguigu.surveypark.service.UserService;
import com.atguigu.surveypark.util.DataUtil;
import com.atguigu.surveypark.util.ValidateUtil;
/**
* 注册action
*/
@Controller
@Scope("prototype")
public class RegAction extends BaseAction<User> {
private static final long serialVersionUID = 7351588309970506225L;
private String confirmPassword ;
//注入userService
@Resource
private UserService userService ;
public String getConfirmPassword() {
return confirmPassword;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
/**
* 到达注册页面
*/
@SkipValidation
public String toRegPage(){
return "regPage" ;
}
/**
* 进行用户注册
*/
public String doReg(){
//密码加密
model.setPassword(DataUtil.md5(model.getPassword()));
userService.saveEntity(model);
return SUCCESS ;
}
/**
* 校验
*/
public void validate() {
//1.非空
if(!ValidateUtil.isValid(model.getEmail())){
addFieldError("email", "email是必填项!");
}
if(!ValidateUtil.isValid(model.getPassword())){
addFieldError("password", "password是必填项!");
}
if(!ValidateUtil.isValid(model.getNickName())){
addFieldError("nickName", "nickName是必填项!");
}
if(hasErrors()){
return ;
}
//2.密码一致性
if(!model.getPassword().equals(confirmPassword)){
addFieldError("password", "密码不一致!");
return ;
}
//3.email占用
if(userService.isRegisted(model.getEmail())){
addFieldError("email", "email已占用!");
}
}
}
分享到:
相关推荐
基于ssh三层架构的JAVA开发简单示例,包含service,dao,action,pojo
ssh分页注释加说明借鉴整理的 ssh分页(.dao,.daoImp,.service,.serviceImp,.action,.jsp,applicationContext.xml
通用SSH2结构的增删查改标准代码, ...servce实现,dao实现为通用 -----使用说明--- action 调用通用service,service调用通用dao 调用关系用spring 配址文件设置 因为上传限制问题,把lib目录下的jar文件都删掉了
推荐个自动生成JAVA MVC多层代码的工具(dao,service,controller)(dao,service,controller) hibernate的hbm.xml ibatis的mapper.xml jsp文件都可以生成
ssh分页实现,采用依赖注入的方式,分dao,service,action 层实现
该文档是SSH框架为基础实现的BBS论坛。其中有整合好的全面的SSH jar包,BBS前台,后台源码,这个小系统的报告,数据库关系分析等。 以下内容摘自报告目录部分(希望大家极力推荐哦): 第三章 SSH框架搭建 第四章 ...
后台与mysql数据库进行连接,dao-service-action都是一一对应,便于理解。此后台管理系统,一共有三个表,用户注册表,部门表以及员工表。主要功能有用户的登录与注册,部门的增查,员工的增删改查。还采用了session...
基于ssh2实现的分页查询,从bean到dao以及service、action,页面。只要复制上去,简单配置一下。就可以实现分页的功能,值得收藏!
使用SSH框架实现增删改查功能,程序严格分为action,service,dao,bean四个部分,并且采用了接口。这个框架可以很好的学习IOC和AOP的原理。
基于SSH的网络书城设计报告,包括数据库、dao层、service层、Action层、jsp页面简介
jsp传参数给action action调用service service调用dao 他们相互调用的时候传递的参数就是modelStruts负责前台与后台之间数
基础dao,service,action操作的封装;struts2通配符;div布局框架;log4j;ssh流程。 留意: target="_self">改成target="MainBody">便可以真正使用div布局。 本资源是在“ssh框架搭建实例源码3”基础上添加struts2...
该文档是SSH框架为基础实现的BBS论坛。其中有整合好的全面的SSH jar包,BBS前台,后台源码,这个小系统的报告,数据库关系分析等。 以下内容摘自报告目录部分(希望大家极力推荐哦): 第三章 SSH框架搭建 第四章 ...
在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和Service,Service和DAO之间低耦合调用。利用AoP机制实现事务管理、以及共通功能的切入等。 功能是整合,好处是解耦。
1. 公共类搭建 1.1 po对象及其映射 1.2util包工具类 ...3.7.编辑applicationContext.xml, dao注入sessionFactory,service注入dao,action注入service。实现Spring IoC配置 4 各模块具体实现 4.1 登录模块
实现对基础的dao,service,action操作的提取封装;使命名更规范。本资源所需的jar包请到“ssh框架搭建实例源码2”和“ssh框架搭建实例源码”中下载: http://download.csdn.net/detail/linchengzhi/4100204 ...
4.4 Service层(业务逻辑层)的实现 27 4.5 Web层的实现 28 4.6本章总结 28 第五章 智能答疑搜索子系统 29 5.1全文搜索技术的引入 29 5.2 全文搜索技术Lucene介绍 29 5.3 全文索引技术的倒排序原理 30 5.4 全文搜索...
本资源是一个最简单的一个ssh框架实例,包含完整的代码(dao层有annotation和xml两种实现方式修改applicationContext.xml和hibernate.cfg.xml相应位置就可以切换),数据库ssh.sql文件,和所有的jar包,运行于eclips...
SSH工程集成之struts2&hibernate;的helloworld部分,工程集成了ssh整个工程的dao和service部分
对新手的设计顺序建议: ...将Dao接口注解注入service接口实现类,接口实现类调用Dao接口,将action所要的操作,传递给Dao接口。 7、将Dao接口实现类继承框架提供的HibernateSupport,调父类的相关操作,来操作数据库。