webService(CXF)的简单使用

最近在一个的三级数据库考试系统采用了分布式架构,需要使用web service来实现客户端的C#与服务器端的java的交互,我依然选择了最近最火的cxf框架

首先是Cxf与spring的集成,在我的前一篇博客中已经说明:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451570.html

现在我就拿一个其中简单例子来实现下(这里只实现java服务器端的)

首次是Service层:ExamStartService:

package xidian.sl.service.webService;

import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style = Style.RPC)
//@SOAPBinding(style = Style.RPC)这个必须要加否则在客户端加载服务时会出现参数的错误
public interface ExamStartService {
    /*
     * 客户端传过来的应该是学生的学号和考试的名字
     * **/
    public String startExam(@WebParam(name = "stuNum")String stuNum, 
            @WebParam(name = "examName")String examName, @WebParam(name = "sign")String sign, @WebParam(name = "ipaddr")String ipaddr)throws Exception;
    
    
}

service的实现层:ExamStartServiceImpl:

package xidian.sl.service.impl.webService;

import java.util.List;
import java.util.Random;

import javax.jws.WebService;

import xidian.sl.dao.webService.ExamStartDAO;
import xidian.sl.entity.Exam;
import xidian.sl.entity.Examinee;
import xidian.sl.entity.Paper;
import xidian.sl.service.webService.ExamStartService;
import xidian.sl.util.FormatDate;
@WebService(endpointInterface = "xidian.sl.service.webService.ExamStartService")
public class ExamStartServiceImpl implements ExamStartService {
    
    private ExamStartDAO examStartDAO;

    public ExamStartDAO getExamStartDAO() {
        return examStartDAO;
    }

    public void setExamStartDAO(ExamStartDAO examStartDAO) {
        this.examStartDAO = examStartDAO;
    }

