项目疑难杂症

来源:互联网 发布:促销规则 数据库设计 编辑:程序博客网 时间:2024/06/03 19:00

1、在jsp页面进行异步请求时不知道为什么访问不到资源

$.ajax({   url:'<%=request.getContextPath()%>/house/findLastPropertyPay.do',type : 'post',data : 'houseId=' + value,async : false,dataType : 'json',success : function(data) {//清空二级分类下拉框$("#startTime").html(data.lastPropertyPay);},error : function() {alert("error");}});
而houseCOntroller里的findLastPropertyPay也配置了映射路径

/** * 根据房屋id查找该房屋的最后缴费时间 */@ResponseBody  //经检查,是这个注解没有写,至于为什么,还不知道@RequestMapping(value="/findLastPropertyPay")public String findLastPropertyPay(HttpServletResponse res) throws Exception{logBefore(logger, "查找该房屋");ModelAndView mv = this.getModelAndView();PageData pd = new PageData();try {pd=this.getPageData();pd=houseService.doFindLastPropertyPay(pd);} catch (Exception e) {logger.error(e.toString(), e);}return JsonUtil.toJson(pd);}


@Responsebody与@RequestBody

@responseBody注解的使用

1、

  @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML

  数据,需要注意的呢,在使用此注解之后不会再走处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

2、  

  @RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }
  User字段:userName pwd
  那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'

  效果等同于如下代码:
  @RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }


2、根据标签是否为空,来显示或不显示日期选择器

如果根据房屋刷新出时间,则是只读,不能修改时间;若没有时间,则可以输入。

function showWdatePicker(){if($("#startTime").val()==""){WdatePicker({isShowClear:false,readOnly:true,dateFmt:'yyyy-MM-dd'});}}
最开始这样写,判断startTime这个标签是否为空,若为空,则可以弹出时间选择器;但是这样有个问题,一旦选择之后,标签不为空,就不可以再修改了,即只能输入一次。

所以,应该从返回的数据出发,去判断异步刷新返回的数据是否为空。而此时,则要用到全局变量。

$.ajax({   url:'<%=request.getContextPath()%>/house/findLastPropertyPay.do',type : 'post',data : 'houseId=' + value,async : false,dataType : 'json',success : function(data) {//清空二级分类下拉框$("#startTime").val(data.startTime);test=data.startTime;},error : function() {alert("error");}});


function showWdatePicker(){if(test==null){WdatePicker({isShowClear:false,readOnly:true,dateFmt:'yyyy-MM-dd'});}} 

但是到了房屋管理里新增缴费时,却又不行了,并且也分为第一次缴费和缴过费的

var startTimeValue=null;//定义一个js全局变量,用于在两个函数直接传值


$.ajax({   url:'<%=request.getContextPath()%>/house/findLastPropertyPay.do',type : 'post',data : 'houseId=' + value,async : false,dataType : 'json',success : function(data) {//清空二级分类下拉框$("#startTime").val(data.startTime);startTimeValue=data.startTime;},error : function() {alert("error");}});

同时在controller里添加一个变量传递过来
mv.addObject("from", "addByHouseId");

//如果来自房屋管理页面,若没有缴费记录,则可以点击出日期选择框;否则没有。//如果来自物业缴费页面,若没有缴费记录,则可以点击出日期选择框;否则没有。注意两个判断为空的方式,一个是空字符串,一个是nullfunction showWdatePicker(){var from="${from}";var pdTime="${pd.startTime}";if( from==""&& startTimeValue==null){//不知道为啥,即使在开始定义startTimeValue时定义为空字符串,如果在物业缴费页面没有时间值,startTimeValue会变成nullWdatePicker({isShowClear:false,readOnly:true,dateFmt:'yyyy-MM-dd'});}if(from=="addByHouseId" && pdTime==""){WdatePicker({isShowClear:false,readOnly:true,dateFmt:'yyyy-MM-dd'});}} 


最开始错误最低级,是把别人的代码搬过来,却没注意到别人的是select标签,而我这个是input标签。误用成下拉框的,导致一直没出来结果。

var obj = document.getElementById("BUILDING5_IDs"); //定位idvar index = obj.selectedIndex; // 选中索引var value = obj.options[index].value;var text = obj.options[index].text;if (text=="请选择") {$("#startTime").val("");return false;}

}

3、不知道为什么总是执行另一个方法,断点也没效果,而且后面代码跟没执行一样,但是控制台又显示出执行结果。

原因:因为之前为了提速,优化eclipse,将eclipse的自动编译取消了,导致eclipse一直没有编译新的代码,而是执行另一个方法,即使我把那个方法注释掉了。

唉,耽误我两天时间,也不知道优化是好还是不好。