github发布开源项目代码教程

最后更新于:2022-04-01 19:53:12

先介绍一下github,github是一个为程序开发者提供项目代码保存的一个平台,程序开发人员可以将代码发布在上面,可以为共享的,即开源的项目,或者私有的。 先去github上面注册一个账号:[https://github.com](https://github.com/) 然后安卓Git客户端,这里推荐msysgit,详细安装过程可以参考我的博客: [http://blog.csdn.net/u014427391/article/details/50624004](http://blog.csdn.net/u014427391/article/details/50624004) 我们登录成功后,选择绿色按钮New repository ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa836d5c93.jpg) 然后输入项目名称lexer1.1.0,图片是我复制的,名称是lexer1.1.0,不是Test哈!^V^ ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa83702f9a.jpg) 创建成功了,接着我们就要使用安装好的Git客户端了 Git客户端使用方法: (1)点击桌面上的Git工具快捷方式,输入git clone [https://github.com/](https://github.com/)你的github用户名/上传项目名称.git(如lexer1.1.0.git) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8372cf95.jpg) (2)进入那个你要上传代码的文件夹,将代码复制到里面,创建成功的文件夹里自动生成LICENSE这些文件,当然你的git要用用命令进入自动创建的文件夹 我的是cd lexer1.1.0,这个名称是github的项目名称,刚才用git clone的时候会自动创建这个文件夹在你的本地电脑里,一般默认是在C:\Users\Administrator里面的 ,然后你就要输入cd lexer1.1.0进入文件,这个是我的项目名称,要根据你们的项目名称来说的 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa837439d8.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8376cb9d.jpg) (3)输入git add . 注意要加一个空格,然后再.符号的哦 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa83783db8.jpg) (4)输入git  commit -m "changes log" ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa83791088.jpg) (5)输入git push -u origin master ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa837be0c2.jpg) (6)进入你的github,这时你会发现,项目代码提交上去了,哈哈哈!^V^ ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa837d00f6.jpg)
';

window系统安装msysgit(Git客户端软件)教程

最后更新于:2022-04-01 19:53:10

Git是一种很常用的版本控制系统,当然还有SVN,不过本文只简述msysgit的安装过程 msysgit是目前最为广泛及实用的工具之一,下载的话可以去官网下载或者直接百度输入“Git下载”就可以,下面提供链 接[http://rj.baidu.com/soft/detail/30195.html?ald](http://rj.baidu.com/soft/detail/30195.html?ald) 注意勾选上Window Explorer integration的Git Bash Here、Git GUI Here 然后上面的on the Desktop意思是是否创建桌面快捷方式 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa83579981.jpg) 然后其他的都是默认就好 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8358fd75.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa835a25ba.jpg) 然后,这里是选择操作系统,我们选择第一个默认的Window ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa836b5c5c.jpg) 然后我们软件就装好了 我提供一个很不错的学习网站链接:[http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) 有了客户端软件,我们去github官网注册一个账号,就可以就我们的代码保存在上面了,或者我们想开源给别人学习也是可以的!^V^
';

SSH项目开发里用maven的好处

最后更新于:2022-04-01 19:53:08

maven是一个很好用的构建工具。 推荐maven学习的书籍: 《Maven实战》(国内首本Maven著作)(Maven的安装、配置及使用入门) 在SSH开发里使用maven继续构建的好处是,我列举几个: maven是跨平台的,所以可以提高这个项目的跨平台性 Maven最大化的消除了构建的重复 Maven可以帮助我们标准化构建过程,有了maven来构建项目,会使我们构建项目变得轻松简便! 然后分享maven搭建过程的博客  [http://www.open-open.com/home/space.php?uid=135360&do=blog&id=9698](http://www.open-open.com/home/space.php?uid=135360&do=blog&id=9698),希望可以帮到学习的人
';

搭建SSH三大框架WEB项目过程(Struts2.3+Hibernate4.3+Spring4.1)

最后更新于:2022-04-01 19:53:06

我以我做的一个例子来说明框架的搭建过程 ^V^! 项目结构如图: action:存放Action类,也就是控制类 dao:DAO数据库操作 po:POJO类,也就是持久化类 service:存放Service类 dao类在Service类里调用,然后Service类再到action类里调用 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa834c0784.jpg) 搭建过程 我们先要准备jar价包,这个可以去官网下载 下面是我准备的开发jar价包 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa834d51cb.jpg) 然后我为了提高安全性,我将所有的JSP页面放在了WEB-INF下面 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8350ece9.jpg) 然后配置SSH的配置文件 Spring的配置文件代码: ~~~ ~~~ Hibernate的配置文件代码: ~~~ /WEB-INF/page/admin/index.jsp /WEB-INF/page/admin/login.jsp /WEB-INF/page/admin/index.jsp /WEB-INF/page/admin/login.jsp /WEB-INF/page/admin/student/studentInfoManager.jsp /WEB-INF/page/admin/student/studentInfoDetail.jsp /WEB-INF/page/admin/student/studentLearnScores.jsp /WEB-INF/page/admin/student/studentMatchScores.jsp /WEB-INF/page/admin/teacher/teacherInfoManager.jsp /WEB-INF/page/admin/teacher/teacherTeaching.jsp /WEB-INF/page/admin/teacher/teacherMatchGuide.jsp /WEB-INF/page/admin/teacher/teacherCourseStusInfo.jsp /WEB-INF/page/admin/teacher/teacherMatchStusInfo.jsp /WEB-INF/page/admin/course/courseManager.jsp /WEB-INF/page/admin/course/courseTeachersInfo.jsp /WEB-INF/page/admin/match/matchInfoManager.jsp /WEB-INF/page/admin/match/matchStudentsInfo.jsp ~~~ 前面那些配置文件有包含其它的,这个要根据自己的项目需要去改的^V^ 下面以学生信息管理的实现过程进行说明,只说明这个例子哈! 创建POJO实体类: ~~~ import java.util.Date; import java.util.HashSet; import java.util.Set; /** * * 学生信息的实体类 * @author Nicky * */ public class Student { /* * 学号 */ private String stuID; /* * 班级 */ private String stuName; /* * 性别 */ private String stuSex; /* * 出生年日 */ private Date stuBirth; /* * 电话 */ private String stuTel; /* * 邮箱 */ private String stuEmail; /* * 专业 */ private String dept; /* * 身份证 */ private String stuIDCard; /* * 班级 */ private String className; /* * 登录密码 */ private String password; /* * 是否是管理员的标志 1表示是,0表示不是 */ private String isManager; public String getStuID() { return stuID; } public void setStuID(String stuID) { this.stuID = stuID; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuSex() { return stuSex; } public void setStuSex(String stuSex) { this.stuSex = stuSex; } public Date getStuBirth() { return stuBirth; } public void setStuBirth(Date stuBirth) { this.stuBirth = stuBirth; } public String getStuTel() { return stuTel; } public void setStuTel(String stuTel) { this.stuTel = stuTel; } public String getStuEmail() { return stuEmail; } public void setStuEmail(String stuEmail) { this.stuEmail = stuEmail; } public String getDept() { return dept; } public void setDept(String dept) { this.dept = dept; } public String getStuIDCard() { return stuIDCard; } public void setStuIDCard(String stuIDCard) { this.stuIDCard = stuIDCard; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getIsManager() { return isManager; } public void setIsManager(String isManager) { this.isManager = isManager; } } ~~~ 配置Student.hbm.xml文件 ~~~ ~~~ DAO实现 ~~~ import java.util.List; import com.sgdata.po.Student; public interface StudentDao { /** * 获取所有学生信息 * @return */ public List getAllStudentInfo(); } ~~~ ~~~ public class StudentDaoImpl extends HibernateDaoSupport implements StudentDao { @Resource HibernateTemplate ht; /** * 获取所有信息 */ public List getAllStudentInfo() { String sql = "from Student"; List students = (List) ht.find(sql); return students; } } ~~~ Service实现: ~~~ import java.util.List; import com.sgdata.po.Student; public interface StudentService { /** * 获取所有学生信息 * @return */ public List getAllStudentInfo(); } ~~~ ~~~ import java.util.List; import javax.annotation.Resource; import org.springframework.transaction.annotation.Transactional; import com.sgdata.dao.StudentDao; import com.sgdata.po.Student; import com.sgdata.service.StudentService; @Transactional(readOnly=false) public class StudentServiceBean implements StudentService { @Resource private StudentDao studentDao; public List getAllStudentInfo() { return studentDao.getAllStudentInfo(); } } ~~~ Action实现: ~~~ /** * 实现学生信息管理的Action类 * */ public class StudentInfoManagerAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; @Resource private StudentService studentService; //页数 int pagenum = 0; //学号 private String stuID; //姓名 private String stuName; //性别 private String stuSex; //出生年月 private String stuBirth; //电话 private String stuTel; //邮箱 private String stuEmial; //系部 private String dept; //身份证 private String stuIDCard; //班级 private String className; //密码 private String password; /** * 学生对象来储存学生信息 */ private Student student; /** * 学生信息的列表 */ private List studentsInfo; /** * 学生学习成绩的信息列表 */ private List learnScores; /** * 学生比赛成绩的信息列表 */ private List matchScores; public StudentInfoManagerAction(){ //student = new Student(); } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public void setStudentsInfo(List studentsInfo){ this.studentsInfo = studentsInfo; } public List getStudentsInfo() { return studentsInfo; } public List getLearnScores() { return learnScores; } public void setLearnScores(List learnScores) { this.learnScores = learnScores; } public List getMatchScores() { return matchScores; } public void setMatchScores(List matchScores) { this.matchScores = matchScores; } public int getPagenum() { return pagenum; } public void setPagenum(int pagenum) { this.pagenum = pagenum; } public String getStuID() { return stuID; } public void setStuID(String stuID) { this.stuID = stuID; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuSex() { return stuSex; } public void setStuSex(String stuSex) { this.stuSex = stuSex; } public String getStuBirth() { return stuBirth; } public void setStuBirth(String stuBirth) { this.stuBirth = stuBirth; } public String getStuTel() { return stuTel; } public void setStuTel(String stuTel) { this.stuTel = stuTel; } public String getStuEmial() { return stuEmial; } public void setStuEmial(String stuEmial) { this.stuEmial = stuEmial; } public String getDept() { return dept; } public void setDept(String dept) { this.dept = dept; } public String getStuIDCard() { return stuIDCard; } public void setStuIDCard(String stuIDCard) { this.stuIDCard = stuIDCard; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } /** * 获取学生的基本信息 * @return * @throws Exception */ //@Override public String getAllInfo() throws Exception { studentsInfo = studentService.getAllStudentInfo(); return SUCCESS; } } ~~~ 然后就可以在JSP页面引入 然后获取数据了 ~~~
学号 姓名 性别 班级 系部 出生年月 操作
详情 学习 比赛
~~~ 实现数据获取 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8352379b.jpg) 这是我结合Bootstrap和SSH做的,结合例子来说明实现过程,希望可以帮到学习的人,有疑惑请留言哈!^V^
';

SSH项目开发中,将jsp页面放在WEB-INF的原因解析

最后更新于:2022-04-01 19:53:03

在一些安全型要求比较高的项目开发中,我们经常看到jsp页面都被放在WEB-INF下面了。这是出于对安全性的考虑, 是为了代码的安全。这样实现起来虽然麻烦了点,而且页面跳转很不方便。但是整个项目的安全性就提高上去了!所 以还是建议在一些安全性要求比较高的项目里使用这种做法! 这是我写的一个例子,我就是将所有的JSP页面都放在WEB-INF下面,然后按照模块进行分配,course文件夹就是放和 课程信息管理相关的JSP页面。假如我们输入[https://localhost:8080/](https://localhost:8080/)项目名称/page/admin/index.jsp是不可以访 问的,将整个page文件夹都放在WebRoot下面当然可以。 ![](http://img.blog.csdn.net/20160201233107409?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 然后分享实现WEB-INF下面页面跳转的代码实现过程 假如我们点击下面图片那个开始按钮,跳到主界面 ![](http://img.blog.csdn.net/20160201233607104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 在Struts.xml文件里配置 ~~~ /WEB-INF/page/admin/index.jsp ~~~ 然后在链接里添加 ~~~ 开始 ~~~
';

Spring配置<bean>时加scope="prototype"的原因

最后更新于:2022-04-01 19:53:01

配置Spring时,加入scope=“prototype”的原因, < !-- scope默认采用的是单例模式,scope="prototype" 可以保证 当有请求的时候都创建一个Action对象,保证Struts的Action线程安全 --> 例子
';

Spring注解之事务管理

最后更新于:2022-04-01 19:52:59

注解是Spring框架里很常用的,本博文对Annotation的事务管理进行说明,目的是为编程学习者提供参考的博客。 @Transactional放在一个类前面时,只是对public类型的方法有用 若类中某些方法不需要事务管理时,通过@Transaction(propagation = Propagation.Not_SUPPORTED)注释说明事务管理对这个方法不适应 ~~~ @Transactional public class TestServiceBean implements TestService { private TestDao dao; public void setDao(TestDao dao) { this.dao = dao; } @Transactional(propagation = Propagation.NOT_SUPPORTED) public List getAll() { return null; } } ~~~ **事物传播行为介绍:**  @Transactional(propagation=Propagation.REQUIRED)  如果有事务, 那么加入事务, 没有的话新建一个(默认情况下) @Transactional(propagation=Propagation.NOT_SUPPORTED)  容器不为这个方法开启事务 @Transactional(propagation=Propagation.REQUIRES_NEW)  不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务 @Transactional(propagation=Propagation.MANDATORY)  必须在一个已有的事务中执行,否则抛出异常 @Transactional(propagation=Propagation.NEVER)  必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反) @Transactional(propagation=Propagation.SUPPORTS)  如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务. 事物超时设置: @Transactional(timeout=30) //默认是30秒 **@Transactional注解中常用参数说明**

参 数 名 称

功 能 描 述

readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

 续表)

