部署:部署1部署2 従業員:

このような2つのセレクトボックスがあって、部署の選択に応じて、従業員のセレクトボックスを動的に生成したいとします。

これを、Ajaxを使ってSAStrutsで実現しようとしてました。

StringBufferの例

アクションにAjaxリクエスト用のメソッドを作成します。

※ パラメータの部署idはアクションフォームで定義されているとします。

@Execute(validator = false)
public String ajaxEmployeeList() {List<Employee> employeeList = employeeService.findByDeptId(form.depertmentId);StringBuilder buf = new StringBuilder(100);buf.append("{");for (Employee emp: employeeList) {buf.append("\"");buf.append(emp.id);buf.append("\":\"");buf.append(emp.name);buf.append("\",");}buf.setLength(buf.length() - 1);buf.append("}");ResponseUtil.write(buf.toString(), "text/javascript");return null;
}

idとnameさえ得られれば良いので、単純にStringBufferで書いてみました。最後にユーティリティクラスのResponseUtilを使ってJSONを出力しています。ちなみに、最初はgetEmployeeList()という名前にしようとしたのですが、Getterと解釈されるっぽいので違う名前にしました。

ただ、やはりどうもコードにすっきり感がありません。

で、なんとなく「json」と書いてコード補完をしてみたら、「JSONSerializer」なるクラスを発見。serialize()というメソッドがあり、どうやらこれで出来そうです。

JSONSerializerの例

追記:修正した記事↓を書きました。なお、JSONSerializerは非奨励とされています。
SAStruts JSONを返すアクションメソッド 修正編 - 130単位

※ org.seasar.framework.util.JSONSerializerをインポートします。

@Execute(validator = false)
public String ajaxEmployeeList() {List<Employee> employeeList = employeeService.findByDeptId(form.depertmentId);HashMap<String, String> map = new HashMap<String, String>();for (Employee emp: employeeList) {map.put(emp.id, emp.name);}ResponseUtil.write(JSONSerializer.serialize(map), "text/javascript");return null;
}

コードを短くするなら、エンティティのListをそのままJSONに変換してもいいと思います。その際エンティティに導出プロパティがあった場合、正しく定義していないと例外が発生してしまうので注意が必要です。

Content-Type

ResponseUtil#write()の第二引数にContent-Typeを指定していますが、JSONは"application/json"とするのが本来は正しいようです。

JSONのContent-Typeは application/json(管理人日記) - むぅもぉ.jp
http://muumoo.jp/news/2006/09/26/0applicationjson.html

ちなみに第二引数なしだと"text/plain"になります。"application/json"と"text/javascript"と"text/plain"、それぞれのContent-Typeを各ブラウザで試してみましたが、IE6/Firefox3/Safari/Chromeどれでも問題ありませんでした。

ところが

記事を書くにあたってリンクを張ろうとしてみたら、以下のような記述が。

推奨されていません。 このクラスの代わりにJSONIC等を使用してください

JSONSerializer (Seasar2 Framework 2.4.46 API)

JSONからの変換の際に、うまくいかないケースがあるようです。

