SSHE开发手册

来源:互联网 发布:淘宝分享到微信怎么弄 编辑:程序博客网 时间:2024/06/05 13:00
项目的整体整合框架为SSHE(stucts+spring+hibernate+easyui),开发期间不需要对各框架有深入的研究,只需清楚各框架在该项目中的基础作用,可查询wiki。
本项目中利用Maven进行项目管理,其负责管理需要融合的Jar包,例如数据驱动等等,pom.xml中进行定义,代码如下:
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>

需要加入特定功能的Jar包,可去 http://search.maven.org/ 进行搜索。例如加入hibernate-core的Jar,搜索后结果如下:


这时即可选取自己需要的组件的pom定义,然后将pom片段加入项目的pom.xml。Maven管理的Jar会自动下载,如果出现问题可将用户目录下的repository删除进行重新下载。

项目还需要对其他文件进行配置,如图:


但是在开发过程中,我们只需关注config.properties中的

hibernate.dialect=org.hibernate.dialect.MySQLDialect
driverClassName=com.mysql.jdbc.Driver
validationQuery=SELECT 1
jdbc_url=jdbc\:mysql\://localhost\:3306/sy?useUnicode\=true&characterEncoding\=UTF-8
jdbc_username=root
jdbc_password=root

下一阶段,我们可以开始项目的编码工作。


整个项目的支撑程序被放在 src/main/java,前台呈现程序放在 src/main/webapp.

支撑程序的包被定义如下:


其中,我们应把重点集中在action、dao、model、pageModel、service包。

model是数据库表的实体映射集,换言之,model可通过Hibernate进行数据库中对象的持久化工作。如何将一个表利用Hibernate生成实体类的过程网上有很多相关资料,这里不再赘述。http://www.2cto.com/kf/201301/180948.html给出了一个例子,可参考。

=========================================================

Hibernate帮助我们实现了数据的持久化工作之后,我们的工作重心在哪里呢?简单来讲,应是处理数据访问、业务逻辑和页面逻辑。项目中便将各项工作分层,由dao、service和action分别完成。

以用户登录操作举个简单的例子:

1、UserAction负责安排对应的登录界面,即下面代码中的/admin/user.jsp,登录函数为public void login()。

