学员会诊之02:SVN协作以及Page类的设计
三层架构的学生管理系统是我们第一个稍微大型的项目:分层、一个解决方案多个Project,所以值得我们停下来好好审查审查。
1.测试SVN服务器地址
我们的作业要求学员创建自己的SVN服务器,并且将代码commit上去,然后讲师进行批改是从源码服务器上获取代码,继而review。这非常类似于敏捷开发中的同行审查。在企业中,我们一般也是这样做代码审查的。
既然要审查代码,那么第一件事情就是要把代码从学生的服务器上check out下来,所以我第一步就是找学生要刘同学的SVN服务器地址以及用户名、密码,这次我们审核的是另一位刘同学,如下:


上面图示中,我打了一个叉叉和一个对勾。叉叉的地方是刘同学自己去SVN中copy地址出来的,然后我们要转换成自己在局域网中的地址才行。
怎么查自己的本机地址?记得回去敲cmd命令:ipconfig。如果你发现没有此命令,记得要以管理员身份运行cmd。
紧接着,拿到刘同学的地址,首先测试下是否已经联通,于是打开浏览器,敲入地址,如下:


在这次连接中,我们发现刘同学在服务器配置SVN的时候,使用的是https的协议,所以要点击上图中的“高级”(PS:不同的浏览器设置形式不一样)。
然后点击下图中的继续前往


出意外,会弹出用户名和密码框。这个用户名和密码是刘同学在SVN服务器上专门为我设置的。


如果看到下图,说明已经成功。


2.获取单个项目源码
接下来,让我们在eclipse中check out代码。
首先,点击import


选择 Project from SVN


点击creat a new respository location


输入地址。记住,这一步同时要输入用户名和密码,然后,记得勾选Save authentication。


点击finish


接下来会问你是否信任连接,直接“Trust Always”,然后下一个页面选择Java Project


在接下来的这个页面,我们要select resource,如下。注意,我们刚才获取到的地址是:https://192.168.1.125:9443/svn/zuikc/。但是这里有个问题,因为我们发现我们的项目是在这个地址的子文件中,所以,我们要输入全路径,如下,


下一步,默认finish


然后,弹出这个界面,选择Java Project


Next之后,让我们输入project name,如下


点击finish,这次是真的finish了。


3.获取全部项目源码
在这个作业中,我要求大家将项目分成多个project。上面只是获取最底层的bean。紧接着我们按照从下到上的次序依次获取项目。
先common。Common下来后,你大概会看到一些错误


为什么呐?
第一个原因,因为我们在common中用到了jdbc,所以,如果我们创建lib文件夹,将jdbc包引入进来,就会出现找不到包的情况;
第二个原因,即便引入,如果没有正确导入到build path中,也会出现错误。那怎么修复?如下:


接着导入dao,同样,有可能碰到这样的问题


重新引入jar包、common和bean吧,
接下来的几个项目也类似哦。全部完毕后,是这样的:


4.问题分析之Page类的设计
刘同学的代码完成度很高。不过还有一个小小的不完美的地方。我们可以看到在分页这个部分,刘同学有意识的创建了一个Page类,现在来看看Page类长什么样:
package com.zuikc.usermanagement.dao;
public class Page {
//设置每页行数
public static final int PAGE_SIZE = ;
//起始行号
private int startRow;
//总行数
private int rows;
//总页数
private int pages;
//当前页号
private int currentPage;
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
}
方向是对的,这里确实得有一个Page类。
但是放错了地方:


Page类它不应该是dao层的东西,而是一个特殊的bean。
为什么说它特殊呢,接下来就要引入第二个问题了。Page类中缺少了东西。最重要的一个东西就是要包装的类型的列表属性,比如:List<User>。
为什么要这个包装属性呢?我们可以看一下刘同学的service:


在刘同学的UserService的分页查询函数中,直接返回的是List<User>。但是,我们在上层调用的时候,除了获取当前页的信息之后,一般还需要获取:当前是第几页、每页显示多少条、总共多少页这样的信息。你可能会说:简单啊,上层针对这些属性多调用几个这样的service方法不就行了?
行是行。但是上层在设计上只是负责显示的,我们应该让这些逻辑上的工作放置到service层中,也就是说:在调用queryUsersByPage的时候,应该将这些属性一次性返回!那怎么返回,要知道方法只能有一个返回值。没办法了,我们只能把这些属性,连同List<User>封装到一个类里,比如Page里返回。
于是,Page类变成了:


变化有:
1:Page跑到了bean;
2:Page增加了Users属性;
紧接着问题又来了,那以后要是对老师分页呢?难道增加一个teachers的属性?
显然不行!
有没有更好的办法?当然有,就是泛型。我们将属性改为如下:


至此,我们的Page才成为了一个通用的Page类。
然后Service层修改为:


接下来,自己去修改整个page实现吧。
5.其它小问题
连接没有及时关闭:


SQL注入漏洞:


