Struts2的Ajax的学习

Struts2中实现Ajax技术的全面指南 本文还有配套的精品资源,点击获取 简介:Struts2是一个Java Web框架,支持MVC架构,而Ajax技术能够实现无刷新页面交互,提升用户体验。本文将指导如何在Struts2框架中集成和应用Ajax技术,包括理解Struts2工作原理、通过引入jQuery库简化Ajax使用、创建和配置处理Ajax请求的Action类,以及通过配置文件和回调函数处理Ajax响应。同时,... 阅读详情

今天学习了Struts2的Ajax,当然看的也是别人的教程,看后感觉Struts的Ajax的封装后的标签使用十分好用,我简单的理一下学习的顺序:
一、首先Struts2的Ajax引用了Dojo和DWR这两个JS框架。
而且Struts很好的封装了他们,在引用时需要添加jar包(struts2-dwr-plugin-2.3.4.jar和struts2-dojo-plugin-2.3.4.jar)
这两个jar包导入后就可以在JSP页面上引用Struts的Ajax标签:<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
然后dojo提供了一些列的Ajax控件,当然我们最常用的还是<sx:a />和<sx:submit/>以及<sx:div />等标签。下面我贴一下系列文章<研磨Struts2>系列文章的例子。

14.3  Ajax JSP tags

14.3.1概述

为了使开发Ajax变得轻松惬意,Struts2提供了一些JSP Tags,通过这些自定义的标签库,使得开发人员无需掌握额外的知识即可开发Ajax的应用。

       从Struts2.1开始,不再推荐使用Dojo的Plugin,而是改用Ajax的tags,包括:

  • head:用来下载Dojo文件和相应的Javascript代码
  • div:用来动态的加载并展示html内容
  • a:展示为Html的超链接形式,点击后触发一个Ajax的请求
  • submit:展示为Html的按钮形式,点击后可触发异步提交
  • bind:用来关联事件和对应的事件处理程序
  • datetimepicker:日历组件
  • autocompleter:能实现自动完成的功能,类似于搜索框的自动完成功能
  • textarea:一个复杂的文本编辑器组件
  • tabbedpanel:一个显示多页面tab面板的组件
  • tree:一个在页面上展示为树的组件
  • treenode:用来展示为树中节点的组件

要使用Struts2.1的Ajax Tags,需要做以下的工作:

       1:把Dojo插件,也就是struts2-dojo-plugin-2.1.8.1.jar文件,复制到WEB-INF/lib文件夹下

       2:在页面上增加taglib的引用,<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>

       3:在每个页面的顶部包含head标签

       好了,基本的知识就了解到这里,接下来看看具体如何使用Struts2的Ajax tags。

14.3.2 head标签

1:功能

head标签的地位比较特殊,它的功能是用来下载Dojo文件和相应的Javascript代码,因此所有其他使用Dojo标签的页面都应该包含这个标签。

2:属性

head标签的属性有:

建议大家在开发期间,把compressed设置为false,debug设置为true,这样方便大家调试程序;但是在交付给客户的时候,应该把compressed设置为true,debug设置为false,这样可以加快程序的运行。

3:使用示例

在开发期间使用head标签,大致应为:

 

java代码:
  1. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  2. <head>  
  3.    <sx:head debug="true" extraLocales="en-us,nl-nl,de-de"/>  
  4. </head>  

在运行期间使用head标签,大致应为:

 

java代码:
  1. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  2. <head>  
  3.   <sx:head/>  
  4. </head>  

14.3.3 div标签

1:功能

div标签展示为html中的Div元素,但是div标签能够异步的、动态的加载需要展示的内容,而且div标签还提供一个内部的计时器,可以循环的在设定的时间点去重新加载需要展示的内容。

2:属性

div标签的属性很多,这里罗列一些常用的:



3:使用示例

div标签的使用是非常简单的,来通过一个示例进行说明,实现的功能非常简单,就是通过div来异步显示Action返回的信息。

(1)先看看action的实现,只是简单的返回了一个信息,非常简单,示例代码如下:

 

java代码:
  1. public class AjaxServerAction extends ActionSupport {  
  2.     private InputStream inputStream;  
  3.     public InputStream getInputStream() {  
  4.         return inputStream;  
  5.     }  
  6.       
  7.     public String execute() throws Exception {  
  8.         Thread.sleep(3000L);  
  9.         inputStream = new ByteArrayInputStream("这是一个div的测试".getBytes("utf-8"));  
  10.         return this.SUCCESS;  
  11.     }  
  12. }  

