paulwong

#

测试过程

  1. 单元测试
    有三个级别
    逻辑单元测试:就是方法级别的测试,方法中依赖的其他层对象用MOCK模拟,通常只针对控制层
    整合单元测试:联合几个层来测试,就是针对服务层,其依赖的持久不能模拟,数据库要打开,但可以用内存数据库
    界面单元测试:为了保证界面不出错,还包括页面数据验证不通过时的测试
  2. 持续构建和代码质量测试
    测试是否构建成功,代码质量和覆盖率是否达到标准
  3. 系统整合测试
  4. 功能测试
    通过UI验证是否符合系统用例和业务规则,主要看输入和输出
  5. 系统质量测试
    主要指性能测试是否符合非功能需求,并发用户和负载是否符合,及安全性和高可用性
  6. 用户接受测试
    模拟真实环境,根据用户手册和操作流程操作,测试是否符合业务需求

posted @ 2012-06-01 00:07 paulwong 阅读(257) | 评论 (0)编辑 收藏

"警告: 编码 GBK 的不可映射字符"怎么处理

完善api-doc,用eclipse生成javadoc的时候发生“编码 GBK 的不可映射字符 ”,很是恼火。其实是字符编码问题。
打开eclipse,project -> Generate javadoc 一项一项的选你要输出javadoc的项目,在VM设置中加入以下代码 -encoding utf-8 -charset utf-8

这次操作,输出的html代码不会发生“编码 GBK 的不可映射字符 ”问题,而且html字符编码都设为了UTF-8,问题彻底解决。

对应的ant target 如下

<target name="javadoc">

    
<echo>+---------------------------------------------------+</echo>
    
<echo>| Building Doc File |</echo>
    
<echo>+---------------------------------------------------+</echo>
    
    
<javadoc access="protected"
        additionalparam
="-encoding utf-8 -charset utf-8 "
        author
="true"
        classpath
="${classes.dir}"
        destdir
="${doc.dir}/api"
        nodeprecated
="false"
        nodeprecatedlist
="false"
        noindex
="false"
        nonavbar
="false"
        notree
="false"
        packagenames
="org.xxx.common.web.tag.go"
        source
="1.6"
        sourcepath
="${src.dir}"
        splitindex
="true"
        use
="true"
        version
="true"
        
>
        
<link href="http://java.sun.com/javase/6/docs/api/" />
    
</javadoc>
</target>

posted @ 2012-05-30 16:44 paulwong 阅读(888) | 评论 (0)编辑 收藏

JBOSS调优

WEB程序调优

1.纯JSP比JSF性能要好
2.树形数据的显示如果用JSF性能要差,不如用低层次的JAVASCRIPT
WEB SERVICE调优
1.性能不太好,尤其依赖于传输的SOAP大小,因为在XML与JAVA OBJECT的转换中消耗太多
2.加缓存在SOAP上
3.JBOSS的WEB SERVICE有三个实现,原生的、CXF和METRO,性能最好的是METRO,最差是原生的

JBOSS中的TOMCAT调优

1.CONNECTOR参数
当进入JBOSS的请求到达maxThreads,且又高于acceptCount的时候,用户就会收到Connection refused的错误信息,当HTTP请求的线程空闲了maxIdleTime时,系统就会杀掉这些线程,直到到达minSpareThreads数为止
2.如何计算程序就需的线程数
CPU数*200,如4核的设800
可以通过域名为jboss.web,name=http-127.0.0.1-8080,type=ThreadPool的MBEAN观察实际的线程数
3.处理周期长的WEB线程
WEB线程处理请求时,并不会马上结束,还会继续传递到EJB层,这样如果EJB层处理周期长,会导致WEB层请求数增长来处理新进来的请求
4.如何增大线程最大处理数
这完全依赖于CPU、RAM和SOCKET数
5.使用APACHE PORTABLE RUNTIME
增加APR包能提高性能20%,如果是WINDOWS系统则不建议
6.整合APACHE WEBSERVER与JBOSS SERVER
使用APACHE WEBSERVER作为JBOSS的前端,以达到HA的效果,又能提高20%的性能
结合方式是使用mod_jk mod_proxy_ajp mod_proxy_http
7.三种方式的比较
mod_proxy_ajp要高于其他两种
8.引入mod_cluster
9.web.xml中关于JSP的调优
development=false,避免访问前的检查
checkInterval=0,避免JSP需要重新编译
trimSpaces=true,删除JSP中的空格
genStringAsCharArray=true

