欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

项目疑难杂症

程序员文章站 2022-06-01 15:52:24
...

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");

//如果来自房屋管理页面,若没有缴费记录,则可以点击出日期选择框;否则没有。
//如果来自物业缴费页面,若没有缴费记录,则可以点击出日期选择框;否则没有。注意两个判断为空的方式,一个是空字符串,一个是null
function showWdatePicker(){		
	var from="${from}";
	var pdTime="${pd.startTime}";
	if( from==""&& startTimeValue==null){	//不知道为啥,即使在开始定义startTimeValue时定义为空字符串,如果在物业缴费页面没有时间值,startTimeValue会变成null
		WdatePicker({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"); //定位id
	var 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一直没有编译新的代码,而是执行另一个方法,即使我把那个方法注释掉了。

唉,耽误我两天时间,也不知道优化是好还是不好。项目疑难杂症项目疑难杂症