(2)相应的struts.xml配置如下:

 

java代码:
  1. <action name="ajaxServerAction" class="cn.javass.ajax.AjaxServerAction">  
  2.             <result  type="stream">  
  3.                 <param name="contentType">text/html</param>  
  4.                 <param name="inputName">inputStream</param>  
  5.             </result>  
  6. </action>  

(3)然后来看看页面的实现,主要就是div标签的基本使用了,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <head>  
  5.   <sx:head/>  
  6. </head>  
  7. <sx:div  
  8.     href="ajaxServerAction.action"  
  9.     showLoadingText="true"  
  10.     loadingText="正在加载内容,请稍候"  
  11.     errorText="对不起,加载资源失败,请重试"  
  12. >  
  13. </sx:div>  

(4)去运行测试一下看看,刚开始运行应该如下图所示:

图14.3  Div标签示例开始页面

       然后在3秒后,Action运行完成并返回内容,此时应该如下图所示:

图14.4  Div标签示例结果页面

14.3.4 a标签和submit标签

1:功能

a标签和submit标签的功能是类似的,都能够发起一个Ajax请求,只不过a标签展示为html中的a元素,而submit标签展示成为按钮的形式。

两个元素都有一个target的属性,用来指定显示Ajax响应后的信息的元素,通常是一个div元素。

2:属性

a标签和submit标签的属性也很类似,两个标签都有的常用属性有:



当然也有一些不同的元素,除了上面这些共同的元素,a标签自有的元素有:

submit标签自有的元素有:

3:使用示例

(1)对Action稍作修改,让它接收页面传递的参数,示例代码如下:

 

java代码:
  1. public class AjaxServerAction extends ActionSupport {  
  2.     public String account;  
  3.     public String name;  
  4.       
  5.     private InputStream inputStream;  
  6.     public InputStream getInputStream() {  
  7.         return inputStream;  
  8.     }  
  9.       
  10.     public String execute() throws Exception {  
  11.         System.out.println("接收的参数,帐户="+account+",姓名="+name);  
  12.         if(account!=null && account.indexOf("test")>=0){  
  13.             inputStream = new ByteArrayInputStream("这是一个A标签的测试".getBytes("utf-8"));  
  14.         }else{  
  15.             inputStream = new ByteArrayInputStream("这是一个Submit的测试".getBytes("utf-8"));  
  16.         }  
  17.         return this.SUCCESS;  
  18.     }  
  19. }  

(2)struts.xml的配置没有改变,就不去赘述了

(3)页面也需要发生一些改变,要做一个提交的页面,同时会使用a标签或submit标签,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8. <s:div id="showMsg">  
  9. </s:div>  
  10.   
  11. <s:form action="ajaxServerAction" method="post">  
  12.     <s:textfield name="account" label="帐号"></s:textfield>  
  13.     <s:textfield name="name" label="姓名"></s:textfield>  
  14.     <sx:submit targets="showMsg"></sx:submit>  
  15. </s:form>  
  16.   
  17. <sx:a targets="showMsg" href="ajaxServerAction.action?account=test&name=testname">a标签的测试</sx:a>  

(4)运行测试一下,结果如下:

图14.5  a标签示例页面

图14.6  submit标签示例页面

14.3.5 bind标签

1:功能

bind标签主要用来把一个事件和事件处理程序关联起来,当然它也可以把一个对象的事件和一个topic联系起来。

2:属性

bind标签的属性很多,这里罗列一些常用的:


3:使用示例

Bind标签的使用是非常简单的,来通过一个示例进行说明,实现的功能非常简单,就是为一个按钮绑定上一个onclick的事件。

(1)Action和struts.xml就沿用上面示例的Action和struts.xml,这里就不去赘述了。只是把返回的数据修改成了:

 

java代码:
  1. inputStream = new ByteArrayInputStream("这是一个Bind的测试".getBytes("utf-8"));  

