怎样将从Action中拿出来的map作为参数传给一个参数为map的js函数呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样将从Action中拿出来的map作为参数传给一个参数为map的js函数呢?相关的知识,希望对你有一定的参考价值。

在Action里面有一个map,我想在页面上把这个map作为一个javascript函数的参数,让JavaScript函数去执行一些逻辑,可是怎么这样JavaScript函数不能执行呢??????????????????????
使用dwr的时候就可以把Action里面的map作为js函数的参数的,这里不涉及远程调用啊,只是普通的使用Action里面的map而已,而dwr也就是一个JavaScript库啊,按道理来说,在不应用dwr的情况下,Action里面的map传递给普通的js函数应该是可以的吧!

不可以,在应用dwr的时候可以是dwr有个转换机制让java类对象和js类对象能够互相转换,这样就能在使用dwr的时候可以把action里的map作为js函数的参数,直接把Java对象传给js是不行的!建议还是用dwr来实现吧! 参考技术A 将JAVA对象传给javascript,能吗? 参考技术B 通过中间格式转换 将JAVA Map结构数据转换为XML或JSON格式表示的字符串 然后赋值给JS JS再做出相应的处理

至于赋值方式,如果是加载页面的时候 那就直接赋值给JS变量 如果是临时传递的话那用AJAX请求吧 将字符串返回
不懂的百度HI联系我

SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题

之前想的比较简单,请求到达controller的时候,传给action的参数没有经过任何封装,就是一个Map。然后action再调用service的时候,传递的参数也是map

@Controller
public class DepositController extends BaseController{
    @TransactionMapping(transaction = "Deposit")
    public Map Deposit(Map request) {
        Map map = callService(ServiceDict.DepositService, request);
        return map;
    }
}

但是当我在做存款交易的时候,我隐隐约感觉这样很有问题,因为再action里面完全无法看出来付款人收款人金额等等重要信息,虽然实际上这些信息在调用Service之前会经过一系列拦截器,但是当到达service里面的时候,参数又要从map里面get一遍,感觉很不舒服,就像没有经过校验的原始数据一样。

 

所以我想确实action调用service的时候,应该将参数封装到专门的请求参数类里面。

// 日切
    @TransactionMapping(transaction = "NextAccountingDate")
    public Map nextAccountingDate(Map request) {
        Map map = callService(ServiceDict.NextAccountingDateService,new NextAccountingDateRequest());
        return map;
    }

以日切交易为例,我搞了一个NextAccountingDateRequest,封装该Service需要的参数(实际上这个交易没有任何参数,只是举例)

public abstract class Service {
    
    private List<Interceptor> interceptorList;
    
    @SuppressWarnings("rawtypes")
    public abstract Map execute(Object request);
    
    public List<Interceptor> getInterceptorList() {
        return interceptorList;
    }
    public void setInterceptorList(List<Interceptor> interceptorList) {
        this.interceptorList = interceptorList;
    }
}

但是我是反射的方式调用Service,所有的service都继承了上面的这个抽象类Service,所以execute方法的参数就是需要考虑的问题。一开始如上图所示,我使用Object来接收,可是Service里面呢

public class NextAccountingDateService extends Service<NextAccountingDateRequest>{

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    public Map execute(NextAccountingDateRequest request) {
        // TODO Auto-generated method stub
        Map result = new HashMap();
        
        //先查出当前账务日期
        String pdat = DaoUtil.getMapper(SysparamMapper.class).selectByPrimaryKey(CommonDict.PDAT).getValue();
        Date currentDate = DateUtil.getDateFromStr(pdat);
        
        //计算下一日期
        Date nextDate = DateUtil.getNextDate(currentDate);
        
        //record
        Sysparam record = new Sysparam();
        record.setValue(DateUtil.getDateDashFormat(nextDate));
        
        //example
        SysparamExample example = new SysparamExample();
        example.createCriteria().andKeyEqualTo(CommonDict.PDAT);
        
        //do update
        DaoUtil.getMapper(SysparamMapper.class).updateByExampleSelective(record, example);
        
        //query again
        pdat = DaoUtil.getMapper(SysparamMapper.class).selectByPrimaryKey(CommonDict.PDAT).getValue();
        
        result.put("pdat", pdat);
        return result;
    }
}

这里肯定就编译不过了,需要强转。所以为了解决这个问题,最终使用了泛型

public abstract class Service<T> {
    
    private List<Interceptor> interceptorList;
    
    @SuppressWarnings("rawtypes")
    public abstract Map execute(T request);
    
    public List<Interceptor> getInterceptorList() {
        return interceptorList;
    }
    public void setInterceptorList(List<Interceptor> interceptorList) {
        this.interceptorList = interceptorList;
    }
}

使用泛型过后的抽象Service类就是上面这样。

这样一来就避免立刻了在代码中出现强制转换的多余的代码,当然编译器可能也是强转的。但至少自己写的代码看起来整洁多了

以上是关于怎样将从Action中拿出来的map作为参数传给一个参数为map的js函数呢?的主要内容,如果未能解决你的问题,请参考以下文章

java题:把一个map放在list里,怎样再把它拿出来

java题:把一个map放在list里,怎样再把它拿出来

SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题

怎样从jsp页面传递一个List<Map<String,Object>>的集合到Action

mybatis 集合、数组类型参数语法

jsp使用action中的map