参 数 名 称

功 能 描 述

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

指定多个异常类名称:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

该属性用于设置事务的传播行为,具体取值可参考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

';

设计模式入门

最后更新于:2022-04-01 19:52:56

        设计模式在软件开发过程很重要的。目的是方便代码重用。也是成为一名优秀的软件结构是一定要学习的知识。各种开发语言都有对应的设计模式,本文只讲Java开发的23种设计模式。 现在对其进行分类,学设计模式要掌握23种设计模式。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 推荐书籍 个人认为不错的书籍 《大话设计模式》《Head First设计模式》《设计模式:可复用面向对象软件的基础》  
';

AES加密算法

最后更新于:2022-04-01 19:52:54

AES加密算法是对称密钥加密中最流行的算法之一 这是我转自CSDN博客的详细解析: 一般的加密通常都是块加密,如果要加密超过块大小的数据,就需要涉及填充和链加密模式,文中提到的ECB和CBC等就是指链加密模式。这篇文档比较形象地介绍了AES加密算法中的一些模式转载过来。注意,还缺一种CTR的模式。 同时在文章的最后,贴出几对利用ECB  and CBC模式得标准算法得到的码流串。  对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB) **一. AES对称加密:** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8338cdcf.jpg)                                                       AES加密 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa833a969f.jpg)                          分组     **二.分组密码的填充**                                                    分组密码的填充   e.g.: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa833b9365.jpg)                                                          PKCS#5填充方式       **三.流密码:** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa833cd820.jpg) **四.分组密码加密中的四种模式:** **3.1 ECB模式** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa833df046.jpg) **优点:** 1.简单; 2.有利于并行计算; 3.误差不会被传送; **缺点:** 1.不能隐藏明文的模式; 2.可能对明文进行主动攻击; ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa83407f03.jpg)   **3.2 CBC模式:** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa834545e0.jpg) **优点:** 1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。 **缺点:** 1.不利于并行计算; 2.误差传递; 3.需要初始化向量IV **3.3 CFB模式:** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8346ca4a.jpg) **优点:** 1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据; **缺点:** 1.不利于并行计算; 2.误差传送:一个明文单元损坏影响多个单元; 3.唯一的IV;   **3.4 OFB模式:** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa8348bce7.jpg) **优点:** 1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据; **缺点:** 1.不利于并行计算; 2.对明文的主动攻击是可能的; 3.误差传送:一个明文单元损坏影响多个单元; 几个码流串,经过了某款芯片的硬件加解密单元的测试   ECB        1 Key 0x2b7e151628aed2a6abf7158809cf4f3c Before encrypt 0x6bc1bee22e409f96e93d7e117393172a After encrypt 0x3ad77bb40d7a3660a89ecaf32466ef97        2 Key 0x6bc1bee22e409f96e93d7e117393172a Before encrypt 0xEA24274E EA6C2A7D F78E3345 467F171D After encrypt 0x6bc1bee22e409f96e93d7e117393172a   CBC Key 0x2b7e151628aed2a6abf7158809cf4f3c IV   0x000102030405060708090a0b0c0d0e0f Before encrypt 0x6bc1bee22e409f96e93d7e117393172a After encrypt 0x7649abac8119b246cee98e9b12e9197d 然后,这个是网上找到的算法代码例子: ~~~ package com.login.aes; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; /**  * Created with IntelliJ IDEA  * To change this template use File | Settings | File Templates.  */ public class AESEncryptor {     /**      * AES加密     */     public static String encrypt(String seed, String cleartext) throws Exception {         byte[] rawKey = getRawKey(seed.getBytes());         byte[] result = encrypt(rawKey, cleartext.getBytes());         return toHex(result);     }    /**      * AES解密     */     public static String decrypt(String seed, String encrypted) throws Exception {         byte[] rawKey = getRawKey(seed.getBytes());         byte[] enc = toByte(encrypted);         byte[] result = decrypt(rawKey, enc);         return new String(result);     }    private static byte[] getRawKey(byte[] seed) throws Exception {         KeyGenerator kgen = KeyGenerator.getInstance("AES");         SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");         sr.setSeed(seed);         kgen.init(128, sr); // 192 and 256 bits may not be available         SecretKey skey = kgen.generateKey();         byte[] raw = skey.getEncoded();         return raw;     }    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");         Cipher cipher = Cipher.getInstance("AES");         cipher.init(Cipher.ENCRYPT_MODE, skeySpec);         byte[] encrypted = cipher.doFinal(clear);         return encrypted;     }    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");         Cipher cipher = Cipher.getInstance("AES");         cipher.init(Cipher.DECRYPT_MODE, skeySpec);         byte[] decrypted = cipher.doFinal(encrypted);         return decrypted;     }    public static String toHex(String txt) {         return toHex(txt.getBytes());     }     public static String fromHex(String hex) {         return new String(toByte(hex));     }    public static byte[] toByte(String hexString) {         int len = hexString.length()/2;         byte[] result = new byte[len];         for (int i = 0; i < len; i++)             result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();         return result;     }    public static String toHex(byte[] buf) {         if (buf == null)             return "";         StringBuffer result = new StringBuffer(2*buf.length);         for (int i = 0; i < buf.length; i++) {             appendHex(result, buf[i]);         }         return result.toString();     }     private final static String HEX = "0123456789ABCDEF";     private static void appendHex(StringBuffer sb, byte b) {         sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));     } } ~~~
';

