前台的url通过 ActionName?var1=xxvar2=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对应
- <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集成
- <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集成
转载于:https://www.cnblogs.com/paper-file/p/6917277.html
前台的url通过 ActionName?var1=xxvar2=yy 的形式传给特定action相关推荐
- 从后台传给前台的url字符串值的注意事项
οnclick="javascript:alert('./servicewarranty/ServiceMan.aspx?Area=<%= AreaId.ToString()%> ...
- 上传图片到linux返回url,Springboot 将前端传递的图片上传至Linux服务器并返回图片的url(附源码)...
问题由来: 用户个人信息需要添加头像功能 当前端程序是微信小程序时,前端将直接将图片 url 传送至服务端 但是当前端是 Web 页面时,前端传递的参数是一张图片,服务端需要将图片保存至 Linux ...
- mvc4 ajax url参数,MVC4.0中Ajax通过a标签向后台Action传递参数问题?
Ajax: $(document).ready(function dianZan(id,dianZan){ $.ajax({ url :"Home/DianZan", type:& ...
- url传递html字符串,将Selenium HTML字符串传递给Scrapy以将url添加到Scrapy的url列表中...
我对Python,Scrapy和Selenium还很陌生.因此,如果您能提供任何帮助,我们将不胜感激.在 我希望能够将从Selenium获得的HTML作为页面源,并将其处理为一个糟糕的响应对象.主要原 ...
- ajax前台multipartfile,在SpringBoot中使用Ajax方式MultipartFile上传失败
虽然在正常的html和表单方式下上传效果很好,但是切换到ajax却失败了,并且在调试模式下MultipartFile总是Null. code below works fine //html code ...
- java get请求 数组_GET方式请求的url参数如果是数组,该形式/base/get?foo[]=barfoo[]=baz'报错......
GET 方式请求的url参数如果是数组的话,url为什么要转成这种形式: /base/get?foo[]=bar&foo[]=baz' 而不是这种形式呢? /base/get?foo=bar& ...
- 微信公众号第三方登录window.open打开新窗口和url携带http网址参数base64转码传参
原文链接:https://dsx2016.com/?p=1109 公众号:大师兄2016 需求场景 微信第三台平台只能绑定一个域名. 当从另一个域名下的系统进行绑定操作时,只能以打开指定域名的方式进行 ...
- 关于java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 实体类
由于业务逻辑的复杂,有些sql语句写法hql不支持,所以hibernate查询直接用了sql原生查询,由于数据结果根据四个表查询出来,所以无法使用方法.addEntity(XXXXXXX.class) ...
- Magento去除前台URL中显示的index.php
Magento安装完毕之后,我们会发现无论是在产品还是分类的URL地址之前,都有一个非常恶心的index.php.这种URL格式自己看着不 爽,搜索引擎看着也不爽.如何把index.php从前台的UR ...
最新文章
- C/C++语言编程的隐患!
- 查理芒格+终身学习+你的认知就是你的财富的边界
- b区计算机考研招不满的大学,B区又一所院校招收大量调剂!一志愿不满!
- 如何快速创建程序组_如何快速开发小程序
- docker yml mysql_Docker安装Mysql(docker-compose.yml)
- 卸载利器IObit Uninstaller Portable v9.4.0.20绿化版
- Core DES加、解密
- 《JavaScript面向对象精要》——1.2 原始类型
- 奇妙的证明 —— 0! = 1(a^0=1)
- Java 删除文件 被占用 已解决
- 易语言学习笔记(1)
- 【深度学习--图像分类】imageAI自定义模型训练
- Intel CPU平台和架构介绍
- Latex algorithm Input Output
- Excel图形转入CorelDRAW技巧
- dparsf是什么_老师,我用DPARSF做Slice Timeing时老报错,请问您是什么原因呢?
- 数据中台建设(三):数据中台架构介绍
- 【前端】【JavaScript】通过成绩判断等级
- 解决No converter for [class java.util.ArrayList] with preset Content-Type ‘null‘问题
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据