struts2实战:全文搜索引擎

 转载请注明出处:http://blog.csdn.net/zbf8441372
本文对自己开发的基于lucene和J2EE技术的搜索引擎开发经验进行简单总结。今后可能会从性能的角度总结lucene开发经验。当数据上TB级别后,分布式lucene以及结合分布式文件系统(如HDFS)或NoSQL等问题应该会成为我的技术关键点。而本文主要介绍struts2.0的关键特性和实践经验。

1. struts如何获得前台参数?

struts2通过struts.xml,使struts中的action或者intercepter与某一jsp对应

<package name="main" extends="struts-default">

       <global-results>
          <result name="search">/test.jsp</result>
        </global-results>

        <action name="DoSearch" class="action.searchAciton" method="searchResult">
          	<result name="success">/search.jsp</result>
          	<result name="error">/nobook.jsp</result>
        </action>

   </package>  

最简单的是前台可以是一个form表单。这个表单可以是用html的标签写,也可以是用struts的标签写。表达对应一个action,并传回一个带参数的url。

前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action如:

/DoSearch?sk=物理&type=title

这里的ActionName会在struts.xml里匹配,找到对应的action.java。

传进去的参数,如sk和type,需要在action.java里以同一名称声明,并设置getter, setter函数。区别于servlet通过request.getParameterName()的后台读取前台参数方式,struts的getter和setter将完成这些步骤。

2. 前台如何读取struts内容?

第一种:struts标签传。

<li>总共花费 <font color="red" ><s:text name="time"></s:text></font> ms, 找到 <font color="red" ><s:text name="count"></s:text></font>条记录</li>

<s:iterator id="BookAttributes" value="booklist" >
作者:${BookAttributes.creator}   <br />
分类:${BookAttributes.CRC}  <br />
ISBN:${BookAttributes.ISBN}  <br />
出版日期:${BookAttributes.date}  <br />
  <!--  do something-->
</s:iterator>

以上两种是常用的通过struts标签来传输变量到前台的方式。但是,有时候无法满足我们的需求。

比如:如何在一个iterator内,加入另一个遍历?action的两个list需要在一个遍历内输出结果,而且list里每一个对象又是一个类。

我的解决方法是用request来处理。

有几点要知道的是:

1. struts的变量是如何用标签付到前台的?

是用setter函数,或者说本质上就是request来做的。

2. 标签不是完全可以满足action变量往前台输送吗?

不是的。这里涉及到Java对象, Js对象, Action内的对象在同一个jsp页面内到底能怎样互通。每个action对应唯一一个jsp,action的标签按上面第一个问题说的,本质上是reuqest根据setter函数来回传的,同时,这个回传标签也可以赋给一个html标签的value值:

<input id="js" type=hidden value="<s:text name='sk'></s:text>" ></input>

(用hidden的原因是,这个是我藏起来让js代码去用的方式,可能比较蠢,但是很简单好操作)

但是,struts标签无法赋给js变量,无法赋给<% %>内的java变量,他永远只是个setter方法,当你的值是一个对象,比如一个List时,你这样赋的结果,就是一个list.toString()的值,对象的属性不能获取,对象在标签下就死掉了。有的人会说,那就用iterator啊。是的,但是我遇到的问题是iterator下,我需要得到两个list的遍历。

所以我的方法是结合request,把action中第二个list变量读给java,处理之后传给需要的vaue。见下文。

第二种:用request。

一般可以用struts标签传就用struts标签传。因为那是struts的特性。这种request的方式是最原始的方式。

记得要在jsp声明导入包

<%@page import="org.apache.struts2.ServletActionContext"%>

然后因为action只唯一在一个jsp里书写,所以

request.getAttribute()

直接获得值。

iterator下,我需要得到两个list的遍历的时候,我就在iterator之前,先声明一个计数值

<% int i = 0; %>
<s:iterator id="BookAttributes" value="booklist" >

<%
    i ++;
%>

</s:iterator>

这样就可以对action中任意多的list进行同时遍历,并且java代码来直接操作各种动作。

看个实例:

<%
	// 通过循环变量i和request,从action读取list,用java处理成正确的url。struts标签没办法做双重循环,也取不了list内的类的某个变量
	List<BookAttributes> ba = (ArrayList<BookAttributes>)request.getAttribute("booklist");
	String cata1 = ba.get(i).getCRC().substring(0, 1);
	String cata2 = ba.get(i).getCRC().substring(0, 2);
	String cata3 = ba.get(i).getCRC().substring(0, 3);
	String url1 = "Classify.action?CateId=" + cata1;
	String url2 = "Classify.action?CateId=" + cata2;
	String url3 = "Classify.action?CateId=" + cata3;
	i ++;
 %>

<span id=m_fl><a class="l" href=<%=url1%>>${BookAttributes.firstCat}</a>-><a class="l" href=<%=url2%>>${BookAttributes.secondCat}</a>-><a class="l" href=<%=url3%>>${BookAttributes.thirdCat}</a></span><br>

