在本文完成下挑战书的功能,其中里面也涉及到富文本编辑器的使用

1、生成challenge数据表

  在D:\medical\war\etc\db.txt文本中增加数据表challenge脚本,然后通过navicat工具把数据表在mysql中生成

/*创建挑战书记录表*/
CREATE TABLE CHALLENGE(challengeId int PRIMARY KEY NOT NULL, userId VARCHAR(20), title VARCHAR(128), depId int, prescript TEXT, challengers VARCHAR(256))
ENGINE=InnoDB DEFAULT CHARSET=UTF8

2、challenge数据表hibernate配制

  在D:\medical\war\etc\mapping目录下生成challenge.hbm.xml文件,里面填写如下内容

  
  
  

    
    	
    		
    	
        
        
        
        
        
    


3、定义challenge.hbm.xml对应的POJO类

package com.medical.server.dao;

/**
 * 斗医系统发布挑战书处理类
 * 
 * @author qingkechina 2014-08-18
 */
public class ChallengeDAO
{
    /**
     * 挑战ID
     */
    private int challengeId = 0;
    
    /**
     * 挑战人
     */
    private String userId = null;
    
    /**
     * 科室ID
     */
    private int depId = 0;
    
    /**
     * 挑战标题
     */
    private String title = null;
    
    /**
     * 挑战内容
     */
    private String prescript = null;
    
    /**
     * 被挑战人
     */
    private String challengers = null;
    
    public int getChallengeId()
    {
        return challengeId;
    }
    
    public void setChallengeId(int challengeId)
    {
        this.challengeId = challengeId;
    }
    
    public String getUserId()
    {
        return userId;
    }
    
    public void setUserId(String userId)
    {
        this.userId = userId;
    }
    
    public int getDepId()
    {
        return depId;
    }
    
    public void setDepId(int depId)
    {
        this.depId = depId;
    }
    
    public String getTitle()
    {
        return title;
    }
    
    public void setTitle(String title)
    {
        this.title = title;
    }
    
    public String getPrescript()
    {
        return prescript;
    }
    
    public void setPrescript(String prescript)
    {
        this.prescript = prescript;
    }
    
    public String getChallengers()
    {
        return challengers;
    }
    
    public void setChallengers(String challengers)
    {
        this.challengers = challengers;
    }
}


4、由于涉及到对数据表challenge数据的读取与写入操作,所以定义一个ChallengeUtil类对POJO进行操作

package com.medical.server.util;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.medical.frame.util.FrameDBUtil;
import com.medical.server.dao.ChallengeDAO;

/**
 * 斗医系统服务端挑战书工具类
 * 
 * @author qingkechina 2014-08-18
 */
public class ChallengeUtil
{
    /**
     * 把挑战书记录入库
     */
    public static void insertChallenge(String userId, String title, int depId, String prescript, String challengers)
    {
        ChallengeDAO challengeDao = new ChallengeDAO();
        challengeDao.setChallengers(challengers);
        challengeDao.setDepId(depId);
        challengeDao.setPrescript(prescript);
        challengeDao.setTitle(title);
        challengeDao.setUserId(userId);
        
        Session session = FrameDBUtil.openSession();
        Transaction transaction = session.beginTransaction();
        session.save(challengeDao);
        transaction.commit();
        FrameDBUtil.closeSession();
    }
    
}


5、当用户登录系统在浏览器中发布挑战书时,需要调用到业务逻辑处理,所以定义PublishChallengeAction业务Java类,里面涉及对数据的校验

package com.medical.server.data;

import com.google.gson.Gson;
import com.medical.frame.FrameCache;
import com.medical.frame.FrameDefaultAction;
import com.medical.frame.FrameException;
import com.medical.frame.bean.FramePathBean;
import com.medical.frame.bean.FrameResultBean;
import com.medical.frame.constant.FrameErrorCode;
import com.medical.frame.util.FrameUtil;
import com.medical.server.dao.UserDAO;
import com.medical.server.util.ChallengeUtil;

