Struts 2处理Dojo Ajax请求的一点经验

C++五子棋人机对战 使用C++,开发五子棋人机对战,快速提升C++项目开发能力。 阅读详情

从Struts 1到Struts 2,从Dojo 1.5到Dojo 1.7、1.8,技术一直在进步,经验却需要时时更新。对于Web应用中最常碰到的Ajax请求处理,新版本的Struts 2和dojo 1.7做法就和以前不一样(在JAVA servlet中返回不同类型的AJAX response)。现在就拿一个例子说明如何从前台用Dojo通过Ajax请求将Json数据送回后台,后台检测后返回信息;顺便也看看到底新技术进步在哪里。

 

例子:前台录入人员信息,并保存到后台,后台返回保存后的id。

 

1. 在主页上增加一个按钮,点击时打开填写人员信息的对话框

main.jsp

<div style="width: 100%;">
		<button id="new_person_btn" data-dojo-type="dijit.form.Button"
			type="button">New Person</button>
	</div>
<div class="dijitHidden">
		<div data-dojo-type="test.person" style="width: 400px;"
			id="new_person_dlg"></div>
	</div>
<script>
		require([ "dojo/ready", "dojo/on", "dijit/registry"],
				function(ready, on, registry) {
					ready(function() {

						var new_person_btn = registry.byId("new_person_btn");
						on(new_person_btn, "click", function(evt) {
							registry.byId("new_person_dlg").show();
						});

					});

				});
	</script>

2. 对话框页面,可以填写人员姓名、描述、是否正式员工

person.jsp

<div data-dojo-type="dijit.form.Form" id="new_person_form"
	data-dojo-id="new_person_form" encType="multipart/form-data">
	<table cellspacing="10" style="width: 100%">
		<tr>
			<td><label for="name">Name:</label></td>
			<td><input type="text" id="new_person_name" name="name"
				style="width: 100%" required="true"
				data-dojo-type="dijit.form.ValidationTextBox" /></td>
		</tr>
		<tr>
			<td><label for="description">Description:</label></td>
			<td><textarea id="new_person_description" name="description"
					data-dojo-type="dijit.form.SimpleTextarea" rows="4"
					style="width: 99%"></textarea></td>
		</tr>
		<tr>
			<td><label for="regular">Regular:</label></td>
			<td>
				<div data-dojo-type="dojo.store.Memory" data-dojo-id="new_person_regular_store"
					data-dojo-props="data: [{id: 'y', name: 'yes'}, {id: 'n', name: 'no'}]"></div>
				<input data-dojo-type="dijit.form.ComboBox" value="yes" style="width: 100%" 
				data-dojo-props="store:new_person_regular_store, searchAttr:'name'" name="regular"
				id="new_person_regular" />
			</td>
		</tr>
	</table>
	<div style="text-align: right; margin-right: 6px;">
		<button id="new_person_submit_btn" data-dojo-type="dijit.form.Button">OK</button>
		<button id="new_person_cancel_btn" data-dojo-type="dijit.form.Button">Cancel</button>
	</div>
</div>

3. 对话框对应的JavaScript对象,里面包含了所有对话框相关的JS代码和事件处理。这些代码也可以放在person.jsp中,但鉴于分离视图和控制逻辑有诸多好处(MVC框架中的模型-视图分离问题(一) —— “你必将业务逻辑由显示中分离”),这儿还是分开吧。

person.js