(2)然后来看看页面的实现,主要就是bind标签的基本使用了,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8. <s:div id="showMsg">  
  9. </s:div>  
  10.   
  11. <input type="button" id="myButton" value="保存">  
  12. <sx:bind  
  13.     id="myBind"  
  14.     href="ajaxServerAction.action"  
  15.     sources="myButton"  
  16.     events="onclick"  
  17.     targets="showMsg"  
  18. >  
  19. </sx:bind>  

(4)去运行测试一下看看,运行应该如下图所示:

图14.7  bind标签示例页面

14.3.6datetimepicker标签

1:功能

datetimepicker标签主要用来实现一个日期控件,可以表现为一个日历表或者是一个ie时间表。

2:属性

datetimepicker标签的属性很多,这里罗列一些常用的:


设置日期格式时,各个字母代表的含义如下:

3:使用示例

       看看使用datetimepicker标签来显示日期的样子,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8.   
  9. <sx:datetimepicker  
  10.     adjustWeeks="true"  
  11.     displayFormat="yyyy-MM-dd"  
  12.     toggleType="explode"  
  13. >  
  14. </sx:datetimepicker>  

运行效果如下图所示:

图14.8  datetimepicker标签示例页面

14.3.7 autocompleter标签

1:功能

autocompleter标签实现的是具有自动完成功能的组合框,输入一定的数据后,会出现一个下拉块,里面罗列着一些与输入相关的关键词,你可以通过选择一个来自动完成输入。当然也可以直接点击下拉列表来选择一个值。

2:属性

autocompleter标签的属性很多,这里罗列一些常用的:



3:返回一个List的使用示例

autocompleter标签的使用并不复杂,只是它需要嵌套在一个标签内使用;另外标签使用的选项可以是一个集合,也可以是JSON对象,分别来通过示例进行说明,实现的功能非常简单,就是通过autocompleter标签来异步显示可自动完成的信息。

先看看从Action返回一个List给autocompleter标签的情况。

(1)先看看action的实现,在execute方法里面为list填充初始值,示例代码如下:


java代码:
  1. public class AutocompleteAction extends ActionSupport{  
  2.     public List<String> users = new ArrayList<String>();  
  3.     /** 
  4.      * 用来判断是需要初始化数据还是处理提交的请求 
  5.      */  
  6.     public String submitFlag = "";  
  7.     /** 
  8.      * 用来接收被选中的项的值 
  9.      */  
  10.     public String testKey = "";  
  11.       
  12.     public String execute(){  
  13.         if("show".equals(submitFlag)){  
  14.             users.add("张三");  
  15.             users.add("张三丰");  
  16.             users.add("李四");  
  17.             users.add("李四郎");  
  18.         }else{  
  19.             System.out.println("你选中的是==="+testKey);  
  20.         }  
  21.         return this.SUCCESS;  
  22.     }  
  23. }  

注意其中的testKey属性,它用来接收被选中项的值,它对应着页面autocompleter标签中的name属性,它是自动在name属性后面添加Key而得到。也就是说,现在获取值的属性是testKey,那么页面autocompleter标签中的name属性的值就应该是test。当然,也可以通过在autocompleter标签中的keyName属性来指定这个值。

(2)相应的struts.xml配置如下:

 

java代码:
  1. <action name="autoAction" class="cn.javass.ajax.AutocompleteAction">  
  2.             <result name="success">/ajax/tags.jsp</result>  
  3. </action>  

(3)然后来看看页面的实现,主要就是autocompleter标签的基本使用了,要注意放到表单里面,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8.   
  9. <s:form action="autoAction" method="post">  
  10.     <input type="hidden" name="submitFlag" value="request"/>  
  11.     <sx:autocompleter name="test" list="users" autoComplete="true"></sx:autocompleter>  
  12.     <s:submit></s:submit>  
  13. </s:form>  

(4)运行的url是:http://localhost:9080/helloworld/autoAction.action?submitFlag=show,去运行测试一下看看,刚开始运行应该如下图所示:

图14.9  autocompleter标签示例开始页面

       点击下拉图标,如下图所示:

图14.10  autocompleter标签示例点击下拉图标的页面

       如果在输入框中输入,比如输入张三,然后删掉三字,可以看到自动提示的信息如下图,你完全可以通过选择一个来实现自动输入:

图14.11  autocompleter标签示例自动完成页面

4:返回JSON的使用示例