/**
 * 斗医系统发布挑战书处理类
 * 
 * @author qingkechina 2014-08-18
 */
public class PublishChallengeAction extends FrameDefaultAction
{
    /**
     * 全局Gson对象
     */
    private final static Gson gson = new Gson();
    
    @Override
    public String execute()
        throws FrameException
    {
        // 用户尚未登录系统
        UserDAO loginUser = FrameCache.getInstance().getUserBySession(session);
        if (loginUser == null)
        {
            FrameResultBean resultBean = new FrameResultBean();
            resultBean.setErrorCode(FrameErrorCode.USER_NOT_LOGIN_ERROR);
            resultBean.setErrorDesc(FrameUtil.getErrorDescByCode(resultBean.getErrorCode()));
            return gson.toJson(resultBean);
        }
        
        // 获取挑战标题
        String title = this.getParameter("title");
        if (FrameUtil.isEmpty(title))
        {
            FrameResultBean resultBean = new FrameResultBean();
            resultBean.setErrorCode(FrameErrorCode.CHANLLENGE_TITLE_EMPTY);
            resultBean.setErrorDesc(FrameUtil.getErrorDescByCode(resultBean.getErrorCode()));
            return gson.toJson(resultBean);
        }
        
        // 获取科室ID
        int depId = -1;
        String departValue = getParameter("departId");
        if (FrameUtil.isEmpty(departValue) == false)
        {
            depId = Integer.valueOf(departValue);
        }
        if (depId == -1)
        {
            FrameResultBean resultBean = new FrameResultBean();
            resultBean.setErrorCode(FrameErrorCode.CHANLLENGE_DEP_EMPTY);
            resultBean.setErrorDesc(FrameUtil.getErrorDescByCode(resultBean.getErrorCode()));
            return gson.toJson(resultBean);
        }
        
        // 获取挑战药方内容、挑战人
        String prescript = getParameter("prescript");
        String challengers = getParameter("challengers");
        // 写入数据库
        ChallengeUtil.insertChallenge(loginUser.getUserId(), title, depId, prescript, challengers);
        
        // 设置返回路径
        FramePathBean pathBean = new FramePathBean();
        pathBean.setErrorCode(200);
        pathBean.setForwardPath("index.act?timestamp=" + System.currentTimeMillis());
        return gson.toJson(pathBean);
    }
}


6、如何调用到PublishChallengeAction业务处理类呢?我们在D:\medical\war\WEB-INF\config\challenge\challenge-data.xm定义,内容如下:



    
    


从上面的配置可以看出,当界面上触发按钮时,调用到publishChallenge的JS方法,从而触发业务逻辑。那么界面是什么样的呢?

【斗医】【16】Web应用开发20天_第1张图片


7、在上面的这个界面原型中,药方使用纯文本描述,理论上讲只要使用textarea标签就可以了,考虑到有时还可能会上传一些中药材的图片或病情图片,所以有一个上传图片的功能,这里面就需要使用HTML的富文本编辑器了。

    关于HTML富文本编辑器有很多,像百度的ueditor、Twitter的Bootstrap、Tower的Simditor等等,我们这里选择Kindeditor,为什么选择它呢?主要原因是我没有使用过,呵呵。

    下面就随着我进入Kindeditor世界吧!

(1)进入http://kindeditor.net/down.php下载

(2)下载后把kindeditor解压medical应用的war\js目录下

(3)由于我们使用的是Tomcat容器,所以只保留JSP的功能即可(即删除kindeditor下的asp、asp.net和php目录)

(4)由于medical应用并非发布版本,所以不需要压缩后的js(即删除kindeditor-min.js、kindeditor-all-min.js文件)

(5)有一个examples文件夹,从名称上看应该是一个使用示例,我们可以通过这学习这个例子快速入门

    完成了上述准备工作,下面就可以步入kindeditor之旅了!

8、定义challenge.html来绘制出上述界面(在D:\medical\war\module\challenge下增加challenge.html文件)



    
        斗医