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

Posted 变脸小伙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action相关的知识,希望对你有一定的参考价值。

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

 

 

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

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

 

 

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

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

[html] view plain copy
  1. <package name="main" extends="struts-default">  
  2.          
  3.        <global-results>  
  4.           <result name="search">/test.jsp</result>  
  5.         </global-results>  
  6.           
  7.         <action name="DoSearch" class="action.searchAciton" method="searchResult">  
  8.             <result name="success">/search.jsp</result>  
  9.             <result name="error">/nobook.jsp</result>  
  10.         </action>  
  11.       
  12.    </package>    

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

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

 

[java] view plain copy
  1. /DoSearch?sk=物理&type=title  

 

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

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

 

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

第一种:struts标签传。

 

[html] view plain copy
  1. <li>总共花费 <font color="red" ><s:text name="time"></s:text></font> ms, 找到 <font color="red" ><s:text name="count"></s:text></font>条记录</li>  

 

[html] view plain copy
  1. <s:iterator id="BookAttributes" value="booklist" >  
  2. 作者:${BookAttributes.creator}   <br />  
  3. 分类:${BookAttributes.CRC}  <br />  
  4. ISBN:${BookAttributes.ISBN}  <br />  
  5. 出版日期:${BookAttributes.date}  <br />  
  6.   <!--  do something-->  
  7. </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值:

 

[html] view plain copy
  1. <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声明导入包

 

[html] view plain copy
  1. <%@page import="org.apache.struts2.ServletActionContext"%>  

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

[javascript] view plain copy
  1. request.getAttribute()  

 

直接获得值。

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

 

[html] view plain copy
  1. <% int i = 0; %>  
  2. <s:iterator id="BookAttributes" value="booklist" >  
  3.   
  4. <%  
  5.     i ++;  
  6. %>  
  7.   
  8. </s:iterator>  


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

 

看个实例:

 

[html] view plain copy
  1. <%  
  2.     // 通过循环变量i和request,从action读取list,用java处理成正确的url。struts标签没办法做双重循环,也取不了list内的类的某个变量  
  3.     List<BookAttributesba = (ArrayList<BookAttributes>)request.getAttribute("booklist");  
  4.     String cata1 = ba.get(i).getCRC().substring(0, 1);  
  5.     String cata2 = ba.get(i).getCRC().substring(0, 2);  
  6.     String cata3 = ba.get(i).getCRC().substring(0, 3);  
  7.     String url1 = "Classify.action?CateId=" + cata1;  
  8.     String url2 = "Classify.action?CateId=" + cata2;  
  9.     String url3 = "Classify.action?CateId=" + cata3;  
  10.     i ++;  
  11.  %>  
  12.   
  13. <span id=m_fl><class="l" href=<%=url1%>>${BookAttributes.firstCat}</a>-><class="l" href=<%=url2%>>${BookAttributes.secondCat}</a>-><class="l" href=<%=url3%>>${BookAttributes.thirdCat}</a></span><br>  



 

第三种:异步json取。

这种方法在下面叙述。

 

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

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

 

[html] view plain copy
  1. <package name="test" extends="json-default">  
  2.   
  3.         <action name="ShowAddup" class="action.addupAction">  
  4.             <result type="json"></result>        
  5.         </action>  
  6.           
  7.         <action name="ShowBaidu" class="action.baiduAction">  
  8.             <result type="json"></result>        

    以上是关于前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action的主要内容,如果未能解决你的问题,请参考以下文章

    前后台交互实例二:前台通过django在数据库里面增删改查数据

    可以通过phonegap中的url传递变量吗?

    JAVA如何将本地图片变成网络URL 再把URL传给前台

    通过 var1 & var2 设置默认查询

    在 Struts 2 中在没有查询字符串的情况下在 URL 中传递参数

    伪静态问题导致前台页面无法通过地址栏访问