基于EasyJWeb的网站安装程序——搭建框架

最近需要对我们做的网站程序做一个安装程序,今天下午花了点时间写了框架。

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyJWeb是基于java技术,用于企业级Java Web应用程序快速开发的MVC框架框架设计构思来源于国内众多项目实践,框架的设计及实现借鉴当前主要流行的开源Web框架,如Rails、Struts、JSF、Tapestry等,吸取其优点及精华,是一个完全由来自的中国开源爱好者开发,文档及注释全部为中文的开源框架EasyJWeb由主要由四个部分组成:   1、核心MVC。EasyJWeb的核心是一个基于模板技术实现的MVC框架;他能让我们用非常简洁的代码写基于Java的Web应用。    2、容器及通用业务逻辑封装。作为一个旨在让基于Java的Web应用程序开发变得直接、快速、简易的框架EasyJWeb提供了一个IoC容器,并对企业级应用中的一些通用业务逻辑(如分页、查询、DAO等)进行了抽象及封装,提供了一套可以直接操作、应用企业资源的组件及API。    3、代码生成引擎及工具。仅仅依靠一个灵活、简易的MVC核心引擎还不能最大限度的提高开发速度,因此EasyJWeb还提供了一个灵活、易用的代码生成引擎及工具,通过使用代码生成引擎,可以快速完成基于JavaEE平台的企业级应用程序生成。如数据库添删改查(CRUD)代码生成、自动页面模版生成、自动配置文件管理等。    4、EasyJWeb插件体系,项目中的各种实用功能的扩展,可以灵活地通过基于插件的形式安装到EasyJWeb中,提供各种针对性的功能。如ajax实用插件、代码生成插件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值