define([ "dojo/_base/declare", "dijit/Dialog", "dijit/_WidgetBase",
		"dijit/_TemplatedMixin", "dojo/on", "dijit/registry", "dojo/_base/xhr",
		"dijit/form/Form", "dijit/form/ValidationTextBox",
		"dijit/form/SimpleTextarea", "dojo/store/Memory", "dijit/form/ComboBox"], function(declare, Dialog, _WidgetBase,
		_TemplatedMixin, on, registry, xhr) {
	return declare("test.person",
			[ Dialog, _WidgetBase, _TemplatedMixin ], {
				title : "New Person",

				postCreate : function() {
					this.set('href', "dialog_newperson.action");

					this.inherited(arguments);
				},

				onDownloadEnd : function() {
					var new_person_form = registry.byId("new_person_form");
					var new_person_submit_btn = registry
							.byId("new_person_submit_btn");
					on(new_person_submit_btn, "click", function(evt) {
						if (!new_person_form.validate()) {
							return false;
						}

						/*为了让后台认识json格式的数据,这儿有几个地方需要注意的。*/
						
						var data = {
							person : dojo.formToObject("new_person_form")
						};
						// Post the data to the server
						xhr.post({
							url : "submit_newperson.action",
							handleAs : "json",
/*注意点1:json数据必须转成json格式*/
/*注意点2:json数据要放在postData中,而不是content中*/
							postData : dojo.toJson(data),
/*注意点3:设置contentType为application/json */
							contentType : 'application/json; charset=utf-8',
							handle : function(response, ioArgs) {
								return response;
							}
						});
					});

					var new_person_cancel_btn = registry
							.byId("new_person_cancel_btn");
					on(new_person_cancel_btn, "click", function(evt) {
						registry.byId("new_person_dlg").hide();
					});

					this.inherited(arguments);
				}
			});
});

4. 为了让Struts 2能认识json格式的数据,需要引入struts2-json-plugin包。这儿用Maven管理项目,就可以直接在pom文件中加入相应dependency。如果不用Maven,则直接将jar包加入到项目buildpath中。

pom.xml

<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-json-plugin</artifactId>
			<version>2.3.12</version>
		</dependency>

5. 重点!struts.xml中需要进行相应配置

struts.xml

<!--注意点1:在package的extends里,必须有json-default -->
<package name="workbench" namespace="/"
		extends="struts-default,json-default">
		<action name="submit_newperson" class="test.SubmitNewPersonAction">
			<!--注意点2:在action里,加入json interceptor信息 -->
			<interceptor-ref name="json">
				<param name="contentType">application/json</param>
			</interceptor-ref>
			<!--注意点3:设置result为json格式 -->
			<result type="json">
				<!--注意点4:设置result包含的内容。这儿只包含result变量的数据,而没有person的数据 -->
				<param name="includeProperties">result</param>
			</result>
		</action>
	</package>

6. 保存人员信息的java对象

Person.java

public class Person {
	private String name;
    private String description;
    private String regular;
    
    public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getRegular() {
		return regular;
	}

	public void setRegular(String regular) {
		this.regular = regular;
	}
}

7. 相应的action。接收传入的人员数据,返回相应的id

TestAction.java

public class TestAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	private int result;
	 
    private Person person;
    
    public void setPerson(Person person) {
		this.person = person;
	}

	public Person getPerson() {
		return person;
	}

	@Override
	public String execute() {
		System.out.println(person);

		int result = savePerson(person);
		return SUCCESS;
	}

	public int getResult() {
		return result;
	}

}

8. 最后返回的Response:

{"result":1}

总结

相比较Struts 1而言,Struts 2在处理接收的数据方面,确实有很大的改进。数据传送到后台后,不需要手工写代码解析json格式的数据,只要schema一致,就可以用相应的POJO对象接收。


华为手环实时心率数据导出到UWP项目中 hello大家好呀O(∩_∩)O最近在做毕设 其中有个小功能要用到实时心率数据。查找网上的资料发现只有小米手环的实时心率数据导出但是没有华为手环的,我试了华为手环但是并不能行得通哈哈哈。现在分享一下华为手环实时心率数据导出的代码。 阅读详情

相关推荐

StrutsDojo实现动态树结构Web应用

本文还有配套的精品资源,点击获取 简介:Struts框架与Dojo库结合用于开发动态树结构Web应用,实现从数据库实时加载数据并以树形视图展现。本文阐述如何通过Struts的MVC模式,Dojo的动态树组件,以及Ajax技术,构建一个用户友好的交互式Web界面,并涉及数据绑定、插件使用、配置实现、数据库交互、安全性优化和用户交互等技术要点。 1. Struts框架...

