项目疑难杂症
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一直没有编译新的代码,而是执行另一个方法,即使我把那个方法注释掉了。
唉,耽误我两天时间,也不知道优化是好还是不好。