    /**
     * @author shenliang 2011-11-29
     * 客户端点击开始考试后的处理(客户端传过来的是考生的学号,和本场考试的考试名)
     * 1.###先根据客户端传过来的参数sign{"false","true"},false表示在客户端还没有压缩包的存在,true表示已经有压缩包的存在
     * 若为false,则先判断该考生是刚开始考生还是再次的请求(查询该考生表中是否已经存在开始考试的时间),若无,则为第一次考试,
     * 将开始考试的时间更新进去,并返回success,若已经有考试开始时间,则表示该考生已更换电脑,
     * 则需要将该考生原先的试卷包和考试的剩余时间发送过去,
     * 若为true,表示该考试已开始考生并且是有压缩包的,此时服务器端只需要将该考试的剩余时间进行返回即可
     * @throws Exception 
     * 
     * */
    public String startExam(String stuNum, String examName, String sign, String ipaddr) throws Exception {
        System.out.println("成功了!    "+"学号="+stuNum+" 考试="+examName+" 标记="+sign+" ip="+ipaddr);
        //查找该场考试
        List<Exam> examList = examStartDAO.getExamList(examName);
        //考试的名字必须是唯一的
        Exam exam = examList.get(0);
        //判断该场考试是否有ip范围的限制
        String ipAddr = exam.getExamIpaddr();
        if(!"未设定".equals(ipAddr)){
            String[] ips = ipAddr.split("-");         //将ip地址切分为开始和结束ip
            Boolean boo = isBetween(ipaddr, ips[0], ips[1]);
            if(boo == false){
                //考试机所属ip不在指定的范围
                System.out.println("不合法的ip地址");
                return "wrongfulIP";
            }else{
                System.out.println("合法的ip地址");
            }
        }
        
        //查找该考生
        List<Examinee> examineeList = examStartDAO.getExamineeByNumAndExamName(stuNum, examName);
        //该集合中只可能有一条记录
        Examinee examinee = examineeList.get(0);
        //此处还要判断该考生是否已经完成考试了 防止第二次重复考试
        if(!"???".equals(examinee.getExamEndtime())){
            return "finished";
        }
        
        if("false".equals(sign)){                         //false表示客户端还没有压缩包
            System.out.println("进入false");
            //查询该考生的开始考试时间是否存在
            if( !"???".equals(examinee.getExamStartime()) ){                  //该考生已经开始考试,但中途更换了电脑
                System.out.println("已经开始考试了,但是换机子了");
                //更新考生表,将机子的变换加1
                examStartDAO.updateChangeComNum(examinee);
                //将ip更新进去
                examinee.setExamineeIpaddr(ipaddr);
                examStartDAO.updateExaminee(examinee);
                
                String examLong = exam.getExamLong();  //获得考试的时长
                //则将剩余的时间返回,先计算使用了的时间,返回的是一个字符串,分#秒
                String examUserdTime = FormatDate.examRemainTime(examinee.getExamStartime(), FormatDate.getFormateDateAll());  //param:1.考试开始时间,2.现在的时间
                String[] splitTime = examUserdTime.split("#");
                //这里先忽略秒
                String examRemainTime = String.valueOf(Integer.valueOf(examLong) - Integer.valueOf(splitTime[0]));
                /**
                 * 将下载的操作交给客户端处理了,这边只需要传递试卷名参数给客户端即可
                 * */
                //将该考生原先的压缩包再次发送,更加该考生得到该试卷包
                //String paperPath = examinee.getPaper().getZipPath()+examinee.getPaper().getZipName();
                
                //调用FileDownload类中的downloadFile()方法
                //FileDownload.downloadFile(paperPath);
                
                //返回的  剩余时间#试卷名
                StringBuilder str = new StringBuilder(examRemainTime);
                str.append("#");
                str.append(examinee.getPaper().getZipName());
                return str.toString();   //返回考试的剩余时间
            }else{
                System.out.println("未开始过考试");
                //更新ip
                examinee.setExamineeIpaddr(ipaddr);
                examStartDAO.updateExaminee(examinee);
                
                //得到本场考试的所有试卷编号
                List<Integer> paperIdList = examStartDAO.getPaperId(examName);
                //产生一个随机编号
                Random random = new Random();
                int rand = random.nextInt(paperIdList.size());        //利用nextInt(产生0到指定值之间的) 产生随机数
                int paperId = paperIdList.get(rand);                //list.get()返回列表中指定位置的元素,题目的编号
                System.out.println("随机编号:"+ paperId);
                //将相应的试卷包的id更新到考生表中
                examStartDAO.UpdateExamZipAndStartTime(stuNum, examName, paperId, FormatDate.getFormateDateAll());
                //得到试卷,
                Paper paper = examStartDAO.getPaperById(paperId);
                /**
                 * 将下载的操作交给客户端处理了,这边只需要传递试卷名参数给客户端即可
                 * */
                //String paperPath = paper.getZipPath()+paper.getZipName();  //获得试卷的地址
                
                //调用FileDownload类中的downloadFile()方法
                //FileDownload.downloadFile(paperPath);
                
                //返回的        success#试卷名
                StringBuilder str = new StringBuilder("success");
                str.append("#");
                str.append(paper.getZipName());
                return str.toString();
            }
        }else{
            System.out.println("已经开始过考试了,现在重新开始了");
            //这里就不需要更新ip
            
            String examLong = exam.getExamLong();  //获得考试的时长
            //则将剩余的时间返回,先计算使用了的时间,返回的是一个字符串,分#秒
            String examUserdTime = FormatDate.examRemainTime(examinee.getExamStartime(), FormatDate.getFormateDateAll());  //param:1.考试开始时间,2.现在的时间
            String[] splitTime = examUserdTime.split("#");
            //这里先忽略秒
            String examRemainTime = String.valueOf(Integer.valueOf(examLong) - Integer.valueOf(splitTime[0]));
            
            return examRemainTime;           //只需返回考试的剩余时间即可
        }
    }
    
    //判断ip的范围
    public static boolean isBetween(String ip, String start, String end){
        //注意一下用点切割时要注意转义
        String[] ipArray = ip.split("\\.");
        String[] startArray = start.split("\\."); 
        String[] endArray = end.split("\\."); 
        //以上是将三个ip都以点进行切分
        System.out.println(ipArray.length);
        if(ipArray.length != 4){
            return false;      
        }           
        
        long ipLong=((long)((((Integer.parseInt(ipArray[0])<< 8)+Integer.parseInt(ipArray[1]))<< 8)+ 
                Integer.parseInt(ipArray[2]))<< 8)+Integer.parseInt(ipArray[3]); 
        long startLong=((long)((((Integer.parseInt(startArray[0])<< 8)+Integer.parseInt(startArray[1]))<< 8)+ 
                Integer.parseInt(startArray[2]))<< 8)+Integer.parseInt(startArray[3]); 
        long endLong=((long)((((Integer.parseInt(endArray[0])<< 8)+Integer.parseInt(endArray[1]))<< 8)+ 
                Integer.parseInt(endArray[2]))<< 8)+Integer.parseInt(endArray[3]);
        return ipLong>= startLong&& ipLong<= endLong; 
}
        
        
}

这样就初步实现了客户端,然后根据配置文件中配置的方法,客户端就能进行接口的调用了

 

 

posted on 2012-04-16 13:08  发表是最好的记忆  阅读(6459)  评论(1编辑  收藏  举报