第三种:异步json取。

这种方法在下面叙述。

3. struts2如何实现异步交互?

struts配置里可以把action以json格式返回,不指定jsp页面。

<package name="test" extends="json-default">

        <action name="ShowAddup" class="action.addupAction">
        	<result type="json"></result>
        </action>

        <action name="ShowBaidu" class="action.baiduAction">
        	<result type="json"></result>
        </action>

</package>  

同时,前台可以用Ajax或者Jquery封装过的Ajax来提交url,并且在回调函数的data内获得action里所有的标量

下面代码演示了getJSON方法传参并且通过DOM或者jquery等操作把回调函数内的data里的相应变量写到js的某些特定标签内。这里面对于js,jquery的灵活操作和使用就不介绍了,例子中可以看到一些处理方式。

$.getJSON(
   		 url3 ,function(data,state){
   		 	var pagelist = data.pagelist;
   		 	var pagecontentlist = data.pagecontentlist;

   		 	var num = pagecontentlist.length;

   		 	$("#listbooks").hide();
   		 	//$("#pagecontent").innerHTML = '';
   		 	document.getElementById("pagecontent").innerHTML=" "; // 清空处理
   		 	document.getElementById("pagecontent").style.marginLeft="35px";
   		 	document.getElementById("pagecontent").style.marginRight="20px";
   		 	for (var i = 0; i < num; i ++) {
  		 		$("#pagecontent").append("<font color=blue style='font-size:13px;'><b>出现的书页在: " + pagelist[i].substring(0,7) + "页<b/></color>");
   		 		$("#pagecontent").append("<br/>");
   		 		if (pagecontentlist[i].length > 450) {
   		 			pagecontentlist[i] = pagecontentlist[i].substring(0, 450);
   		 			$("#pagecontent").append("<font color=Chocolate>该页的内容为: </font><font color=darkgrey style='font-size:12px; letter-spacing:0px;'><br />" + pagecontentlist[i] + "</color> " );
   		 			$("#pagecontent").append("<font color=LightSkyBlue style='font-size:13px;'><b><u>more(阅读全文)...</u></b></font> <br/> <br/>");

   		 		} else {

   		 		$("#pagecontent").append("<font color=lightblue>该页的内容为: </font><font color=darkgrey style='font-size:12px; letter-spacing:0px;'><br />" + pagecontentlist[i] + "</color> <br/> <br/>" );

   		 		}
   		 		yit(document.body, sk); // 再加亮下
   		 	}
   		 }
   	, "json");

jquery是js的库。提供一篇介绍比较清楚的文章, 你就可以很清楚了解到jquery可以为前台做什么:Jquery学习笔记

上面的

$.getJSON();

只是一种,其他方法详见:深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法

异步方法,第一,带来了更好的用户体验。第二,我在搜索的时候,form形式的直接传递只能处理一个action,当我需要进行搜索的同时进行别的操作,比如对搜索结果进行统计的时候,我就不能把两件事放在同一个action里做,因为统计会延时搜索结果的输出,搜索结果必定是ms内的事。这时候,就需要一个请求,对应多个action做。

当时在解决这个问题的时候,绕了很多弯路。简单的说,action唯一对应一个书写jsp,而jsp内可以有映射多个action,当然多个action可以指定写在一个jsp里。这个基本出发点一定要清晰。这样的话,异步,同步的调用,返回的结果如何在前台显示都可迎刃而解,具体各种方式我也在前面说明了。

对struts,jquery,js,ajax的使用是一边开发一边学着用的,以上是我开发过程中总结的一些使用方式和注意点。struts的action同样可以用spring的bean来管理,struts的intercepter也是一块内容,我是没有涉及到的。详见:Struts2拦截器的使用 或者大家可以查别的资料。

对struts2.0的总体使用感觉是,代码比servlet少很多,配置很灵活,各种标签需要熟练掌握,比如上面没有提到,可以用这样的方式来传递url给action:

<s:url id='url' action='Classify'>
	<s:param name="CateId" value="%{'N'}"></s:param>
</s:url>
	<s:a href="%{url}">自然科学总论</s:a>

<s:url id='url' action='Classify'>
	<s:param name="CateId" value="%{'O'}"></s:param>
</s:url>
<s:a href="%{url}">数理化</s:a>

 <s:url id='url' action='Classify'>
	<s:param name="CateId" value="%{'P'}"></s:param>
</s:url>
<s:a href="%{url}">天文、地球</s:a>

展示上的问题都克服了之后,再从性能的角度来分析lucene的使用。

最后再给一篇比较简明易懂的文章:struts2+jquery+json集成

鉴于我拙劣的表达,附上上面的几份参考资料:

Jquery学习笔记

深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法

Struts2拦截器的使用

struts2+jquery+json集成

时间: 2024-10-29 03:15:38

struts2实战:全文搜索引擎的相关文章