autocompleter标签使用返回的JSON也不复杂,只是返回值要符合一定的格式而已。autocompleter标签所接受的json格式大致有:

(1)如果返回的是数组,那么一定要是个2维的数组,格式大致如下:

 

java代码:
  1. [  
  2.  ['第一个元素的key','第一个元素的value'],  
  3.  ['第二个元素的key','第二个元素的value']  
  4.   ......  
  5. ]  

其中元素的key值就是在下拉列表里面显示的值,而value就是选中后提交到后台的值。

(2)如果你在autocompleter标签中设置了“dataFieldName”这个属性,假定设定的值为“dataFieldName=test”,那么返回的2维数组的格式大致如下:

 

java代码:
  1. {     
  2.     "test":[  
  3.             ['第一个元素的key','第一个元素的value'],  
  4.             ['第二个元素的key','第二个元素的value']  
  5.              ......  
  6.            ]  
  7. }  

或者如下格式:

 

java代码:
  1. {     
  2.     "test":{  
  3.             '第一个元素的key' : '第一个元素的value',  
  4.             '第二个元素的key' : '第二个元素的value'  
  5.              ......  
  6.            }  
  7. }  

(3)如果你在autocompleter标签中设置了“name”这个属性,假定设定的值为“name=test”,那么返回的格式大致如下:

 

java代码:
  1. {  
  2.      "tests" : [  
  3.                 ['第一个元素的key','第一个元素的value'],  
  4.                 ['第二个元素的key','第二个元素的value']   
  5.                 ......    
  6.                ]  
  7. }  

(4)如果返回是一个map,那么返回的格式大致如下:

 

java代码:
  1. {  
  2.     '第一个元素的key' : '第一个元素的value',  
  3.     '第二个元素的key' : '第二个元素的value'  
  4.     ......    
  5. }  

接下来就简单看看从Action返回一个JSON字符串给autocompleter标签的实现。

(1)先看看action的实现,在execute方法里面为list填充初始值,然后拼接成为一个符合格式要求的字符串,并把这个字符串放置到request的属性里面,示例代码如下:

 

java代码:
  1. public class AutocompleteAction extends ActionSupport{  
  2.     public List<String> users = new ArrayList<String>();  
  3.     /** 
  4.      * 用来判断是需要初始化数据还是处理提交的请求 
  5.      */  
  6.     public String submitFlag = "";  
  7.     /** 
  8.      * 用来接收被选中的项的值 
  9.      */  
  10.     public String testKey = "";  
  11.       
  12.     public String execute(){  
  13.         if("show".equals(submitFlag)){  
  14.             users.add("张三");  
  15.             users.add("张三丰");  
  16.             users.add("李四");  
  17.             users.add("李四郎");  
  18.               
  19.             StringBuffer buffer = new StringBuffer();  
  20.             buffer.append("[");  
  21.             for(int i=0;i<users.size();i++){  
  22.                 buffer.append("['"+users.get(i)+"','"+users.get(i)+"']");  
  23.                 if(i!=users.size()-1){  
  24.                     buffer.append(",");  
  25.                 }  
  26.             }  
  27.             buffer.append("]");           
  28.             ServletActionContext.getRequest().setAttribute("jsonStr",buffer.toString());   
  29.             return "toJson";  
  30.         }else{  
  31.             System.out.println("你选中的是==="+testKey);  
  32.         }  
  33.         return this.SUCCESS;  
  34.     }  
  35. }  

(2)相应的struts.xml配置如下:

 

java代码:
  1. <action name="autoAction" class="cn.javass.ajax.AutocompleteAction">  
  2.             <result name="success">/ajax/tags.jsp</result>  
  3.             <result name="toJson">/ajax/toJson.jsp</result>  
  4. </action>  

(3)接下来看看返回JSON字符串的页面,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <%=request.getAttribute("jsonStr")%>  

(4)然后来看看页面的实现,主要就是autocompleter标签的基本使用了,要注意放到表单里面,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8.   
  9. <s:form action="autoAction" method="post">  
  10.     <input type="hidden" name="submitFlag" value="request"/>  
  11.     <sx:autocompleter name="test" href="/helloworld/autoAction.action?submitFlag=show"></sx:autocompleter>  
  12.     <s:submit></s:submit>  
  13. </s:form>  

注意里面配置了href,它就指向自动填充所需要的值的来源。