JBOSS中SERVICE的调优

SESSION BEAN
1.stateless session bean在池中数量大小的配置
每建一个SESSION BEAN,就会在jboss.j2ee域下建一个MBEAN,通过查看其信息得知BEAN的处理统计时间来调整BEAN数量大小,配置文件:/deploy/ejb3-interceptors-aop.xml
2.stateful session bean
SFSB是被JBOSS缓存在容器中,因此客户端的每个请求都会立即响应,同样也是通过SLSB的方式查看并调整CACHE的数量大小
3.SFSB与 SLSB的比较
SFSB性能要差10%
4.事务
EJB与普通RMI SERVICE相比,就是有完整的事务支持,如果EJB采用CMT,则可以保证其方法是在全局的事务上下文中被执行的,但开启事务的成本太高,如果不需用到事务的方法需将事务关闭
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
5.自定义EJB容器
JBOSS是以拦截器的方式运行EJB的,如果EJB中不需要事务的支持,可将这个INTERCEPTOR注释掉
<interceptor-ref name="org.jboss.aspects.
tx.TxPropagationInterceptor"
/>
6.比较软的方式自定义EJB容器
将定义写在新的XML文件中,以覆盖原先的设定
<?xml version="1.0" encoding="UTF-8"?>
<aop xmlns="urn:jboss:aop-beans:1.0">
<domain name="Non Tx Stateless Bean" extends="Intercepted Bean"
inheritBindings
="false">
<bind pointcut="execution(public * *->*(..))">
<interceptor-ref name="org.jboss.ejb3.stateless.
StatelessInstanceInterceptor"
/>
<interceptor-ref name="org.jboss.ejb3.
AllowedOperationsInterceptor"
/>
<stack-ref name="EJBInterceptors"/>
</bind>
</domain>
</aop>

JMS
1.基本概念
JMS provider:JMS系统
Messages:客户端交流的载体
Connection factories:产生链接的工厂
Destinations:有Queues和Topics
Queues:含有一堆Messag的队列,只能发给一个客户端
Topics:可以发给多个客户端
JMS clients:生产和消费Message的东西
MDB:一个特殊的consumer
2.JMS架构
如果客户端和服务器端同一个JBOSS,则通过JCA作通讯,通过调整deploy/jca-jboss-beans.xml中的WorkManagerThreadPool的参数来调优,
如果不在一个JBOSS内,则通过远程框架进行通讯,通过调整deploy\messaging\remoting-bisocket-service.xml中的org.jboss.remoting.transport.Connector里的参数大小来调优
3.调优JBoss Messaging Connectionfactory
deploy\messaging\connection-factories-service.xml
4.调优JBoss Messaging destinations
在deploy/messaging中增加*–service.xml文件,从而增加MBEAN,来增加队列,再调整其参数
5.HornetQ
是JBOSS 6.0之后的JMS服务器,没有依赖于任何JBOSS包,可以嵌于任何程序中。
调优主要针对deploy/hornetq/hornetq-configuration.xml文件中的journal和transport参数
journal:journal-directory-存放message的地方,如果与其他文件夹共享,则会降低性能;journal-min-files:生成文件的个数,如果发现新文件建立的次数非常频繁,则考虑加大此数值来避免
6.JMS调优基本原则
减少message的大小;使用DUPS_OK_ACKNOWLEDGE;重用JMS资源,如connections, sessions, consumers, and producers;可以不持久化message的就不持久化。


持久层的调优