6.提交批改


7.学生查看批改
当然是update源码到本地了。
你也可以在history里面看看我提交了批改没有,查看下吧:


华丽分割线
===========================================================
最课程JavaEE+互联网分布式新技术开班进行中,来http://www.zuikc.com看看吧。你想参加不一样的培训班,并且一毕业就NB,那就来加入我们吧;
更多技术文章和开班信息请加入,
QQ群:


学员会诊之02:SVN协作以及Page类的设计的更多相关文章
- KSFramework常见问题:Excel如何进行SVN协作、差异比较?
Excel如何进行SVN协作.差异比较? 嗯,这是一个令人困惑的问题.游戏开发.程序开发时,使用Excel可以添加文档.注释.图标.批注等等各种辅助信息: 但是Excel是非纯文本格式,在使用SVN. ...
- 【ASP.NET 基础】Page类和回调技术
Page 类有一个 IsPostBack 属性,这个属性用来指示当前页面是第一次加载还是响应了页面上某个控件的服务器事件导致回发而加载. 1.asp.net页面的声明周期 asp.net页面运行的时候 ...
- 非Page类使用session(Httpcontext.session和page.session区别)
ASP.NET中Session高级使用技巧 在开发Aspx .NET软件时,有时需要把常用的东西封装到一个非PAGE类中,文章介绍在非Page类中使用Session的方法. 一.PAGE参数法: 1. ...
- org.springside.modules.orm中的page类自我解读
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...
- 分页复用代码【Page类、JSP显示页面】
前言 为了复用,记载一些以前写过的工具类.方法 page类 import java.util.List; /** * Created by ozc on 2017/3/1. */ public cla ...
- 一个用于分页的page类
今天周一,趁工作轻松,自己就写了一个基于MySQl数据库的分页查询,做分页,最主要的是以下几点: 一:写sql语句:比如查询某张数据表的数据,sql语句为:select * from table li ...
- 思路 一般创建展示类时候 例如page类 会在网页上新增多个对应字段的隐藏域 用于存储值
思路 一般创建展示类时候 例如page类 会在网页上新增多个对应字段的隐藏域 用于存储值
- 四:理解Page类的运行机制(例:基于PageStatePersister的页面状态存取)
有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我 ...
- 三:理解Page类的运行机制(例:在render方法中生成静态文件)
我这里只写几个常用的事件1.OnPreInit:此事件后将加载个性化信息和主题2.OnInit:初始化页面中服务器控件的默认值但控件的状态没有加载,没有创建控件树3.OnPreLoad:控件完成状态和 ...
随机推荐
- winform(记事本--保存和退出)
- myeclipse2017 安装包及破解插件的下载
一:安装包下载 链接:http://pan.baidu.com/s/1miIFqha 密码:nz7h 二:操作步骤 因为工作中需要有多个MyEclipse去管理不同的项目组的工作,恰逢MyEclips ...
- hdu2476
/* dp[l][r]表示将任意串的[l,r]刷成s2样子的最小代价 ans[i]表示将s1的前i位刷成s2的代价 按照区间dp的常用做法,dp[l][r]的状态由dp[l][k],dp[k+1][r ...
- poj2018 二分+线性dp好题
/* 遇到求最值,且答案显然具有单调性,即可用二分答案进行判定 那么本题要求最大的平均数,就可以转换成是否存在一个平均数为mid的段 */ #include<iostream> #incl ...
- Splay-Tree总结一:模拟队列
伸展树是一种强大的数据结构,由于其特性,可以很好地模拟队列的插队等操作,而线段树解决这类问题通常需要转化一下,比较伤脑筋 而用伸展树的解决方法就是先建好一颗节点数等于队列长度的树,每个队列元素在队列中 ...
- python作业(day1)
1.输入用户名密码 ,认证成功后显示欢迎信息 ,输错三次后锁定 ,锁定后再次登录时直接提示已锁定 2.多级菜单 三级菜单 可依次进入各子菜单 所需新知识点:列表.字典
- SqlServer基础语法(三)
1.数据库备份的方法: 完整数据库备份GPOSDB 文件大小:23MB 日志备份 GPOSDB日志备份文件大小:211KB --完整备份 Backup DATABASE GPOSDB To disk= ...
- Redis设置Key/value的规则定义和注意事项(附工具类)
对于redis的存储key/value键值对,经过多次踩坑之后,我们总结了一套规则:这篇文章主要讲解定义key/value键值对时的定义规则和注意事项. 前面一篇文章讲了如何定义Redis的客户端和D ...
- H 模拟水题
n个人 小明编号为m 从编号为a的人开始数 起始数字为b 遇到素数duang 并反相 求小明应该说什么 Sample Input 310 2 //n m3 4 //a b3 32 64 13 8 Sa ...
- asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4
微信app支付需要以下参数,类封装如下 public class WxPayModel { /// <summary> /// 应用ID /// </summary> publ ...