(5)运行的url是:http://localhost:9080/helloworld/ajax/tags.jsp,去运行测试一下看看,效果跟前面直接返回List的效果应该是一样的。

14.3.8textarea标签

1:功能

textarea标签用来实现复杂的文本编辑框,类似于大家在邮件系统或是博客系统里面看到的,可以在线编辑的文本框,可以设置一些基本的格式。

2:属性

textarea标签的常用属性有:

3:使用示例

(1)textarea标签的使用很简单,直接在页面上使用就可以了,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8.   
  9. <s:form action="autoAction" method="post">  
  10.     <sx:textarea name="test" rows="10" cols="50"></sx:textarea>  
  11.     <s:submit></s:submit>  
  12. </s:form>  

如果后台想要接收到textarea的值,只需要设置一个属性跟textarea标签的name值一样就可以了。

(4)运行测试一下,结果如下:

图14.12  textarea标签示例页面

这里要注意一个问题,部分IE可能对textarea标签支持得不是很好,刚显示出来的时候全部并在一起,点击输入框的时候就展开了,在Firefox上就一切正常。

14.3.9tabbedpanel标签

1:功能

tabbedpanel标签用来实现多页签的面板,也被称为tab面板,而且单个面板可以单独关闭,就类似于Eclipse打开开发的源文件一样。

2:属性

tabbedpanel标签的常用属性有:



3:使用示例

(1)对Action稍作修改,只是把返回的数据修改成了:

 

java代码:
  1. inputStream = new ByteArrayInputStream("这是一个Tab的测试".getBytes("utf-8"));  

 

java代码:
  1. (2)struts.xml的配置没有改变,就不去赘述了  
  2. (3)页面也需要发生一些改变,主要是使用tabbedpanel标签,示例代码如下:  

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8.   
  9. <sx:tabbedpanel id="test" >  
  10.    <sx:div id="one" label="第一个面板">  
  11.        <s:form>  
  12.            <s:textfield name="userId" label="用户编号"/>  
  13.            <s:textfield name="name" label="用户名称"/>  
  14.        </s:form>  
  15.    </sx:div>  
  16.    <sx:div id="two" label="第二个面板" href="ajaxServerAction.action" >  
  17.    </sx:div>  
  18. </sx:tabbedpanel>  

(4)运行测试一下,结果如下:

图14.13  tabbedpanel标签示例页面一

       点击第二个面板,结果如下:

图14.14  tabbedpanel标签示例页面二

14.3.10tree和treenode标签

1:功能

tree标签用来实现在页面展示一个树形结构,它可以包含一个或多个treenode标签。tree标签实现的是一个基于dojo的树。treenode标签里面还可以包含一个到多个treenode标签,形成父子节点。

2:属性

tree标签的常用属性有:

 


3:静态树示例

       为了让大家更好的掌握树的使用,先来个简单的,就是直接在页面上写死的数据,也就是制造一颗静态树。

(1)直接在页面上使用tree标签和treenode标签,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8.   
  9. <sx:tree id="depRoot" label="部门">  
  10.     <sx:treenode id="dev" label="开发部">  
  11.         <sx:treenode id="dev1" label="开发一部"></sx:treenode>  
  12.         <sx:treenode id="dev2" label="开发二部"></sx:treenode>  
  13.     </sx:treenode>  
  14.     <sx:treenode id="test" label="测试部"></sx:treenode>  
  15.     <sx:treenode id="market" label="市场部"></sx:treenode>  
  16. </sx:tree>  

(2)运行测试一下,结果如下:

图14.15  tree标签示例页面

4:动态树使用示例

       接下来把构建树的数据后移,放到Action中去构建。为了与tree标签里面的属性进行匹配,需要在后台构建一个节点模型,是JavaBean格式的,这个JavaBean里面的属性,在页面上使用tree标签的时候进行使用。

(1)先就来看看这个节点的模型对象,示例代码如下:

 

