0 0

初学DWR不是很懂,页面上显示undefined5


页面上显示的是undefined,主要是DWR没学过,还有setAttribute('id','info'+list[i]);appendChild(ele);innerHTML这些用法不是很清楚
到底是哪里出错了,照我的理解应该会显示出我需要的结果的啊,标题加内容
核心代码:
var request;
var minpage;
var maxpage;
var startindex;
var hasnext;

function doSearch(type){
	var result=document.getElementById("result");
	var pagingdiv=document.getElementById('paging');
	result.innerHTML="";
	pagingdiv.innerHTML="";
	
	if(type!='paging'){
		var startindexinput=document.getElementById('startindex');
		startindexinput.value="1";
	}
	
	request={startindex:1,query:""};
	DWRUtil.getValues(request);
	
	searchService.getSearchResults(request,fillPage);
}

function fillPage(data){
	var ID=data.id;
	var URL=data.url;
	var TITLE=data.title;
	var CONTENT=data.content;
	var resultdiv=document.getElementById('result');
	var pagingdiv=document.getElementById('paging');
	
	resultdiv.innerHTML="";
	pagingdiv.innerHTML="";
	
	if(ID.length==0){
		resultdiv.innerHTML="<span>sorry, we can't find what you want...</span>";
		return;
	}
	
	for(var i=0;i<ID.length;i++){
		var ele=document.createElement('div');
		//ele.setAttribute('id','info'+list[i]);
		ele.setAttribute('id','info');
		ele.innerHTML="<span>loading..</span>";
		resultdiv.appendChild(ele);
		var result=document.getElementById('info');
		//result.innerHTML="<font color=\"#0033CC\">" + data.title + "</font><br /><a href=\"" + data.url + "\">"
		result.innerHTML="<a href=\"" + URL[i] + "\">"
		+"<font color=\"#0033CC\">" + TITLE[i] + "</font></a><br /><font color=\"#008000\">" + CONTENT[i] + "</font><br /><br /><br />";
		//searchService.getSearchResultById(list[i],fillDetailResult);
		resultdiv.appendChild(result);
	}

public SearchResults getSearchResults(SearchRequest request){
		SearchResults results=new SearchResults();
		Query query=makeQuery(request.getQuery());
		
		List <String>id=new ArrayList<String>();//id+title+url+content
		List<String>title=new ArrayList<String>();
		List <String>url=new ArrayList<String>();
		List <String>content=new ArrayList<String>();
		
		try{
			IndexSearcher searcher=new IndexSearcher(INDEX_STORE_PATH);
			Hits hits=searcher.search(query);
			int length=hits.length();
			int startindex=request.getStartindex();
			int endindex;
			if(startindex>length)
			{
				//不可能
			}
			else{
				endindex=startindex+9;
				if(endindex>=length){
					endindex=length;
				}
				for(int i=startindex;i<=endindex;i++){
					Document doc =hits.doc(i-1);
					String pageid=doc.get("pageid");
					String pagetitle=doc.get("title");
					String pageurl=doc.get("url");
					String pagecontent=choose(doc.get("content"),request.getQuery());
					id.add(pageid);
					title.add(pagetitle);
					url.add(pageurl);
					content.add(pagecontent);
				}
			}
			results.setId(id);
			results.setTitle(title);
			results.setUrl(url);
			results.setContent(content);
			int startpage;
			int endpage;
			if(startindex%100==0){
				startpage=(startindex/100-1)*10+1;
			}
			else{
				startpage=(startindex/100)*10+1;
			}
			int span;
			int hasnext;
			
			float temp=((float)(length-(startpage-1)*10))/10;
			if(temp>10)
			{
				span=9;
				hasnext=1;
			}
			else if(temp==10){
				span=9;
				hasnext=0;
			}
			else{
				hasnext=0;
				if((int)temp<temp){
					span=(int)temp;
				}
				else{
					span=(int)temp-1;
				}
			}
			endpage=startpage+span;
			
			results.setMinpage(startpage);
			results.setMaxpage(endpage);
			results.setHasnext(hasnext);
			results.setStartindex(startindex);
		}catch(Exception e){
			e.printStackTrace();
		}
		return results;
	}

问题补充:
redstarofsleep 写道
回调函数进去了吗?alert过吗,这些值都拿到了吗?
引用

var ID=data.id; 
    var URL=data.url; 
    var TITLE=data.title; 
    var CONTENT=data.content; 

---------------------
回调函数进去了的,alert的话,只有ID有值,其他有框没内容

问题补充:
redstarofsleep 写道
回调函数进去了吗?alert过吗,这些值都拿到了吗?
引用

var ID=data.id; 
    var URL=data.url; 
    var TITLE=data.title; 
    var CONTENT=data.content; 

--------------------------------
难到说是 list 里面不能放很长的String?

问题补充:
alert(ID)出现的不是id是

问题补充:
redstarofsleep 写道
DWR的返回值可以是String,List<String>,Map<String,String>这类的,你直接传回对象,可能会有问题


那主要的代码也在了,我实在找不出问题所在了,麻烦帮忙看看,改改

问题补充:那alert(ID)怎么不是id啊,问题出在哪呢?

问题补充:
redstarofsleep 写道
你把你那个对象换成Map的形式传回页面
然后用data['content']的方式取值


把title url content都改成Map? id当key?

问题补充:这个是results
package com.searcher.bo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SearchResults {
	private List <String>id=new ArrayList<String>();//id+title+url+content
	private List <String>title=new ArrayList<String>();
	private List <String>url=new ArrayList<String>();
	private List <String>content=new ArrayList<String>();
	
	/*Map <String,String>title=new HashMap<String,String>();
	Map <String,String>url=new HashMap<String,String>();
	Map <String,String>content=new HashMap<String,String>();
	*/
	private int startindex;
	private int minpage;
	private int maxpage;
	private int hasnext;

	public int getStartindex() {
		return startindex;
	}
	public void setStartindex(int startindex) {
		this.startindex = startindex;
	}
	public int getMinpage() {
		return minpage;
	}
	public void setMinpage(int minpage) {
		this.minpage = minpage;
	}
	public int getMaxpage() {
		return maxpage;
	}
	public void setMaxpage(int maxpage) {
		this.maxpage = maxpage;
	}
	public int getHasnext() {
		return hasnext;
	}
	public void setHasnext(int hasnext) {
		this.hasnext = hasnext;
	}
	public List<String> getId() {
		return id;
	}
	public void setId(List<String> id) {
		this.id = id;
	}
	/*public Map<String, String> getTitle() {
		return title;
	}
	public void setTitle(Map<String, String> title) {
		this.title = title;
	}
	public Map<String, String> getUrl() {
		return url;
	}
	public void setUrl(Map<String, String> url) {
		this.url = url;
	}
	public Map<String, String> getContent() {
		return content;
	}
	public void setContent(Map<String, String> content) {
		this.content = content;
	}*/
	public List<String> getTitle() {
		return title;
	}
	public void setTitle(List<String> title) {
		this.title = title;
	}
	public List<String> getUrl() {
		return url;
	}
	public void setUrl(List<String> url) {
		this.url = url;
	}
	public List<String> getContent() {
		return content;
	}
	public void setContent(List<String> content) {
		this.content = content;
	}
}

问题补充:
redstarofsleep 写道
你把你那个对象换成Map的形式传回页面
然后用data['content']的方式取值


兄台,麻烦给个示例啊,第一次接触DWR啊
getSearchResults方法返回的是results,
results我后面补充了他的代码,是个bean吧
bean里面有list这种数据

你说把那个对象换成Map的形式传回页面,具体怎么做啊,给个示例吧

问题补充:
redstarofsleep 写道
引用

private List <String>id=new ArrayList<String>();//id+title+url+content 
    private List <String>title=new ArrayList<String>(); 
    private List <String>url=new ArrayList<String>(); 
    private List <String>content=new ArrayList<String>();


你如果要让DWR能认出你的Java对象,那需要在DWR里面配置的。。
DWR直接能认出来的就是Java已经内置的几个对象String,Integer等,或者是这些对象的集合,List,Map

所以,这四个参数可以封装成Map<String,List<String>>,或者是List<List<String>>,这样的Javascript可以直接解析

-------------------------------------------------
那我int型的数据怎么办?private int startindex;  
    private int minpage;  
    private int maxpage;  
    private int hasnext; 

问题补充:
redstarofsleep 写道
单个的值也可以封装成长度为一的List嘛


有取int型的,定义在最上面 我就没复制下来了,还要做运算的,分页用的
int startpage;   
            int endpage;   
            if(startindex%100==0){   
                startpage=(startindex/100-1)*10+1;   
            }   
            else{   
                startpage=(startindex/100)*10+1;   
            }   
            int span;   
            int hasnext;   
               
            float temp=((float)(length-(startpage-1)*10))/10;   
            if(temp>10)   
            {   
                span=9;   
                hasnext=1;   
            }   
            else if(temp==10){   
                span=9;   
                hasnext=0;   
            }   
            else{   
                hasnext=0;   
                if((int)temp<temp){   
                    span=(int)temp;   
                }   
                else{   
                    span=(int)temp-1;   
                }   
            }   
            endpage=startpage+span;   
               
            results.setMinpage(startpage);   
            results.setMaxpage(endpage);   
            results.setHasnext(hasnext);   
            results.setStartindex(startindex);   

问题补充:
redstarofsleep 写道
public Map<String,List<String>> getSearchResults(SearchRequest request){
List<String> startindexList = new ArrayList<String>();
startindexList.add(Integer.toString(startindex));
map.put("startIndex",startindexList);
} 
这样子不行吗?

好复杂的说!!!!!!!不过意思明白了,先吃饭,谢谢啊

问题补充:
redstarofsleep 写道
public Map<String,List<String>> getSearchResults(SearchRequest request){
List<String> startindexList = new ArrayList<String>();
startindexList.add(Integer.toString(startindex));
map.put("startIndex",startindexList);
} 
这样子不行吗?


我修改了,结果还是那样啊,如图!!!!
package com.searcher.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;

import com.searcher.bo.SearchRequest;
import com.searcher.bo.SearchResult;
import com.searcher.bo.SearchResults;
import com.searcher.config.PropertyConfiguration;
import com.searcher.service.SearchService;
import com.searcher.service.dao.SearchResultDao;

public  class SearchServiceImpl implements SearchService{
	/*private static final String PAGE_ID="pageid";
	//private static final String INDEX_TIME="indextime";
	private static final String PAGE_URL="pageurl";
	private static final String PAGE_CONTENT="";*/
	private static final String INDEX_STORE_PATH=PropertyConfiguration.getIndexStorePath();
	private SearchResultDao searchResultDao;
	
	public Map<String,List<String>>  getSearchResults(SearchRequest request){
		//SearchResults results=new SearchResults();
		
		List<String> id=new ArrayList<String>();//id+title+url+content
		List<String> title=new ArrayList<String>();
		List<String> url=new ArrayList<String>();
		List<String> content=new ArrayList<String>();
		
		List<String> startpageList=new ArrayList<String>();
		List<String> endpageList=new ArrayList<String>();
		List<String> hasnextList=new ArrayList<String>();
		List<String> startindexList=new ArrayList<String>();

		Map<String,List<String>> map=new HashMap<String,List<String>>();
		
		try{
			IndexSearcher searcher=new IndexSearcher(INDEX_STORE_PATH);
			Hits hits;
			if(request.getQuery().indexOf(" ")!=-1){
				BooleanQuery query1=makeBooleanQuery(request.getQuery());
				hits=searcher.search(query1);
			}
			else{
				Query query2=makeQuery(request.getQuery());
				hits=searcher.search(query2);
			}
			//Hits hits=searcher.search(query2);
			int length=hits.length();
			int startindex=request.getStartindex();
			int endindex;
			if(startindex>length)
			{
				//不可能
			}
			else{
				endindex=startindex+9;
				if(endindex>=length){
					endindex=length;
				}
				for(int i=startindex;i<=endindex;i++){
					Document doc =hits.doc(i-1);
					String pageid=doc.get("pageid");
					String pagetitle=doc.get("title");
					String pageurl=doc.get("url");
					String pagecontent=choose(doc.get("content"),request.getQuery());
					id.add(pageid);
					title.add(pagetitle);
					url.add(pageurl);
					content.add(pagecontent);
				}
			}
			//results.setId(id);
			//results.setTitle(title);
			//results.setUrl(url);
			//results.setContent(content);
			map.put("id",id);
			map.put("title",title);
			map.put("url",url);
			map.put("content",content);
			int startpage;
			int endpage;
			if(startindex%100==0){
				startpage=(startindex/100-1)*10+1;
			}
			else{
				startpage=(startindex/100)*10+1;
			}
			int span;
			int hasnext;
			
			float temp=((float)(length-(startpage-1)*10))/10;
			if(temp>10)
			{
				span=9;
				hasnext=1;
			}
			else if(temp==10){
				span=9;
				hasnext=0;
			}
			else{
				hasnext=0;
				if((int)temp<temp){
					span=(int)temp;
				}
				else{
					span=(int)temp-1;
				}
			}
			endpage=startpage+span;
			startindexList.add(Integer.toString(startindex));
			endpageList.add(Integer.toString(endpage));
			hasnextList.add(Integer.toString(hasnext));
			startpageList.add(Integer.toString(startpage));
			map.put("startpage",startpageList);
			map.put("endpage", endpageList);
			map.put("hasnext", hasnextList);
			map.put("startindex", startindexList);
			//results.setMinpage(startpage);
			//results.setMaxpage(endpage);
			//results.setHasnext(hasnext);
			//results.setStartindex(startindex);
		}catch(Exception e){
			e.printStackTrace();
		}
		//return results;
		return map;
	}
	
	public SearchResult getSearchResultById(int id){
		return searchResultDao.getSearchResultById(id);
	}

	public SearchResultDao getSearchResultDao(){
		return searchResultDao;
	}
	
	public void setSearchResultDao(SearchResultDao searchResultDao){
		this.searchResultDao=searchResultDao;
	}
	
	private Query makeQuery(String keys) {//可扩展	
		TermQuery qu=new TermQuery(new Term("all",keys.toLowerCase()));
		return qu;
	}
	
	private BooleanQuery makeBooleanQuery(String keys) {//可扩展	
			String[] que = keys.split(" ");
			BooleanQuery query = new BooleanQuery();
			int length = que.length;
			TermQuery[] term = new TermQuery[length];
			for(int i = 0; i < length; i++){
				term[i] = new TermQuery(new Term("all", que[i].toLowerCase()));
		        query.add(term[i], BooleanClause.Occur.MUST);
			}
			return query;
	}
	
	private String choose(String content,String keys){
		/*String summary="";
		int count=100;
		int summaryStart = content.indexOf(query) + query.length();
		int summaryEnd = summaryStart + count;
		 if(summaryEnd > content.length()){
			 summaryEnd = content.length();
		 }
		 //if("".equals(summary)){
			 summary = "<font color=\"#FF0000\">" + query + "</font>" + content.substring(summaryStart, summaryEnd);
		// }
		// else{
		//	 summary = summary + "..." + "<font color=\"#FF0000\">" + query + "</font>" + content.substring(summaryStart, summaryEnd);
		 //}
		return summary;*/
   	 content = content.replace(" ", "");  
	 content = content.replace("&nbsp;", " ");
	 String summary = "";
	 String[] k = keys.split(" ");
	 int maxChar = 100;
	 int l = k.length;
	 int summaryStart = 0;
	 int summaryEnd = 0;
	 // 单关键字
	 if(l == 1){
		 summaryStart = content.indexOf(k[0]) + k[0].length();
		 summaryEnd = summaryStart + maxChar;
		 if(summaryEnd > content.length()){
			 summaryEnd = content.length();
		 }
		 summary = content.substring(summaryStart, summaryEnd);
		 // 将关键字置位红色
		 summary = "<font color=\"#FF0000\">" + k[0] + "</font>" + summary;
	 }
	 // 多关键字
	 else{
		 int count = maxChar / l;
		 if(count < 5){
			 count = 5;
		 }
		 for(int j = 0; j < l; j++){
			 summaryStart = content.indexOf(k[j]) + k[0].length();
			 summaryEnd = summaryStart + count;
			 if(summaryEnd > content.length()){
    			 summaryEnd = content.length();
    		 }
			 if("".equals(summary)){
				 summary = "<font color=\"#FF0000\">" + k[j] + "</font>" + content.substring(summaryStart, summaryEnd);
			 }
			 else{
				 summary = summary + "..." + "<font color=\"#FF0000\">" + k[j] + "</font>" + content.substring(summaryStart, summaryEnd);
			 }
			 
		 }
	 }
	 return summary;
	}
}

function fillPage(data){
	var ID=data['id'];
	var URL=data['url'];
	alert(URL);
         ..........
         }






问题补充:
redstarofsleep 写道
你看下data的length呢
另外,因为map里放的是List,所以data['url']这样的如果有数据的话,也是个数组啊

-----------------
能远程么,帮忙看看啊

问题补充:
redstarofsleep 写道
你看下data的length呢
另外,因为map里放的是List,所以data['url']这样的如果有数据的话,也是个数组啊


因为map里放的是List,所以data['url']这样的如果有数据的话,也是个数组啊。。。。。。。。。。。。。。。。。。。。。。具体呢?示例下

问题补充:
redstarofsleep 写道
你看下data的length呢
另外,因为map里放的是List,所以data['url']这样的如果有数据的话,也是个数组啊

data['url'][i]这里面还是没有数据啊

问题补充:
redstarofsleep 写道
你看下data的length呢
另外,因为map里放的是List,所以data['url']这样的如果有数据的话,也是个数组啊

---------------
还有个问题,我返回的是map吧,里面我压根就没minpage和maxpage,他居然有值,下面的代码,最后几行
function fillPage(data){
	//var ID=data.results.id;
	var ID=data['id'];
	var URL=data['url'];
	var TITLE=data['title'];
	var CONTENT=data['content'];
	
	alert(data.startpage);
	//alert(URL);
	//alert(data.id)
	//alert(TITLE);
	//alert(CONTENT);
	//var URL=ID.url;
	var resultdiv=document.getElementById('result');
	var pagingdiv=document.getElementById('paging');
	
	resultdiv.innerHTML="";
	pagingdiv.innerHTML="";
	
	if(ID.length==0){
		resultdiv.innerHTML="<span>sorry, we can't find what you want...</span>";
		return;
	}
	
	for(var i=0;i<ID.length;i++){
		//alert(URL[i]);
		var ele=document.createElement('div');
		//ele.setAttribute('id','info'+list[i]);
		ele.setAttribute('id','info');
		ele.innerHTML="<span>loading..</span>";
		resultdiv.appendChild(ele);
		var result=document.getElementById('info');
		//result.innerHTML="<font color=\"#0033CC\">" + data.title + "</font><br /><a href=\"" + data.url + "\">"
		//result.innerHTML="<a href=\"" + URL[i] + "\">"
		//+"<font color=\"#0033CC\">" + TITLE[i] + "</font></a><br /><font color=\"#008000\">" + CONTENT[i] + "</font><br /><br /><br />";
		//searchService.getSearchResultById(list[i],fillDetailResult);
		result.innerHTML=TITLE[i];
		resultdiv.appendChild(result);
	}
	
	[color=red]minpage=data.minpage;
	maxpage=data.maxpage;
	//minpage=data.startpage;//这个和下面的反而是undefined
	//maxpage=data.endpage;[/color]	startindex=data.startindex;
	hasnext=data.hasnext;

问题补充:
redstarofsleep 写道
应该是对的undefined是未定义,也就是根本就没有这个属性。
打印的是空的,才是有这个属性

那怎么会没属性呢?我在看书中。。。详细理解下DWR吧
看到一个例子,用来画表格的,不过他是用DWRUtil.addRows方法的,我再看看其他例子,学习学习看,原先JS只是接触过,没深入,要用到,只能补啦,不过现在稍微了解起来了,再看看,应该能解决吧

问题补充:
redstarofsleep 写道
应该是对的undefined是未定义,也就是根本就没有这个属性。
打印的是空的,才是有这个属性


把帮助文档看完了,还是不知道问题在哪。。。配置也应该是没错的啊

问题补充:
redstarofsleep 写道
应该是对的undefined是未定义,也就是根本就没有这个属性。
打印的是空的,才是有这个属性

这个是alert出的结果

DWR 
2011年8月07日 10:45
  • 大小: 10.1 KB
  • 大小: 25.3 KB
  • 大小: 5.1 KB
  • 大小: 18 KB

10个答案 按时间排序 按投票排序

0 0

采纳的答案

应该是对的undefined是未定义,也就是根本就没有这个属性。
打印的是空的,才是有这个属性

2011年8月08日 15:11
0 0

你看下data的length呢
另外,因为map里放的是List,所以data['url']这样的如果有数据的话,也是个数组啊

2011年8月08日 13:23
0 0

public Map<String,List<String>> getSearchResults(SearchRequest request){
List<String> startindexList = new ArrayList<String>();
startindexList.add(Integer.toString(startindex));
map.put("startIndex",startindexList);
} 
这样子不行吗?

2011年8月08日 11:23
0 0

单个的值也可以封装成长度为一的List嘛

2011年8月08日 11:08
0 0

引用

var ID=data.id; 
    var URL=data.url; 
    var TITLE=data.title; 
    var CONTENT=data.content; 

你从data中并没有取int型的参数啊,取的这4个都是List

2011年8月08日 11:07
0 0

引用

private List <String>id=new ArrayList<String>();//id+title+url+content 
    private List <String>title=new ArrayList<String>(); 
    private List <String>url=new ArrayList<String>(); 
    private List <String>content=new ArrayList<String>();


你如果要让DWR能认出你的Java对象,那需要在DWR里面配置的。。
DWR直接能认出来的就是Java已经内置的几个对象String,Integer等,或者是这些对象的集合,List,Map

所以,这四个参数可以封装成Map<String,List<String>>,或者是List<List<String>>,这样的Javascript可以直接解析

2011年8月08日 10:45
0 0

引用
把title url content都改成Map? id当key?


不是这个意思。

你的DWR方法:public SearchResults getSearchResults(SearchRequest request){}

不要返回SearchResults这个对象,返回一个Map<String,String>的类型

map.put("ID",xxx);
map.put("URL",XXX);

页面获取值就是data['ID']

2011年8月08日 10:37
0 0

你把你那个对象换成Map的形式传回页面
然后用data['content']的方式取值

2011年8月08日 08:59
0 0

DWR的返回值可以是String,List<String>,Map<String,String>这类的,你直接传回对象,可能会有问题

2011年8月08日 08:18
0 0

回调函数进去了吗?alert过吗,这些值都拿到了吗?

引用

var ID=data.id; 
    var URL=data.url; 
    var TITLE=data.title; 
    var CONTENT=data.content; 

2011年8月07日 14:36

相关推荐

Global site tag (gtag.js) - Google Analytics