[#CONTAINER-339] [S2Container] JSONSerializer を deprecated にしました.代わりに JSONIC 等を使用してください. - The Seasar Foundation Issues
https://www.seasar.org/issues/browse/CONTAINER-339

参考リンク

というわけで、JSONICを使うように修正したいと思います。以下参考記事。

suz-lab - blog: S2JDBC - SAStruts - JSON - jQuery
http://suz-lab.blogspot.com/2008/09/s2jdbc-sastruts-json-jquery.htmlSAStruts + JSONIC でバリデーションエラーをJSONで返す : json, sastruts, seasar | メモリークラフト
http://www.memorycraft.jp/2008/11/sastruts-jsonic-json.html

转载于:https://www.cnblogs.com/aggavara/archive/2012/09/29/2708722.html

SAStruts アクションにJSONを返すメソッドを作成してみる相关推荐

  1. 嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中

    我真的很想有一个快速便捷的方法来遍历JSON中的多个记录,每个记录都有潜在的深层嵌套.我只想输出到表. 我不确定$ .each()或$ .ajax()成功的javascript方法需要通过functi ...

  2. fastjson 修改多层嵌套的Json数据

    文章目录 一.需求 二.期望效果 三.实现 四.总结 一.需求 操作多层嵌套的Json数据,修改key值或删除key,然后更新原始Json数据 二.期望效果 删除原始Json中query-->b ...

  3. java jni 方法描述,五、JNI提供的函数介绍(一):类和对象操作

    如果你要开始JNI编程,你还需要了解JNI提供了哪些函数供你调用. 这些函数都定义在了jni.h文件,包括上一篇文章介绍的数据类型,也都在这个头文件中. 类和对象操作 假设你要在JNI层使用C代码创建 ...

  4. 改进架构,实现动态数据源,减少java维护

    怎样不用写java代码来完毕开发? 对于大部分的产品和项目来说.页面变化是很头痛的事情.每次小功能上线,新客户到来,都须要进行定制改造,不断的开发维护.每次开发一方面要修改页面,一方面要修改serve ...

  5. apicloud+融云实现即时通讯

    请尊重作者的辛勤劳动!!! 使用apicloud开发已经快2个月了,起初的目的就是为了实现安卓和苹果的兼容,属于一个试验项目,究竟apicloud是否能够满足公司的要求?最 终看来还是不错的,使用ap ...

  6. 【NodeJS笔记】三分钟快速入门NodeJS

    官网:https://www.runoob.com/nodejs/nodejs-tutorial.html 初始NodeJS 简单的说 Node.js 就是运行在服务端的 JavaScript. No ...

  7. jq处理返回来json_(转)JQuery处理json与ajax返回JSON实例

    son数据是一种经型的实时数据交互的数据存储方法,使用到最多的应该是ajax与json配合使用了,下面我来给大家介绍jquery处理json数据方法. 一.JSON的一些基础知识. JSON中对象通过 ...

  8. jq处理返回来json_4个小窍门,让你在Python中高效使用JSON

    全文共1990字,预计学习时长5分钟 图源:unsplash 字典和列表是 Python的两种数据类型,也是用来处理JSON的完美工具.本文将主要分享以下内容: · 如何载入.编写JSON? · 如何 ...

  9. jq处理返回来json_JQuery ajax返回JSON时的处理方式 (三种方式)

    最近在使用JQuery的ajax方法时,要求返回的数据为json数据,在处理的过程中遇到下面的几个问题,那就是采用不同的方式来生成json数据的时候,在$.ajax方法中应该是如何来处理的,下面依次来 ...

  10. 创建Maven分布式前台系统架构,写出京动态导航,跨域返Json数据

    前台系统架构 分层的架构有什么好处: 有利于系统的维护,扩展. 分层的结构是按照功能细化,细化之后就能够分布式的部署. 灵活性 前台系统与服务层可以分离 开发团队可以分开,提高开发效率 缺点: 服务器 ...

最新文章

  1. apache activemq ActiveMQ 修改密码
  2. 大学生学python到底有没有有-为什么我会想建议每个大学生都学一点编程?
  3. 关于微机开操作票的研究22437
  4. scala中object和class关键字的区别
  5. vector, list, map在遍历时删除符合条件的元素
  6. java提取文章摘要内容
  7. package.json和package-lock.json的区别
  8. ARP协议,ARP诈骗图
  9. python下载包没用_Python下载各种功能包出问题
  10. 对自定义UITableViewCell的理解
  11. 【虚拟机】VMware启动时报错:该虚拟机似乎正在使用中....请按“获取所有权(T)”按钮获取它的所有权
  12. vgp虚拟路面_某车型开发阶段实际道路谱和虚拟路面谱对比分析.pdf
  13. 华三路由交换配置命令_华三交换机-路由器配置命令
  14. 【215期推荐】另类思考:HIS能给医院带来什么“坏处”?
  15. MySQL监控系统Lepus
  16. 计算机word文档无法工作,word无法打开(WORD文档打不开_解决方法_电脑基础知识_IT/计算机_专业资料)...
  17. Gitlab-CI Runner缓存
  18. STC89C52RC - 11 - 蜂鸣器BEEP
  19. 神经系统结构基础是什么,神经系统结构图简笔画
  20. AD20使用之 手动创建封装

热门文章

  1. 教你一招最屌的阅读开源项目的姿势
  2. 面试时企业最看中你什么能力?
  3. nosql数据库之Redis持久化、备份和主从配置
  4. windows虚拟机下 安装docker 踩过的坑
  5. 一文让你秒懂互联网TCP/IP协议的深层含义
  6. es6 属性及常用新属性汇总
  7. PHP 解决未定义变量报错
  8. JQuery Ajax调用asp.net后台方法
  9. TwoStep Cluster
  10. 谁偷偷删了你的微信?别慌!一篇Python学习教程帮你都揪出来