java代码:
  1. public class Node {  
  2.     /** 
  3.      * 到时候配置到tree标签的nodeIdProperty 
  4.      */  
  5.     private String id;  
  6.     /** 
  7.      * 到时候配置到tree标签的nodeTitleProperty 
  8.      */  
  9.     private String name;  
  10.     /** 
  11.      * 到时候配置到tree标签的childCollectionProperty 
  12.      */  
  13.     private List<Node> children = new ArrayList<Node>();  
  14.       
  15.     public String getId() {  
  16.         return id;  
  17.     }  
  18.     public void setId(String id) {  
  19.         this.id = id;  
  20.     }  
  21.     public List<Node> getChildren() {  
  22.         return children;  
  23.     }  
  24.     public void setChildren(List<Node> children) {  
  25.         this.children = children;  
  26.     }  
  27.     public String getName() {  
  28.         return name;  
  29.     }  
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33. }  

(2)在Action里面来组装树,示例代码如下:

 

java代码:
  1. public class TreeAction extends ActionSupport {  
  2.     /** 
  3.      * 用作树的根节点,对应到tree标签的rootNode 
  4.      */  
  5.     public Node depRoot = new Node();  
  6.     public String execute(){  
  7.         //在这里构建树  
  8.         depRoot.setId("theRoot");  
  9.         depRoot.setName("部门");  
  10.           
  11.         Node dev = new Node();  
  12.         dev.setId("dev");  
  13.         dev.setName("开发部");  
  14.           
  15.         Node dev1 = new Node();  
  16.         dev1.setId("dev1");  
  17.         dev1.setName("开发一部");  
  18.           
  19.         Node dev2 = new Node();  
  20.         dev2.setId("dev2");  
  21.         dev2.setName("开发二部");  
  22.           
  23.         dev.getChildren().add(dev1);  
  24.         dev.getChildren().add(dev2);  
  25.           
  26.         Node test = new Node();  
  27.         test.setId("test");  
  28.         test.setName("测试部");  
  29.           
  30.         Node market = new Node();  
  31.         market.setId("market");  
  32.         market.setName("市场部");  
  33.           
  34.         depRoot.getChildren().add(dev);  
  35.         depRoot.getChildren().add(test);  
  36.         depRoot.getChildren().add(market);  
  37.           
  38.         return this.SUCCESS;  
  39.     }  
  40. }  

(3)对应的struts.xml的配置,示例代码如下:

 

java代码:
  1. <action name="treeAction" class="cn.javass.ajax.TreeAction">  
  2.             <result name="success">/ajax/tags.jsp</result>  
  3. </action>  

(4)页面也需要发生一些改变,主要是使用tree标签,示例代码如下:

 

java代码:
  1. <%@ page contentType="text/html; charset=gb2312"%>  
  2. <head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"></head>  
  3. <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>  
  4. <%@taglib prefix="s" uri="/struts-tags" %>  
  5. <head>  
  6.   <sx:head/>  
  7. </head>  
  8. <sx:tree rootNode="depRoot"  
  9.         nodeTitleProperty="name"  
  10.         nodeIdProperty="id"  
  11.         childCollectionProperty="children"  
  12. >  
  13. </sx:tree>  

上面配置的各个属性,同后台的Node对象和Action对象都有关系,具体的参见相应的注释,这里就不去赘述了。

(5)运行的url是:http://localhost:9080/helloworld/treeAction.action,去运行测试一下看看,效果和刚才静态树的效果应该是一样的。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/4131.html】


VSS shielding线可以floating吗? shielding vss不打孔,就相当于dummy metal,如果周围有其他干扰线,他们影响了这段dummy metal,这段dummy metal仍然会对目标线产生干扰,bug的是,工具知道这段dummy是vss,那么计算寄生的时候仍然把它当vss,就有可能噪声没有完全消除,而用户又看不见。而真正接地的线,相当于一直是0,就不会对目标线产生干扰,一般加shield是在route之前,这时候shield能尽量覆盖目标线,等到绕线后再加就会出现shield只覆盖到一部分目标线的情况。 阅读详情

相关推荐

展锐双摄帧同步实战:从配置到调试的完整避坑指南

本文深入剖析了在展锐平台上实现双摄帧同步的完整流程与核心技术。详细对比了硬件帧同步与软件帧同步的差异、应用场景及核心挑战,提供了从XML配置、驱动层适配到调试验证的实战指南。重点强调了硬件帧同步必须与固定帧率强绑定这一关键避坑点,并分享了针对景深虚化等场景的同步质量验证方法及长稳测试策略。

kiwi8的博客 401

《研磨struts2》第十四章 对Ajax的支持 之 14.3 Ajax JSP tags