数据库设计调优
1.减少表所占的空间
这样IO读速度会加快,更少的内存;列的数据类型选少的;表设计要正规化(如果是报表类型的程序则非正规化的表速度要好)
2.数据库分割
如果某个表数据量太大,可将此表按某种逻辑分割成若干个小表,如按月份分成不同的表,不同月份的数据就放于不同的表中;
如果某个表中字段数太多,可将某些字段分组,不同的组建不同的表,如将BLOB类型的字段分割到新表中;
3.增加索引
对查询中用得比较锪WHERE字段做索引,索引数据是被抽出来,进行排序后单独存放的,如果不加索引,排序的动作只能在SQL被执行的时候做;
如果做了索引的字段被修改,则该字段的索引同样也要被修改,重新排序,这也会带来性能问题,因此一个表中最多只能放4-5个索引;
但如果这个表是只读的,则索引可以随意增加;
如果有组合索引,则UNIQUE的,值比较大的字段放在前面会比较好;
索引可以加在HIBERNATE的注释中

JDBC的调优
1. 使用链接池来链接数据库
数据链接的建立和关闭是一个非常昂贵的操作,能重用就重用,客户端从PreparedStatement Cache中取得对象,PreparedStatement再从链接池中取得链接,从而得以进行对数据库的操作
2.设置正确的fetch大小
如果设置了fetch大小为100,则JDBC会从数据库中取回100条记录,这样从ResultSet中读取next()是,是从内存中返回数据,超过了100再从数据库中取100以备用;
此数值一般设为当次查询总量的一半或1/4,但如果随便设高,性能反而下降;
JBOSS中设置全局大小:<connection-property name="defaultFetchSize">50</
connection-property>
3.INSERT和UPDATE使用批量操作
4.使用PreparedStatement而不使用Statement
PreparedStatement能避免SQL语句重复解释;使用PreparedStatement cache来缓存PreparedStatement对象
5.JDBC网络调优
<connection-property name="tcpSndBuf">65534</connection-property>
<connection-property name="tcpRcvBuf">65534</connection-property>
<connection-property name="tcpNoDelay">true</connection-property>


