基于EasyJWeb的网站安装程序——搭建框架
2007-11-28 18:22
579 查看
最近需要对我们做的网站程序做一个安装程序,今天下午花了点时间写了框架。
1、需求。
首先,这个安装程序应该是通用的,不同的程序使用这个安装程序只需要做少许修改就可以正确执行;其次,安装程序应该可配置,如安装过程中显示的版权、协议等信息,还有安装程序一共要执行多少个步骤、每个步骤执行前是否要检查上一个步骤是否执行成功等;然后,安装完毕时还要做必要的清理工作,如删除安装程序,包括class文件、模板文件和配置文件等;最后,如果安装过程中出现错误,应该有一个友好的错误处理界面。
2、设计。
配置:由于是要做一个通用的安装程序,因此需要有配置信息,也就是说要有一个获取配置信息的接口,如何获取,从哪儿获取,我们不关心,这些由具体的实现类来做。
数据的保存:前台提交进来的数据保存在哪里?是每一步都执行相应的安装操作还是将左右操作放到最后一步来执行?这里我们将数据用一个SetupStep类来保存,并将这个类放到session中,从而实现分步骤的安装。而第二个问题这里采用配置方式来决定,用户可以定制自己的安装程序用什么方式来安装。
异常处理:这里只做了一个简单的异常处理类,暂时不做过多的处理,只便于日后扩展用。
3、实现
ISetupConfig接口
package com.easyjf.setup;
/** *//**
* 安装的配置接口,返回配置信息,如:总步骤数、是否验证上一步等
* @author Administrator
*
*/
public interface ISetupConfig ...{
/** *//**
* 配置文件名
*/
static final String configFileName = "";
/** *//**
* 返回当前安装的软件名
* @return
*/
String getProjectName();
/** *//**
* 返回当前安装的软件的介绍
* @return
*/
String getIntro();
/** *//**
* 返回当前软件的安装协议
* @return
*/
String getProtocol();
/** *//**
* 返回相关版权信息
* @return
*/
String getCopyRight();
/** *//**
* 返回模板页名称
* @return
*/
String getPageName();
/** *//**
* 返回安装数据存放在session中的标识
* @return
*/
String getSessionTag();
/** *//**
* 返回总的步骤数
* @return
*/
int getTotalStepNum();
/** *//**
* 是否开启验证
* @return
*/
boolean validatable();
/** *//**
* 安装方式,每一步分步执行还是到最后一步一次性执行
* @return
*/
boolean setupByStep();
/** *//**
* 初始化需要安装的step
*/
void init();
/** *//**
* 根据步骤数获取步骤
* @param i
* @return
*/
SetupStep getSetupStep(int i);
}
这个接口的主要功能是获取配置信息,以使安装程序可配置,从而达到通用的目的。
然后我们须有有一个类来保存安装是填写的安装信息,比如数据库连接字符串之类、网站基本配置数据等。这里我们设计了一个类,这个类存放每一步前台提交进来的数据,同时要执行这一步的安装操作,如:修改配置文件、保存网站配置信息等等。由于不同的步骤要执行的安装操作不同,因此我将这个类设计为一个抽象类,将具体的安装操作留给子类来实现。代码如下:
package com.easyjf.setup;
import java.util.Map;
public abstract class SetupStep ...{
/** *//**
* 标识这个步骤是第几步
*/
private int step = 1;
/** *//**
* 保存前台提交进来的数据
*/
private Map data;
/** *//**
* 该步骤的上一步
*/
private SetupStep lastStep;
/** *//**
* 该步骤的下一步
*/
private SetupStep nextStep;
/** *//**
* 用于判断该步骤是否成功执行
*/
private boolean isOk;
public boolean isOk() ...{
return isOk;
}
public void setOk(boolean isOk) ...{
this.isOk = isOk;
}
public int getStep() ...{
return step;
}
public void setStep(int step) ...{
this.step = step;
}
public SetupStep getLastStep() ...{
return lastStep;
}
public void setLastStep(SetupStep lastStep) ...{
this.lastStep = lastStep;
}
public SetupStep getNextStep() ...{
return nextStep;
}
public void setNextStep(SetupStep nextStep) ...{
this.nextStep = nextStep;
}
public boolean isCuurentStep(int step)...{
return this.step==step;
}
public Map getData() ...{
return data;
}
public void setData(Map data) ...{
this.data = data;
}
public boolean isEndStep()...{
if(this.nextStep==null)...{
return true;
}
return false;
}
public boolean check()...{
return isOk;
}
public boolean checkTheLastStep()...{
return this.lastStep.isOk;
}
/** *//**
* 执行安装操作
* @return
*/
public abstract boolean doSetup();
/** *//**
* 执行完全安装操作,用于将所有操作放到最后一步来执行的情况
* @return
*/
public boolean doFullSetup()...{
if(!this.getLastStep().isOk)...{
return this.getLastStep().doFullSetup();
}else...{
return doSetup();
}
}
}
这个类可以通过getLastStep()和getNextStep()方法来获取该步骤的上一步和下一步,从而将每一步衔接起来。doSetup()方法是一个抽象方法,预留给子类来实现,因为每一步的安装操作都可能不一样,因此需要让子类来做。
接下来是安装程序的action类。这个类和普通action类一样,只是调用SetupStep来执行安装操作。
package com.easyjf.setup;
import java.util.HashMap;
import java.util.Map;
import com.easyjf.web.ActionContext;
import com.easyjf.web.Module;
import com.easyjf.web.Page;
import com.easyjf.web.WebForm;
import com.easyjf.web.core.AbstractCmdAction;
public abstract class SetupAction extends AbstractCmdAction ...{
private ISetupConfig config;
public void setConfig(ISetupConfig config) ...{
this.config = config;
}
@Override
public Page doInit(WebForm form, Module module) ...{
// TODO Auto-generated method stub
SetupStep setupStep = getStep(1);
ActionContext.getContext().getRequest().getSession(). setAttribute(config.getSessionTag(), setupStep);
return page("setup");
}
public final Page doNext(WebForm form, Module module)...{
SetupStep lastStep = (SetupStep)ActionContext.getContext().getRequest(). getSession().getAttribute(config.getSessionTag());
if(lastStep == null)...{
return this.doInit(form, module);
}
SetupStep currentStep = getStep(lastStep.getStep()+1);
currentStep.setLastStep(lastStep);
currentStep.setData((Map)form.toPo(new HashMap()));
checkTheLastSetup(lastStep);
setup(currentStep);
return page(config.getPageName()+lastStep.getStep()+1);
}
public Page doLast(WebForm form, Module module)...{
SetupStep currentStep = (SetupStep)ActionContext.getContext().getRequest(). getSession().getAttribute("setupStep");
if(currentStep == null)...{
return this.doInit(form, module);
}
SetupStep lastStep = currentStep.getLastStep();
form.addPo(lastStep.getData());
ActionContext.getContext().getRequest().getSession(). setAttribute(config.getSessionTag(), lastStep);
return page(config.getPageName()+lastStep.getStep());
}
protected SetupStep getStep(int num)...{
return config.getSetupStep(num);
}
protected void checkTheLastSetup(SetupStep lastStep)...{
if(!lastStep.isOk())...{
throw new SetupException("上一步没有执行或没有执行成功,请先执行上一步操作!");
}
}
protected void setup(SetupStep step)...{
if(config.getTotalStepNum()==step.getStep())...{
if(!step.doFullSetup())...{
throw new SetupException("安装失败!");
}else...{
clean();
}
}else...{
if(config.setupByStep())...{
step.doSetup();
ActionContext.getContext().getRequest().getSession(). setAttribute(config.getSessionTag(), step);
}
}
}
protected void clean()...{
}
}
doNext(WebForm form, Module module)方法执行下一步,doLast(WebForm form, Module module)方法执行上一步,setup(SetupStep step)方法执行安装操作,clean()方法执行安装完成之后的清理工作,这里暂时没有实现,在下一篇中再来完善。
最后是异常处理类了,这里只是实现了一个简单的异常处理,主要是便于以后扩展用。
package com.easyjf.setup;
public class SetupException extends RuntimeException ...{
public SetupException(String msg)...{
super(msg);
}
public SetupException(String msg, java.lang.Throwable trw) ...{
super(msg, trw);
}
}
今天到此为止,还剩下ISetupConfig接口、SetupStep中的doSetup()方法、SetupAction中的clean()方法没有实现,下一篇再来实现,同时添加一些其它的功能,如验证等。
代码下载:src.rar
1、需求。
首先,这个安装程序应该是通用的,不同的程序使用这个安装程序只需要做少许修改就可以正确执行;其次,安装程序应该可配置,如安装过程中显示的版权、协议等信息,还有安装程序一共要执行多少个步骤、每个步骤执行前是否要检查上一个步骤是否执行成功等;然后,安装完毕时还要做必要的清理工作,如删除安装程序,包括class文件、模板文件和配置文件等;最后,如果安装过程中出现错误,应该有一个友好的错误处理界面。
2、设计。
配置:由于是要做一个通用的安装程序,因此需要有配置信息,也就是说要有一个获取配置信息的接口,如何获取,从哪儿获取,我们不关心,这些由具体的实现类来做。
数据的保存:前台提交进来的数据保存在哪里?是每一步都执行相应的安装操作还是将左右操作放到最后一步来执行?这里我们将数据用一个SetupStep类来保存,并将这个类放到session中,从而实现分步骤的安装。而第二个问题这里采用配置方式来决定,用户可以定制自己的安装程序用什么方式来安装。
异常处理:这里只做了一个简单的异常处理类,暂时不做过多的处理,只便于日后扩展用。
3、实现
ISetupConfig接口
package com.easyjf.setup;
/** *//**
* 安装的配置接口,返回配置信息,如:总步骤数、是否验证上一步等
* @author Administrator
*
*/
public interface ISetupConfig ...{
/** *//**
* 配置文件名
*/
static final String configFileName = "";
/** *//**
* 返回当前安装的软件名
* @return
*/
String getProjectName();
/** *//**
* 返回当前安装的软件的介绍
* @return
*/
String getIntro();
/** *//**
* 返回当前软件的安装协议
* @return
*/
String getProtocol();
/** *//**
* 返回相关版权信息
* @return
*/
String getCopyRight();
/** *//**
* 返回模板页名称
* @return
*/
String getPageName();
/** *//**
* 返回安装数据存放在session中的标识
* @return
*/
String getSessionTag();
/** *//**
* 返回总的步骤数
* @return
*/
int getTotalStepNum();
/** *//**
* 是否开启验证
* @return
*/
boolean validatable();
/** *//**
* 安装方式,每一步分步执行还是到最后一步一次性执行
* @return
*/
boolean setupByStep();
/** *//**
* 初始化需要安装的step
*/
void init();
/** *//**
* 根据步骤数获取步骤
* @param i
* @return
*/
SetupStep getSetupStep(int i);
}
这个接口的主要功能是获取配置信息,以使安装程序可配置,从而达到通用的目的。
然后我们须有有一个类来保存安装是填写的安装信息,比如数据库连接字符串之类、网站基本配置数据等。这里我们设计了一个类,这个类存放每一步前台提交进来的数据,同时要执行这一步的安装操作,如:修改配置文件、保存网站配置信息等等。由于不同的步骤要执行的安装操作不同,因此我将这个类设计为一个抽象类,将具体的安装操作留给子类来实现。代码如下:
package com.easyjf.setup;
import java.util.Map;
public abstract class SetupStep ...{
/** *//**
* 标识这个步骤是第几步
*/
private int step = 1;
/** *//**
* 保存前台提交进来的数据
*/
private Map data;
/** *//**
* 该步骤的上一步
*/
private SetupStep lastStep;
/** *//**
* 该步骤的下一步
*/
private SetupStep nextStep;
/** *//**
* 用于判断该步骤是否成功执行
*/
private boolean isOk;
public boolean isOk() ...{
return isOk;
}
public void setOk(boolean isOk) ...{
this.isOk = isOk;
}
public int getStep() ...{
return step;
}
public void setStep(int step) ...{
this.step = step;
}
public SetupStep getLastStep() ...{
return lastStep;
}
public void setLastStep(SetupStep lastStep) ...{
this.lastStep = lastStep;
}
public SetupStep getNextStep() ...{
return nextStep;
}
public void setNextStep(SetupStep nextStep) ...{
this.nextStep = nextStep;
}
public boolean isCuurentStep(int step)...{
return this.step==step;
}
public Map getData() ...{
return data;
}
public void setData(Map data) ...{
this.data = data;
}
public boolean isEndStep()...{
if(this.nextStep==null)...{
return true;
}
return false;
}
public boolean check()...{
return isOk;
}
public boolean checkTheLastStep()...{
return this.lastStep.isOk;
}
/** *//**
* 执行安装操作
* @return
*/
public abstract boolean doSetup();
/** *//**
* 执行完全安装操作,用于将所有操作放到最后一步来执行的情况
* @return
*/
public boolean doFullSetup()...{
if(!this.getLastStep().isOk)...{
return this.getLastStep().doFullSetup();
}else...{
return doSetup();
}
}
}
这个类可以通过getLastStep()和getNextStep()方法来获取该步骤的上一步和下一步,从而将每一步衔接起来。doSetup()方法是一个抽象方法,预留给子类来实现,因为每一步的安装操作都可能不一样,因此需要让子类来做。
接下来是安装程序的action类。这个类和普通action类一样,只是调用SetupStep来执行安装操作。
package com.easyjf.setup;
import java.util.HashMap;
import java.util.Map;
import com.easyjf.web.ActionContext;
import com.easyjf.web.Module;
import com.easyjf.web.Page;
import com.easyjf.web.WebForm;
import com.easyjf.web.core.AbstractCmdAction;
public abstract class SetupAction extends AbstractCmdAction ...{
private ISetupConfig config;
public void setConfig(ISetupConfig config) ...{
this.config = config;
}
@Override
public Page doInit(WebForm form, Module module) ...{
// TODO Auto-generated method stub
SetupStep setupStep = getStep(1);
ActionContext.getContext().getRequest().getSession(). setAttribute(config.getSessionTag(), setupStep);
return page("setup");
}
public final Page doNext(WebForm form, Module module)...{
SetupStep lastStep = (SetupStep)ActionContext.getContext().getRequest(). getSession().getAttribute(config.getSessionTag());
if(lastStep == null)...{
return this.doInit(form, module);
}
SetupStep currentStep = getStep(lastStep.getStep()+1);
currentStep.setLastStep(lastStep);
currentStep.setData((Map)form.toPo(new HashMap()));
checkTheLastSetup(lastStep);
setup(currentStep);
return page(config.getPageName()+lastStep.getStep()+1);
}
public Page doLast(WebForm form, Module module)...{
SetupStep currentStep = (SetupStep)ActionContext.getContext().getRequest(). getSession().getAttribute("setupStep");
if(currentStep == null)...{
return this.doInit(form, module);
}
SetupStep lastStep = currentStep.getLastStep();
form.addPo(lastStep.getData());
ActionContext.getContext().getRequest().getSession(). setAttribute(config.getSessionTag(), lastStep);
return page(config.getPageName()+lastStep.getStep());
}
protected SetupStep getStep(int num)...{
return config.getSetupStep(num);
}
protected void checkTheLastSetup(SetupStep lastStep)...{
if(!lastStep.isOk())...{
throw new SetupException("上一步没有执行或没有执行成功,请先执行上一步操作!");
}
}
protected void setup(SetupStep step)...{
if(config.getTotalStepNum()==step.getStep())...{
if(!step.doFullSetup())...{
throw new SetupException("安装失败!");
}else...{
clean();
}
}else...{
if(config.setupByStep())...{
step.doSetup();
ActionContext.getContext().getRequest().getSession(). setAttribute(config.getSessionTag(), step);
}
}
}
protected void clean()...{
}
}
doNext(WebForm form, Module module)方法执行下一步,doLast(WebForm form, Module module)方法执行上一步,setup(SetupStep step)方法执行安装操作,clean()方法执行安装完成之后的清理工作,这里暂时没有实现,在下一篇中再来完善。
最后是异常处理类了,这里只是实现了一个简单的异常处理,主要是便于以后扩展用。
package com.easyjf.setup;
public class SetupException extends RuntimeException ...{
public SetupException(String msg)...{
super(msg);
}
public SetupException(String msg, java.lang.Throwable trw) ...{
super(msg, trw);
}
}
今天到此为止,还剩下ISetupConfig接口、SetupStep中的doSetup()方法、SetupAction中的clean()方法没有实现,下一篇再来实现,同时添加一些其它的功能,如验证等。
代码下载:src.rar
相关文章推荐
- 【转载】基于 JUnit 的 InstallAnywhere 安装程序图形界面自动测试框架
- [置顶] maven web基于spring+mybatis+springmvc框架搭建选课网站系统
- 异步消息总线hornetq学习-01基于maven的客户端程序框架搭建
- Qt是一个不错的库。因此在一些场合下,可以基于Qt搭建程序和游戏框架。
- 基于Flask框架的Python web程序的开发实战 <一> 环境搭建
- 基于CI框架 MVC模式下 的初次网站搭建
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(2:开始搭建模块化的程序框架)
- 基于VUE的前端框架搭建
- Android开发环境搭建:SDK在线离线安装+在Eclipse中配置ADT+第一个Android程序运行
- mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(一搭建开发环境——安装交叉工具连)
- 如何简单便捷的搭建一个网站 - 基于Django
- django框架网站搭建方法与链接
- 搭建基于Ant+Jmeter+jenkins的自动负载测试框架的若干问题记录及解决
- 基于express框架快速搭建web项目
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 基于VMware 12的Ubantu 16.04之上的Tensorflow深度学习框架搭建
- 如何实现基于框架的书籍交易网站的质量属性
- 基于netty的网络聊天室(一)——基础框架搭建
- 基于Jmeter和Jenkins搭建性能测试框架