weixin_26850469的博客 806

Struts2使用dojo框架中遇到的问题

新版的Struts2出于安全的考虑,删除了dojo的支持,建议用户使用Jquery代替 ,社区网站为https://coderanch.com/t/672562/frameworks/Facing-issues-upgrading-Struts-version吐槽学校老师的代码,09年就停止的版本,现在还在教。 ...

冰川的博客 726

Struts2与JQuery结合JSON实现Ajax异步加载

本文还有配套的精品资源,点击获取 简介:Struts2JQueryJson是一种将Struts2框架与jQuery库结合使用,通过JSON格式进行Ajax异步加载的技术方案。它提升Web应用的用户体验,通过无刷新页面更新来增强交互性和响应速度。本方案中,Struts2框架处理业务逻辑,jQuery库负责发起Ajax请求并更新页面元素,而JSON作为一种轻量级的数据交换格式,...

weixin_42509888的博客 1083

struts2+json点击按钮后没有反应(无法访问action)

我是直接使用的demo,参照了很多demo之后,还是无法进行正确的交互(主要是无法访问对应的action)。甚至直接复制其他作者的代码都无法运行。 后来看到一个作者说在struts.xml中加入 <constant name="struts.devMode" value="true"></constant> 其作用是“查看更详细的错误报告” 由于在eclipse里点...

LCGGood的博客 596

ajax请求struts2失败,struts2下使用jquery发ajax请求得不到响应