基于Lucene的图书全文搜索引擎

基于Lucene的图书全文搜索引擎 Baofeng Zhang@zju  转载请注明出处:http://blog.csdn.net/zbf8441372 背景介绍       这是一个关于图书的多侧面,多粒度的搜索引擎.仿照"读秀"(http://www.duxiu.com/)那样的搜索方式和搜索结果呈现方式,可以根据书的一些基本属性进行关键字搜索,展现的时候还附加进行了搜索结果的统计,也可以看到相关的全文信息.多侧面,多粒度的搜索和展示都是为了给用户更好的体验,方便用户的各种搜索需求

青云QingCloud推出Elasticsearch全文搜索引擎服务

为了进一步满足用户对纯文本搜索,以及实时数据索引.搜索和分析的需求,企业级基础云服务商青云QingCloud(qingcloud.com)日前宣布正式推出Elasticsearch分布式全文搜索引擎服务.通过Elasticsearch服务,用户能够方便地创建和管理Elasticsearch集群,支持在线横向与纵向伸缩,且用户业务的连续性不会因此而中断.此外,QingCloud还提供了丰富的监控告警等服务来帮助用户更好地管理集群. 青云QingCloud Elasticsearch服务 Elast

全文搜索引擎ElasticSearch入门教程

全文搜索 属于最常见的需求,开源的 ElasticSearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Github 都采用它. Elastic 的底层是开源库 Lucene .但是,你没法直接用 Lucene,必须自己写代码去调用它的接口.Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用. 本文从零开始,讲解如何使用 Elastic 搭建自己的全文搜索引擎.每一

番薯网推出全球首家中文图书全文搜索引擎

昨日,中文数字图书门户番薯网宣布推出全球首家中文图书全文搜索引擎.与百度提供的图书目录搜索.谷歌提供的部分章节搜索不同,番薯网可以搜索到一本书的全文.由于番薯网是方正集团与搜索引擎公司中搜网共同投资的一家网站,因此外界分析认为,这是方正集团完善其数字出版发行的关键性一环. 根据番薯网CEO赵舸介绍,目前番薯网可以销售的正版数字图书已经达到了60万册,本次推出的搜索引擎可以提供首批10万册.番薯网的图书搜索与百度.谷歌此前提供的图书搜索不同,最大的不同在于它可以搜索到图书全文.百度的图书搜索以搜索

实战中文搜索引擎推广

中介交易 SEO诊断 淘宝客 云主机 技术大厅 首先请明确搜索引擎和分类目录的区别: 1)搜索引擎(Search Engine): 通过运行一个软件,该软件不断在网络上通过域名扫描和各种链接,自动获得大量站点页面的信息,并按照一定规则归类整理,从而形成数据库,以备查询.这样的站点(获得信息==>整理建立数据库==>提供查询)我们就称之为"搜索引擎".而所使用的软件一般叫做"Spider"."Robot"."crawlers&

解读seo实战密码 搜索引擎惩罚六方面的检测

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 经常能在论坛中见到很多站长朋友提问,说网站关键词排名下降了,网站流量下降了,网站收录又少了等等之类的问题,到底是因为网站被惩罚了还是搜索引擎算法变动了呢?还是有新的强大竞争对手加入进来呢?或者是现有的竞争对手加强了seo?还是网站外链权重降低了呢?其实这些情况都是比较难准确区分的,下面王威就跟大家分享下搜索搜索引擎惩罚从六方面的检测. 1.最

【独家】RediSearch - Redis强大的搜索引擎

作者/翻译:张冬洪,Redis中国用户组主席 RediSearch简介 RediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的. 特点是:Faster, in-memory, highly available full text search (英文看着才有感觉) 项目地址:https://github.com/RedisLabsModules/RediSearch 官网:http://redisearch.io

基于JAVA技术的搜索引擎的研究与实现

搜索引擎 摘要 网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情.建立搜索引擎就是解决这个问题的最好方法.本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人.索引引擎.Web服务器三个方面进行详细的说明.为了更加深刻的理解这种技术,本人还亲自实现了一个自己的搜索引擎--新闻搜索引擎. 新闻搜索引擎是从指定的Web页面中按照超连接进行解析.搜索,并把搜索到的每条新闻进行索引后加入数据库.然后通过Web服务器接受客户端请求后从索引数据库中搜索出所匹配的新闻. 本人在介绍

第二课笔记:搜索引擎基础知识和工作原理

  大家好,我是专门从事SEO的,几个月来一直都在维护和优化按摩器排行榜www.yziyuan.com这个网站,并从中总结了很多的经验和知识.今天要分享的是<搜索引擎基础知识和工作原理>,这是最基本的概念吧, 第一部分:什么是搜索引擎? 1,定义? 官方定义: 搜索引擎是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.百度和谷歌等是搜索引擎的代表. 我的理解是: 按照搜索引擎的搜索规则去设置目标网站的