@Action(value = "userAction", results = { @Result(name = "user", location = "/admin/user.jsp"), @Result(name = "showUserInfo", location = "/user/userInfo.jsp") })
public class UserAction extends BaseAction implements ModelDriven<User> {
private static final Logger logger = Logger.getLogger(UserAction.class);
private User user = new User();
private UserServiceI userService;
public UserServiceI getUserService() {
return userService;
}
@Autowired
public void setUserService(UserServiceI userService) {
this.userService = userService;
}
public User getModel() {
return user;
}
/**
* 用户登录
*/
public void login() {
Json j = new Json();
User u = userService.login(user);
if (u != null) {
SessionInfo sessionInfo = saveSessionInfo(u);
j.setSuccess(true);
j.setMsg("用户登录成功!");
j.setObj(sessionInfo);
changeUserAuths(u);
} else {
j.setMsg("用户名或密码错误!");
}
writeJson(j);
}

你会发现具体的登录过程被封装在userService.login()中,这时我们转至其具体实现。

2、Service由接口和实现构成,具体到User相关的Service为UserServiceI.javaUserServiceImpl.java。UserServiceI中定义的接口为:

public interface UserServiceI extends BaseServiceI {
/**
* 用户登录
*
* @param user
* @return
*/
public User login(User user);

UserServiceImpl的具体实现为:

@Service("userService")
public class UserServiceImpl extends BaseServiceImpl implements UserServiceI {
private BaseDaoI<Tuser> userDao;
private BaseDaoI<Trole> roleDao;
private BaseDaoI<Tusertrole> userroleDao;
public BaseDaoI<Trole> getRoleDao() {
return roleDao;
}
@Autowired
public void setRoleDao(BaseDaoI<Trole> roleDao) {
this.roleDao = roleDao;
}
public BaseDaoI<Tusertrole> getUserroleDao() {
return userroleDao;
}
@Autowired
public void setUserroleDao(BaseDaoI<Tusertrole> userroleDao) {
this.userroleDao = userroleDao;
}
public BaseDaoI<Tuser> getUserDao() {
return userDao;
}
@Autowired
public void setUserDao(BaseDaoI<Tuser> userDao) {
this.userDao = userDao;
}
/**
* 用户登录
*/
@Transactional(propagation = Propagation.SUPPORTS)
public User login(User user) {
Tuser u = userDao.get("from Tuser t where t.cname=? and t.cpwd=?", new Object[] { user.getCname(), Encrypt.e(user.getCpwd()) });
if (u != null) {
User t = new User();
BeanUtils.copyProperties(u, t);
return t;
}
return null;
}
其中,userDao.get完成了对model中User类的访问。显然,具体的数据操作是由userDao完成的。类似Service的实现方法,dao操作也是接口和实现构成。这里要注意的是,数据操作的行为是固定的,规律性较强,所有的dao操作由一个接口文件和实现文件即可。当然,你愿意写成多个也是可以的。

3、dao包含BaseDaoI.java和BaseDaoImpl.java。这里不再贴代码了,具体可去项目中查看。

注意:dao的操作我们不需要进行关注,我们只需要完成Service和Action的相关工作。

另外需要强调的是,model和pageModel的关系。pageModel完全是为了前台页面呈现方便,对model的扩展和补充。

以pageModel中的User为例,其中有很多自定义的属性:

// 自己添加的属性
private Date ccreatedatetimeStart;
private Date cmodifydatetimeStart;
private Date ccreatedatetimeEnd;
private Date cmodifydatetimeEnd;
private String ids;
private String oldPwd;
private String roleIds;
private String roleNames;
private String q;// 补全登录时用到的属性
private int page;// 当前页
private int rows;// 每页显示记录数
private String sort;// 排序字段名
private String order;// 按什么排序(asc,desc)
private String cgroupid;
这些属性的目的就是方便前台的展示。

注意:我们操作的对象是pageModel中User,而不是model中的Tuser。Tuser只用于数据访问操作。

如果上面的开发流程清楚的话,你会产生疑问,EasyUI咋不出力呢,难道打酱油了?

其实呢,你在前台呈现时,不使用EasyUI仍然可以对数据进行呈现,使用它的目的是更快捷、更美观、更规范地进行前端的开发。关于EasyUI的相关资料可访问官网:www.jeasyui.com/

EasyUI在开发过程中需要注意的是,前后台数据传递的问题。具体来讲,后台如何生成json并传递给前台页面进行呈现。这里用到了com.alibaba的fastjson,体现在用户登录的代码如下:

public void login() {
Json j = new Json();
User u = userService.login(user);
if (u != null) {
SessionInfo sessionInfo = saveSessionInfo(u);
j.setSuccess(true);
j.setMsg("用户登录成功!");
j.setObj(sessionInfo);
changeUserAuths(u);
} else {
j.setMsg("用户名或密码错误!");
}
writeJson(j);
}
其中,Json类在pageModel包中定义

public class Json implements java.io.Serializable {
private boolean success = false;// 是否成功
private String msg = "";// 提示信息
private Object obj = null;// 其他信息
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
把实例化的对象放到json由setObj完成j.setObj(sessionInfo);

推送过程有writeJson完成,具体的代码在BaseAction中:

/**
* 将对象转换成JSON字符串,并响应回前台
*
* @param object
* @throws IOException
*/
public void writeJson(Object object) {
try {
// SerializeConfig serializeConfig = new SerializeConfig();
// serializeConfig.setAsmEnable(false);
// String json = JSON.toJSONString(object);
// String json = JSON.toJSONString(object, serializeConfig, SerializerFeature.PrettyFormat);
String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");
// String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss", SerializerFeature.PrettyFormat);
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
ServletActionContext.getResponse().getWriter().write(json);
ServletActionContext.getResponse().getWriter().flush();
} catch (IOException e) {
logger.debug(ExceptionUtil.getExceptionMessage(e));
}
}
推送至前台后user.jsp就可以对json的数据进行处理,按照你的意愿对使用者进行展现。

如果不熟悉EasyUI,可以多看看其官网的demo

http://www.jeasyui.com/demo/main/index.php


祝各位开发顺利!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拉人进群频繁了怎么办 qq群邀请过于频繁怎么办 qq一直被拉进群怎么办 qq号被冻结解封不了怎么办 2018qq自动进群怎么办 手机视频传到电脑倒着怎么办 qq群图片过期了怎么办 q号加不了群怎么办 q号加不了好友怎么办 q号被冻结了怎么办 qq群200人满了怎么办 畅聊之火消失了怎么办 手机版WPS打开文档空白怎么办 空白表格怎么打印不出来怎么办 微信朋友太少怎么办 js和CSS加载失败怎么办 熹妃q传密码忘了怎么办 苹果手机淘宝占用空间大怎么办 苹果相册储存空间不足怎么办 企业网银里的收款名单丢失怎么办 发邮件发错了怎么办 qq群成员满500了怎么办 为什么qq群查不到信息怎么办 tiger杯子油漆划掉了怎么办 手被油漆弄到了怎么办 被油漆弄到衣服怎么办 QQ发表情成问号怎么办 qq登不了微信怎么办 qq不能登录微信怎么办 qq号一年没用了怎么办 微信里别人可以看到我手机号怎么办 用手机号注册的微信换号后怎么办 微信群推送名片很多人加怎么办 志高制冷显示ff怎么办 百度账号手机号换了怎么办 别人盗取手机号的通讯录该怎么办 58简历看不到真实号码怎么办 淘宝更换手机号码说已注册怎么办 系统把qq冻结了怎么办 qq被永久冻结好友怎么办 群发不小心发错怎么办