struts2下使用jquery发ajax请求得不到响应用了一个Action接收ajax请求XML/HTML code?123在Action里是这样子的Java code?123456789101112131415161718public class JQueryAjaxAction extends ActionSupport implements ServletResponseAware {pr...

weixin_36194553的博客 326

struts2内置支持的Javascript框架----Dojotoolkit介绍

Struts2内置对dojotoolkit的支持 @TODO 基于Ajax标签做更详细的使用讲解,由于dojo ajax标签在struts2中还处于试验阶段,所以我们主要讲解dojo在不使用struts2内置功能的情况下怎么和struts2结合使用。 Dojotoolkit介绍 Dojotoolkit是当前比较流行的JavaScript框架,dojo主要提供了以下功能:...

shirlly 233

Strutsdojo 整合研究 (一)

  Strutsdojo 整合研究 1,        Strutsdojo 标签 Struts 框架有一些 Ajax 的插件,例如: ·         Ajax Parts - The AjaxParts...

259

Struts2 集成 Dojo

Struts2内置对dojotoolkit的支持@TODO 基于Ajax标签做更详细的使用讲解,由于dojo ajax标签在struts2中还处于试验阶段,所以我们主要讲解dojo在不使用struts2内置功能的情况下怎么和struts2结合使用。 Dojotoolkit介绍Dojotoolkit是当前比较流行的JavaScript框架,dojo主要提供了以下功能:Java Scr

必应@珠峰 3490

Struts2Ajax的支持

Preface: Ajax改变了传统的用户请求一等待一响应这种web交互模式,采用异步交互机制避免了用户对服务器响应的等待,大大提高了用户体验。同时它也改变了用了用户请求一服务器响应一整个页面刷新的方式,提供了页面局部刷新的实现机制。 作为一个新兴的框架,Struts 2Ajax 提供了很多的支持。Struts 2.0内置 了对Dojo工具包的支持,而Struts 2.1 中将

u010286754的专栏 2250

Struts2Ajax的支持

第12Struts2Ajax的支持 1、Ajax是Web2.0的核心技术,它采用了异步交互机制避免了用户对服务器相应的等待。Struts2框架也提供了Ajax技术,主要是通过Dojo框架和DWR框架来实现。其中Dojo提供了大量而丰富的组件和页面效果。 2Ajax全称Asynchro...

chiyao4923的博客 215

strtus2ajax标签,struts2 标签初识 Ajax Tags.doc

struts2 标签初识 Ajax Tags1、a/ajax/remotelink/index.jsp1: 2: 3: 4:5: 6: 7: Ajax Examples8: 9: 10:11: 12: function handler(widget, node) {13: alert('I will handle this myself!');14: dojo.b...

weixin_34475212的博客 252

struts2 dojo plugin的配置问题

1.将struts2-dojo-plugin放到WEB-INF/lib目录2.在需要使用ajax标签的页面要加入标签库声明3.在页面加入标签 BankTrunk管理 4.如果你的项目没有将所有请求都映射到struts2的过滤器的话,需要加入下面的配置,否则会出现"dojo为定义"的错误 struts2Filter

tomcat_qz的专栏 2629

个人看法: Struts2为什么不用 DWR.

webwork使用DWR支持异步验证, sttruts 理所当然也是. 但是即将使用新的机制代替.这里有一个问题, 为什么 struts2 不 集成 DWR 支持 AJAX呢?其实我们常说的集成有两个方案, 1. struts 和dwr并行, 也就是ajax走 dwr 的那条路, 所有的规则遵循dwr的规范.2. dwar + bridge + struts, 也就是ajax请求被dwr 专门

L 的专栏 2471

struts2 dojo

http://www.cnblogs.com/Icebird/tag/Dojo/   Struts 2基于Dojo编写一些AJAX标志(在Dojo中称为Widget),要使用这些标志的AJAX功能,需要将标志的“theme”属性设为“ajax”。同时,亦需要将加入在&lt;head&gt;与&lt;/head&gt;之间加入&lt;s:head theme="ajax" /&gt;。当使用这些...

zw7534313的专栏 194

struts2性能优化

 前一段时间有反映说是一个使用了struts2的生产系统的页面显示速度太慢。登录后发现确实如此,于是进行了一番性能调优的研究和测试。    一,根据struts2官方的性能调优说明进行了一些参数的修改。    http://struts.apache.org/2.x/docs/performance-tuning.htmlhttp://cwiki.apache.org/

rocdream的专栏 3543

Struts2 Ajax支持—DOJO

====================================================== 注:重要!程序员如何有效的放松身心!下班后做什么? ====================================================== reference:《struts 2ajax 支持(一)》 struts 1 完全没有任何 ajax 支持,

102

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

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

宏毅之心的博客 329

ajax 异步提交 struts2 表单

Struts2Ajax提供了很好的支持,使用的是DOJO,如果你不会使用DOJO DWR的话,其实使用Struts2 提供的Ajax JSP tags 也是可以的,使用很简单。 使用名为Stream的Result 即可。 配置文件 Java代码   "ajaxAction" class="com.yaxing.action.UnitInfoAction"

Franck的专栏 632

Struts2dojo使用与/template/ajax/head.ftl not found.

   在项目中使用到Struts2dojo时,出现java.io.FileNotFoundException: Template /template/ajax/head.ftl not found. 有时出现.../text.ftl not found. 错误。       分析一下:    从strtus2.1.x开始,Struts2团队将dojo从核心包里面提取出来,成为一个struts...

每天进步1% 211

Struts2Ajax的学习

今天学习了Struts2Ajax,当然看的也是别人的教程,看后感觉StrutsAjax的封装后的标签使用十分好用,我简单的理一下学习的顺序: 一、首先Struts2Ajax引用了Dojo和DWR这两个JS框架。 而且Struts很好的封装了他们,在引用时需要添加jar包(struts2-dwr-plugin-2.3.4.jar和struts2-dojo-plugin-2.3.4.jar)

jokeHello的专栏 3551

OMRON PLC 9.7版本软件 欧姆龙PLC编程软件升级包 CX-Programmer 9.7版本软件.zip

OMRON PLC 9.7版本软件 欧姆龙PLC编程软件升级包 CX-Programmer 9.7版本.zip

上一篇: 总结MVC中push和pull的区别
下一篇: 使用Struts 2将Java对象序列化成JSON
慢游
博客等级 码龄18年 140粉丝 81原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值