14.3  Ajax JSP tags 14.3.1概述 为了使开发Ajax变得轻松惬意,Struts2提供了一些JSP Tags,通过这些自定义的标签库,使得开发人员无需掌握额外的知识即可开发Ajax的应用。        从Struts2.1开始,不再推荐使用Dojo的Plugin,而是改用Ajax的tags,包括: head:用来下载Dojo文件和相应的Javascript...

研磨struts2 191

Linux下Linpack测试GPU和CPU性能

前面的文章已经介绍了如何搭建Linpack环境:https://blog.youkuaiyun.com/liu_feng_zi_/article/details/107429720 接下来说明如何使用 一、编写运行脚本: 新建文件:run_linpack.sh,内容如下: export HPL_DIR =/root/LHC/Linpack/hpl-2.0_FERMI_v15 export MKL_NUM_THREADS=6 export OMP_NUM_THREADS=6 export MKL_DYNAMI.

liu_feng_zi_的专栏 4633

Struts 2 的 Ajax 支持(一)

  一、  Ajax 概述   Ajax (Asynchronous JavaScript And XML),即异步 JavaScript 和 XML 技术,是 2006 年最风光的技术,AJAX 技术改进了传统 Web 技术;通过 Ajax 技术,浏览者与服务器之间采用异步通信机制,从而避免了浏览者的等待,带给浏览者连续的体验。   Ajax 技术是一种完全站在用户角度的技...

terryjs 188

WRF和WPS安装和编译时遇到的问题

检查是否自己netcdf和Fortran编译器一致。解决办法:修改configure.wps里的路径。如果没问题且wrf已成功编译,考虑重新。path修改为jasper在的路径。

m0_54898744的博客 1836

2025年CSP-X初赛真题及答案解析(江西)(完善程序第1题)

2025年CSP-X初赛真题及答案解析(江西)(完善程序第1题)

王老师青少年编程 713

