前后端双向异步

                AJAX和SpringMVC双向异步完成信息实时更新

文章目录

  • 前言
  • 一、前后端双向异步是什么?
  • 二、使用步骤
  • 总结



前言

前后端双向异步的作用于实时更新数据,比如打车,外卖这种小程序,时刻提示订单

本章就介绍了前后端双向异步的写法


提示:以下是本篇文章正文内容,下面案例可供参考


一、前后端双向异步是什么?

            其实就是AJAX和SpringMVC的异步操作,AJAX定时器去后端取Redis里的值,SpringMVC定时器去数据库查询数据并存Redis里


二、使用步骤


1.AJAX异步定时器操作

  • 在主页面中写一个iframe标签,此标签指向另一个页面  

代码如下(示例):

  • 此页面只做一件事:ajax访问后端,并弹出提示

             页面只做了一个异步AJAX,访问后台并接收返回值,并用self.async();自己调自己的方法继续执行,setTimeOut() 定时器5秒执行

代码如下(示例):


	


   对应的Controller层内的操作:

@RestController()
@RequestMapping("async")
public class AsyncController {
    @Autowired
    JedisUtil jedisUtil;

    /**
     * @auth: fei
     * @return:Callable
     * @description:查看一下有没有自己的订单
     * 没有订单的情况下,查看是否有订单;
     * 有订单的情况下,是否订单被中途取消。
     */
    @RequestMapping(value = "myorder")
    @ResponseBody
    public Callable callable(HttpSession session) {
        return new Callable() {
            /*
             * 获取登录后的个人信息
             */
            Map eng= (Map) session.getAttribute("user");
            String unfinished = "";//有未完成订单
            String newOrder = "";//有新订单
            /*
             *从个人信息的map里取出状态信息,判断是否为繁忙
             */
            Integer estate=Integer.valueOf(eng.get("estate").toString());
            @Override
            public String call() throws Exception {
                for(int i=0;i<30;i++) {
                    unfinished =estate!=0? null :  "true" ;
                    newOrder =jedisUtil.get("orders")==null?"":jedisUtil.get("orders").toString();
                    if(unfinished==null) {//有未完成订单
                        return "unfinished";
                    }else if((!newOrder.equals(""))&&newOrder!=null) {//有新订单
                        return "newOrder";
                    }
                    Thread.sleep(1000);
                }
                return "";
            }
        };
    }
}

解释:

        一次AJAX访问过来,内部循环30次获取订单信息,如果30次都没获取到新订单的信息,那就返回一个" ";

        

2.配置SpringMVC的定时器

  • 配置web.xml里对异步的支持

代码如下(示例):

    
        mvc
        org.springframework.web.servlet.DispatcherServlet

        
            contextConfigLocation
            classpath:spring.xml
        
        1
       
       true
    
    
        mvc
        /
    

该处使用的true标签开启异步支持

注:如果web.xml配置了Filter过滤器,那么true就要写在Filter标签内

  • 配置SpringMVC.xml配置文件里面的内容

代码如下(示例):


    
    
    

      写一个类用来执行SpringMVC定时器的任务

/**
* @author fei
* 定期把订单同步至Redis数据库。
*
*/
@Component
public class OrderTask {
@Autowired
Dao dao;
@Autowired
JedisUtil jedisUtil;

/**
* @throws Exception
* @auth: fei
* @return:void
* @description:同步订单 1 秒一次 (定时器)
* 业务只提示 是否有新订单,不用记录订单具体详情
* //@Scheduled(cron = "*/1 * * * * ?") 设置一秒执行一次
*/

    @Async
    @Scheduled(cron = "*/1 * * * * ?")
    public void asyncOrder() throws Exception{
        try {
            /**
             * 读取 数据库中的 status 为 0的订单
             */
            List list = (List) dao.queryForList("EngineerMapper.getOrders",null);

            jedisUtil.put("getOrders", list.size()==0?"":JSON.toJSONString(list));//有订单就存入进去 ,
            jedisUtil.put("orders", list.size()==0?"":list.size()+"");//没有订单就是“”,有订单就不是0
        }catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}

顺便展示一下案例中的JedisUtil类的代码,这里只是简单的用Jedis操作了Redis

@Component
public class JedisUtil {
     private static Jedis jedis;
    public JedisUtil(){
        JedisPoolConfig poolConfig = new JedisPoolConfig(); //连接池配置
        poolConfig.setMaxTotal(10);  //连接池总数量
        poolConfig.setMaxIdle(10);   //连接池空闲数量
        poolConfig.setMinIdle(1);    //无连接时,最小的链接的数

        // 创建Jedis连接池
        JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

        // 从连接池中获取jedis对象
        jedis = jedisPool.getResource();
    }

    public static void put(String phone,String code){
        long time=60*5l;
        jedis.set(phone,code,"nx","ex",time);
    }

    public static void putJSON(String key,String value){
        jedis.set(key,value);
    }

    public static Object get(String phone){
        return jedis.get(phone);
    }
    public static void remove(String phone){
        jedis.del(phone);
    }


}


    到这里前后端的双向异步完成信息实时更新就做完了     

          看效果展示图:      

前后端双向异步_第1张图片



总结


以上就是AJAX和SpringMVC双向异步的所有操作,说白了也就是前后端两个定时器,后端定时查数据库存Redis,前台定时来从Redis里取数据,这样有效减轻了数据库的压力。对于数据库的访问只存在一个,所有客户端访问Redis就可以了~

你可能感兴趣的:(JAVA,java,ajax,前端,后端)