JPA/HIBERNATE调优
使用JDBC的限制:
由于是使用了原生的SQL语句,但不同的数据库SQL语句也是不同的,如果换数据库的时候SQL语句改动量大;
多表关联时,需维护JAVA OBJECT与数据表的对应关系;
加缓存时,工作量也比较大。
JPA与HIBERNATE的区别:JPA是JAVA的一个标准,HIBERNATE是JPA的一个实现
1.优化对象获取
HIBERNATE的N+1总量,如果有两个表是一对多的关系,查询父表的时候,子表的数据是不会被查出来的,直到调用查询子表的方法时子表的数据才被查出来,因此而多出一个SQL语句
使用LEFT OUTER JOIN来达到只用一个SQL语句就查出父表和子表的数据
Query q = entityManager.createQuery("from Customer c left outer join
fetch c.items order by c.id");

2.以分页的方式限制一次性获取数据的数量
q.setFirstResult(page*100).setMaxResults(100);

3.不能同时使用分页和FETCH的方式
HIBERNATE的分页,是首先取出所有的数据再在内存中分页,以避免不同数据库中分页语句的不同
4.使用BatchSize
@BatchSize(size = 50)
加载相关联的实体集合的个数,注意个数的对象是集合,不是集合里的单个元素
5.使用named queries作查询
这样会使用到PreparedStatement中的绑定参数
6.使用批量更新与插入
Session session =HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
for (int index = 0; index <1000;index++) {
Person person
= new Person();
book.setCountry(
"Usa");
book.setCity(
"NY");
person.setName(
"Inhabitant n." + index);
session.save(person);
// Flush every 50 records
if (index % 50== 0) {
session.flush();
session.clear();
}

}

session.getTransaction().commit();
session.close();

7.使用HIBERNATE CACHE
一级缓存,在SESSION关闭前都可以使用;
二级缓存,HIBERNATE使用第三方CACHE框架来做缓存
<property name="hibernate.cache.use_second_level_cache"
value
="true"/>
<property name="hibernate.cache.region.factory_class"
value
="org.hibernate.cache.jbc2.
JndiMultiplexedJBossCacheRegionFactory"
/>
<property name="hibernate.cache.region.jbc2.cachefactory"
value
="java:CacheManager"/>
<property name="hibernate.cache.region.jbc2.cfg.entity"
value
="mvcc-entity"/>
<property name="hibernate.cache.region.jbc2.cfg.collection"
value
="mvcc-entity"/>
启用缓存
@Entity
@Cache(usage
= CacheConcurrencyStrategy.TRANSACTIONAL, region =
"customers")
public class Customer implements Serializable {
}

查询缓存
<property name="hibernate.cache.use_query_cache" value="true"/>

启用查询缓存
@NamedQueries(
{
@NamedQuery(
name 
= "findCustomersByName",
query 
= "FROM Customer c WHERE c.name = :name",
hints 
= { @QueryHint(name = "org.hibernate.cacheable", value =
"true") }

)

使用缓存的策略:静态数据可以考虑,但查询和更新频率很高的、查询条件非常复杂的不建议用

posted @ 2012-05-25 18:17 paulwong 阅读(1186) | 评论 (0)编辑 收藏

IN ACTION系列原版书籍下载

http://www.wowebook.be/category/java/

http://www.wowebook.be/tag/ejb

http://www.wowebook.be/tag/cookbook

http://www.verycd.com/topics/2900746/

http://prefiles.com/1tiu8uvlvjvn/Packtpub.High.Availability.MySQL.Cookbook.Apr.2010.rar

http://prefiles.com/wxybvao8ofgy/Packtpub.Joomla.1.5.Top.Extensions.Cookbook.Oct.2010.rar

http://prefiles.com/t89nfm7kfn9h/Packtpub.Joomla.1.5.Cookbook.Oct.2010.rar

http://prefiles.com/32z90y8gzvln/Packtpub.Linux.Shell.Scripting.Cookbook.Jan.2011.rar

http://prefiles.com/7jjrzdgkrx23/Oreilly.MySQL.Cookbook.2nd.Edition.Nov.2006.rar

http://prefiles.com/5bwd939mcmwa/Packtpub.Android.3.0.Application.Development.Cookbook.Jul.2011.rar

http://prefiles.com/fyo2eodo2krm/Packtpub.Apache.Maven.3.Cookbook.Aug.2011.rar


http://prefiles.com/tcbaaaezwk63/Oreilly.Apache.Cookbook.2nd.Edition.Dec.2007.rar

http://prefiles.com/fi3r3b2cmeg3/Oreilly.HTML5.Cookbook.Nov.2011.rar

http://prefiles.com/ksvcwkl6gxnu/Addison.Wesley.HTML5.Developers.Cookbook.Dec.2011.rar

http://prefiles.com/rpiib56cv7i3/Wrox.Professional.Oracle.Weblogic.Server.Oct.2009.rar

http://prefiles.com/v8hlqhlfxz9i/Packtpub.Java.EE.6.with.GlassFish.3.Application.Server.Jul.2010.rar

http://prefiles.com/r15kwoscothw/Manning.POJOs.in.Action.Jan.2006.rar

posted @ 2012-05-22 23:23 paulwong 阅读(1203) | 评论 (0)编辑 收藏

Run Jetty Run - Eclipse插件

Introduction

Because Run-Jetty-Run(RJR) use full project classpath to run the web application, and we did some finetune job for maven by default.

So you could use RJR to run Maven web based web application WITHOUT ANY CONFIGURATION.

Simple click "Run Jetty" and then it works.

Forgot those configuration in pom.xml or WTP and save your time, use RJR to run it today.

For more details about how to run RJR, please referenced to GettingStarted and UserGuide .

Try it , you will love it. ;)


http://code.google.com/p/run-jetty-run/

posted @ 2012-05-22 10:44 paulwong 阅读(1407) | 评论 (0)编辑 收藏

eclipse快捷键

常用快捷键:

Ctrl+1 快速修复
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)


编辑

全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
java编辑器 显示工具提示描述 F2
java编辑器 选择封装元素 Alt+Shift+↑
java编辑器 选择上一个元素 Alt+Shift+←
java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y


查看

全局 放大 Ctrl+=
全局 缩小 Ctrl+-


窗口

全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-


导航

java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
java编辑器 转至上一个成员 Ctrl+Shift+↑
java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L


搜索

全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G


文本编辑

文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓


文件

全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N


项目

全局 全部构建 Ctrl+B


源代码

java编辑器 格式化 Ctrl+Shift+F
java编辑器 取消注释 Ctrl+\
java编辑器 注释 Ctrl+/
java编辑器 添加导入 Ctrl+Shift+M
java编辑器 组织导入 Ctrl+Shift+O
java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。也可以使用Ctrl+1自动修正。


运行

作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U


重构

作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y

posted @ 2012-05-20 21:53 paulwong 阅读(198) | 评论 (0)编辑 收藏

基于Mule的ESB技术

http://www.hitb.com.cn/web/guest/bbs/-/message_boards/category/10511

posted @ 2012-05-20 11:39 paulwong 阅读(316) | 评论 (0)编辑 收藏

JMeter使用介绍

http://www.hitb.com.cn/web/guest/bbs/-/message_boards/message/13785#_19_message_13785

在录制过程中,如果想去掉讨厌的JS或CSS,可以在HTTP代理服务器的不包含样式中添加:
.*\.css
.*\.js
.*\.gif
.*\.jpg

在MAVEN中运行JMETER:
https://bitbucket.org/hascode/jmeter-multiuser-profiling/src

posted @ 2012-05-20 11:05 paulwong 阅读(308) | 评论 (0)编辑 收藏

模拟招商银行叫号业务办理流程

http://blog.csdn.net/qiaoyupeng/article/details/6746444

posted @ 2012-05-20 10:43 paulwong 阅读(220) | 评论 (0)编辑 收藏

spring3MVC+JSON

 <!-- 自动解析action返回值 解析成json格式 -->
<context:component-scan base-package="com.bplow.*.web" />  
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >  
    
<property name="messageConverters">  
        
<util:list id="beanList">  
            
<ref bean="mappingJacksonHttpMessageConverter"/>  
        
</util:list>  
    
</property>  
</bean>  
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  
    
<property name="supportedMediaTypes">  
        
<list>  
            
<value>text/html;charset=UTF-8</value>  
        
</list>  
    
</property>  
</bean>  
<!-- 自动解析action返回值 解析成json格式 -->

然后需要额外的jar包 jackson 1.1,这里让我很无语,我首先下的1.9放上去什么方法找不到,换1.8x 方法找不到 我一直试到1.6 后来怒了用最老的 好了。。。坑,这绝对是坑啊

然后你的action中直接返回对象,集合,map吧 非常爽啊。测试如下





package com.bplow.test.web;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestAction {

// ResponseBody 对应string则对应ajax getText
@RequestMapping(value = "/testAction", method = RequestMethod.GET)
@ResponseBody
public String allOnActivities() throws UnsupportedEncodingException {

return "{'title':'HelloWorldGOGOGO'}";
}


@RequestMapping(value
= "/testAction2", method = RequestMethod.GET)
@ResponseBody
public TestVo getJsonVo() {

TestVo vo
= new TestVo();
vo.setTitle(
"吃吧");
return vo;
}


@RequestMapping(value
= "/testAction3", method = RequestMethod.GET)
@ResponseBody
public List getJsonList() {

TestVo vo
= new TestVo();
vo.setTitle(
"吃吧");
List l
= new LinkedList();
l.add(vo);
l.add(vo);
l.add(vo);
l.add(vo);
l.add(vo);
return l;
}


@RequestMapping(value
= "/testAction4", method = RequestMethod.GET)
@ResponseBody
public Map getMap() {

TestVo vo
= new TestVo();
vo.setTitle(
"吃吧");
HashMap hsm
= new HashMap();
hsm.put(
"a", 123);
hsm.put(
"b", "123");
hsm.put(
"c", vo);
return hsm;
}

}

posted @ 2012-05-18 00:14 paulwong 阅读(1348) | 评论 (0)编辑 收藏

仅列出标题
共112页: First 上一页 77 78 79 80 81 82 83 84 85 下一页 Last