struts实现ajax,Struts 2中实现Ajax的三种方式

Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的。所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一部分,也可能是xml、json等结构化的数据,还可能是一个简单的字符串。所以,在Struts 2中使用Ajax,Action一般就不会调用一个jsp视图来显示了(如果Ajax请求内容是页面的一部分也可能...

weixin_34194482的博客 1091

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6434

struts2怎么处理ajax请求

struts2接收ajax请求参数有三种方法首先说一下struts2是线程安全的,为什么说struts2是线程安全的呢,因为在struts2中struts2把所有的域对象全都封装到了actioncontext对象中,所以actioncontext对象的生命周期和request域对象的生命周期相同,也就是每次请求的到来会重新去创建一个actioncontext对象,所以请求与请求之间不使用相同的资源...

minolk的博客 6050

【Mode】微带传输线阻抗

微带线,英文名称为 (Microstrip) 是一种常见的平面传输线,主要用于传输微波频率信号(通常在射频和微波电路重中使用)。

u011699626的博客 243

安装Codex时出现无法下载此应用和Microsoft Store初始化失败的解决方案

本文主要介绍了安装Codex时出现无法下载此应用和Microsoft Store初始化失败的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. Windows 解决方案 3. Mac解决方案

weixin_43178406的博客 7万+

《struts2权威指南》学习笔记之struts2 ajax标签s和submit

这个标签生成一个超级链接,用于像服务器发送异步请求,并将服务器响应加载在指定HTML元素中web.xml xml version="1.0" encoding="GBK"?>web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://www.w3.org/2001/XMLSch

我的世界我的梦 5096

深入理解 DDR5 Bank Group 与并行调度机制

Bank Group架构和并行调度机制,是DDR5性能跃升的核心秘密!理解它们才能写出高效调度程序,设计出性能强劲又稳定的DDR5系统。🎯记住:Bank Group不是简单的分组,而是高速并行的“魔法钥匙”,巧用它,你的DDR5设计将爆发惊人性能!

weixin_43199439的博客 311

《struts2权威指南》学习笔记之struts2 ajax标签之tabbedPanel

tabbedPanel标签在HTML页面里生成类似windows程序的tab页,通过使用TAB页面,可以在有限的空间里放置更多的内容web.xml xml version="1.0" encoding="GBK"?>web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://w

我的世界我的梦 3706

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

struts2框架学习三 ajax

ajax jsp部分代码 $(function() { $.ajax({ type:'POST', url:'list1Action.action', success:funct...

zlj的博客 186

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《struts2权威指南》学习笔记之struts2 ajax标签之autocompleter

autocompleter 标签会生成一个带下拉按钮的单行文本输入框,当用户单击下拉按钮时,将看到一系列的选项,单击某个选项可以将该选项填入单行文本框web.xml xml version="1.0" encoding="GBK"?>web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi=

我的世界我的梦 3324

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《struts2权威指南》学习笔记之struts2 ajax标签

div标签用于在页面上生成一个div元素,但这个div元素内容不是静态内容,而是从服务器上获取数据,为了让该div能够取得服务器上的数据,必须为div标签指定一个href属性,这个href属性必须是一个action,该action负责生成该div的内容因为div是一个ajax标签,因此要为这个标签增加theme="ajax"属性web.xml xml version="1.0"

我的世界我的梦 3158

JAVA_WEB Struts2学习:Struts2Ajax标签的学习

导入Struts2 Ajax标签: <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> Struts2 Aja

dragonbamboo261的专栏 829

struts2 ajax 上传文件_Java学习之Struts2经典面试题

1. 简述 Struts2 的工作流程: ①. 请求发送给 StrutsPrepareAndExecuteFilter②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请求 ③. 若该请求是一个 Struts2 请求,则 StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy ④. ActionPr...

weixin_39802020的博客 131

AJAX学习之序列二:struts2 jquery json 实现AJAX 注册ID验证

 1.      目标目标使用AJAX实现如下效果:当填入用户名的时候,光标移开进行AJAX验证,如果已经被注册提示如下: 如果可以使用,提示如下:  2.      实现过程 准备:

abing37的专栏 5651

struts2学习之struts2 + jquery + json进行AJAX请求

<br />第一步:使用MyEclipse8.5创建web项目,并添加struts2支持。<br />第二步:配置struts.xml ,添加<br /><package name="ajax" extends="json-default">  <br />         <action name="ajaxLogin" class="org.test.action.AjaxLoginAction">  <br />             <!-- 返回类型为json 在json-default中定义

Dr. SUN 的专栏 678

【Struts2学习笔记】Struts2控制标签、数据标签、表单标签、Ajax标签

Struts2标签:控制标签、数据标签、表单标签、Ajax标签; 一、控制标签 1.if和else标签; “If”标签可以单独使用,也可以与“Else If”标签,和单个或是多个“Else”标签一起使用; 2.iterator标签 iterator将迭代一个值。可迭代值可以是以下任一值:java.util.Collection,java.util.Iterator。在迭代一个iterator时,可...

宏毅之心的博客 331

《struts2权威指南》学习笔记之struts2 ajax动态表单

web.xml xml version="1.0" encoding="GBK"?>web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://ja

我的世界我的梦 2270

Struts2学习-ajax返回JSON

    ajax是我们开发过程中常常用到,那么当ajax碰到struts2又会发生什么样的事情呢?通常笔者在使用ajax过程时更多是从服务端返回json格式的数据。下面就说说如何通过struts2来返回json数据。     首先来看一下我的struts2配置文件中action的配置 &lt;package name="account" extends="struts-default" n...

落日的忧伤 232

struts2学习笔记(十三)——ajax的支持

包括采用Ajax方式的输入校验,以简单方式来异步提交表单请求,并提供了pub-sub的事件模型,并且提供了系列的Ajax标签。其中ajax的输入校验的支持感觉过于复杂,如果我选择,选择 formvalidator代替。Pub-sub还是不错的,至少jquery没有支持,而且这个需要后台参与的。Ajax标签过于死板,使用 Jquery和指定的标签实现效果会更好。 Ajax输入校验: 1.

dananhai381的专栏 1780

struts2 ajax post提交例子详解|struts2学习与交流|j2ee学习网

struts2 ajax例子  , 今天我们使用struts2 和 jquery的ajax 做一个例子 , 方便大家学习。。 看action的代码: package com.test.action; import org.springframework.web.struts.ActionSupport; import com.test.pojo.Person; i

java_yuan的专栏 636
上一篇: 学习杂记(一)
下一篇: 5个常用Java代码混淆器 助你保护你的代码
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值