MVC设计模式

最后更新于:2022-04-01 19:52:52

MVC设计模式 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56caa830ef7ee.gif) 写了几天代码,然后对之前学到的知识,进行反思,写出来放在QQ空间上和博客上,目的是互相学习,然后希望可以得到编程高手的补充!这是我转载加修改的博客。 这是我做了2、3天左右的JavaWeb管理系统,bean package放JavaBean类,dao package放数据库操作方法的接口类。daoimpl是实现dao接口的类。factory package是dao工厂类。util package是工具包类,里面有数据库连接类和 分页类。servlet package是servlet类,是整个JavaWeb项目的控制类。view文件夹里全是.jsp文件。 学习MVC设计模式之前,先学习DAO设计模式。下面是我转的博客,是个挺不错的例子 DAO设计模式: 1、DAO简介:       DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。   2、DAO各部分详解: DAO设计模式包括以下5个主要部分: (1)、数据库连接类;       数据库连接类的主要功能是连接数据库并获得连接对象,以及关闭数据库。通过数据库连接类可以大大的简化开发,在需要进行数据库连接时,只需常见该类的实例,并调用其中的方法就可以获得数据库连接对象和关闭数据库,不必再进行重复操作。例: ~~~ Package com.javaweb.dao1 Import java.sql.*; Public class DataBaseConnection{ Private final String DBDRIVER = “com.mysql.jdbc.Driver”; Private final String DBURL = “jdbc:mysql://localhost:3306/javaweb”; Private final String DBUSER = “root””; Private final String DBPASSWORD = “585762”; Private Connection conn = null; Public DataBaseConnection(){ Try{ Class.forName(DBDRIVER); This.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); }catch(Exception e){ System.out.println(“加载数据库驱动失败!”); } } Public Connection getConnection(){ Return conn; } Public void close(){ Try{ Conn.close(); }catch(){ System.out.println(“数据库连接关闭失败!”); } } } ~~~ Package com.javaweb.dao1Import java.sql.*;Public class DataBaseConnection{ Private final String DBDRIVER = “com.mysql.jdbc.Driver”; Private final String DBURL = “jdbc:mysql://localhost:3306/javaweb”; Private final String DBUSER = “root””; Private final String DBPASSWORD = “585762”; Private Connection conn = null; Public DataBaseConnection(){ Try{ Class.forName(DBDRIVER); This.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); }catch(Exception e){ System.out.println(“加载数据库驱动失败!”); } } Public Connection getConnection(){ Return conn; } Public void close(){ Try{ Conn.close(); }catch(){ System.out.println(“数据库连接关闭失败!”); } }}   (2)、VO类:       VO类是一个包含属性和表中字段完全对应的类,并在该类中提供setter和getter方法来设置并获取该类中的属性。例: ~~~ Package com.javaweb.dao1 Public classs User{ Private int userid; Private String username; Private String password; Public int getUserid(){ Return userid; } Public void setUserid(int userid){ Return userid; } Public String getUsername(){ Return username; } Public void setUsername(String username){ Return username; } Public String getUserpassword(){ Return userpassword; } Public void setUserid(String userpassword){ Return userpassword; } } ~~~ Package com.javaweb.dao1Public classs User{ Private int userid; Private String username; Private String password; Public int getUserid(){ Return userid; } Public void setUserid(int userid){ Return userid; } Public String getUsername(){ Return username; } Public void setUsername(String username){ Return username; } Public String getUserpassword(){ Return userpassword; } Public void setUserid(String userpassword){ Return userpassword; }}   (3)、DAO接口:       DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录等。不过因为是借口,所以仅仅是定义,需要子类实现。例: ~~~ Package com.javaweb.dao1; Import java.util.*; Public class UserDAO{ public void insert(User user)throw Exception; Public void update(User user)throw Exception; Public void delete(int userid)throw Exception; Public User queryById(int userid)throw Exception; Public List queryAll()throw Exception; } ~~~ Package com.javaweb.dao1;Import java.util.*;Public class UserDAO{ public void insert(User user)throw Exception; Public void update(User user)throw Exception; Public void delete(int userid)throw Exception; Public User queryById(int userid)throw Exception; Public List queryAll()throw Exception;}   (4)、DAO实现类:       DAO实现类实现了DAO接口,并实现了接口中定义的所有方法。 (5)、DAO工厂类:       在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库操作。这时就必须知道具体的子类,对于后期的修改非常不方便。       使用DAO工厂类,可以比较方便地对代码进行管理,而且可以很好地解决后期修改的问题,通过该DAO工厂类的一个静态方法来获取DAO实现类实例。这时如果要替换DAO实现类,只需要修改该Dao工厂类中的方法代码,而不必邀修改所有的操作数据库代码。例: ~~~ Package com.javaweb.dao1; Public class DAOFactory{ Public static UserDAO getUserDAOInstance(){ Return new UserDAOImpl(); } } ~~~ Package com.javaweb.dao1;Public class DAOFactory{ Public static UserDAO getUserDAOInstance(){ Return new UserDAOImpl(); }}  3、使用DAO完成数据库操作: (1)、添加记录: (2)、更新记录: (3)、删除记录: (4)、查询记录: **MVC模式**(Model-View-Controller)是[软件工程](http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B "软件工程")中的一种[软件架构](http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84 "软件架构")模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。 MVC模式最早由[Trygve Reenskaug](http://zh.wikipedia.org/w/index.php?title=Trygve_Reenskaug&action=edit&redlink=1 "Trygve Reenskaug(页面不存在)")在1978年提出[[1]](http://zh.wikipedia.org/wiki/MVC#cite_note-1) ,是[施乐帕罗奥多研究中心](http://zh.wikipedia.org/wiki/%E5%B8%95%E7%BE%85%E5%A5%A7%E5%A4%9A%E7%A0%94%E7%A9%B6%E4%B8%AD%E5%BF%83 "帕罗奥多研究中心")(Xerox PARC)在20世纪80年代为程序语言[Smalltalk](http://zh.wikipedia.org/wiki/Smalltalk "Smalltalk")发明的一种软件设计模式。**MVC模式**的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组: - (控制器Controller)- 负责转发请求,对请求进行处理。 - (视图View) - 界面设计人员进行图形界面设计。 - (模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。     **图**。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。 **模型**:    模型表示企业数据和业务规则。在MVC的三个部件中,**模型拥有最多的处理任务**。例如它可能用象EJBs和ColdFusionComponents这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说**模型与数据格式无关,这样一个模型能为多个视图提供数据**。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。 **控制器**   控制器**接受用户的输入并调用模型和视图去完成用户的需求**。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。 **优点:** 在最初的[JSP](http://zh.wikipedia.org/wiki/JSP "JSP")网页中,像[数据库](http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93 "数据库")查询语句这样的数据层代码和像[HTML](http://zh.wikipedia.org/wiki/HTML "HTML")这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心地计划和不断的尝试。MVC从根本上强制性地将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。 首先,多个视图能共享一个模型。如今,同一个Web应用程序会提供多种用户界面,例如用户希望既能够通过浏览器来收发[电子邮件](http://zh.wikipedia.org/wiki/%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6 "电子邮件"),还希望通过手机来访问[电子邮箱](http://zh.wikipedia.org/wiki/%E7%94%B5%E5%AD%90%E9%82%AE%E7%AE%B1 "电子邮箱"),这就要求Web网站同时能提供[Internet](http://zh.wikipedia.org/wiki/Internet "Internet")界面和[WAP](http://zh.wikipedia.org/wiki/WAP "WAP")界面。在MVC设计模式中,模型响应用户请求并返回响应数据,视图负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个模型可以被不同的视图重用,所以大大提高了代码的可重用性。 其次,控制器是自包含(self-contained)指高独立内聚的对象,与模型和视图保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。例如,把数据库从[MySQL](http://zh.wikipedia.org/wiki/MySQL "MySQL")移植到[Oracle](http://zh.wikipedia.org/wiki/Oracle "Oracle"),或者把[RDBMS](http://zh.wikipedia.org/wiki/RDBMS "RDBMS")数据源改变成[LDAP](http://zh.wikipedia.org/wiki/LDAP "LDAP")数据源,只需改变控制器即可。一旦正确地实现了控制器,不管数据来自数据库还是[LDAP](http://zh.wikipedia.org/wiki/LDAP "LDAP")服务器,视图都会正确地显示它们。由于MVC模式的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的少互扰性的构件。 此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来连接不同的模型和视图去完成用户的需求,也可以构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择适当的模型进行处理,然后选择适当的的视图将处理结果显示给用户。 **MVC的优点 1.低耦合性**   **视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码**,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。 **2.高重用性和可适用性**   随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。 **3.较低的生命周期成本**   MVC使开发和维护用户接口的技术含量降低。 **4.快速的部署**   使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。 **5.可维护性**   分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。 **6.有利于软件工程化管理**   由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。  
';

前言

最后更新于:2022-04-01 19:52:50

> 原文出处:[SSH框架应用](http://blog.csdn.net/column/details/ssh-leanring.html) 作者:[u014427391](http://blog.csdn.net/u014427391) **本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!** # SSH框架应用 > 对Struts2、Hibernate、Spring这三大框架学习中学到的知识点进行汇总!互相学习参考!
';