stuts2返回json数据简单实现

stuts2返回json数据简单实现

整理了下struts2的简单demo,完成JSON数据的展示。基本流程是在Action定义一个对象属性,例如map类型的一个成员变量,提供getter方法,然后配置action的result的试图类型为json,这样在页面上访问Action的这个map成员变量时,struts2就会返回这个map成员的JSON格式。以下例子就是Action中定义了一个Map类型的result成员,对应的action视图类型为json,那么在JSP页面的ajax请求响应success分支中,获取到的就是json格式的数据。

Action定义:

public class ValidateAction extends ActionSupport {  
    private static final long serialVersionUID = 1L;  
    private String username;  
    public Map<String, Object> result = new HashMap<String, Object>();  
    public Map<String, Object> getResult() {  
        return result;  
    }  
    public String execute() throws Exception {  
        if ("zhangsan".equals(username)) {  
            result.put("message", "success结果");  
            return Action.SUCCESS;  
        }else {  
            System.out.println("error结果");  
            result.put("message", "error结果");  
            return Action.ERROR;  
        }  
    }  
    public String getUsername() {  
        return username;  
    }  
    public void setUsername(String username) {  
        this.username = username;  
    }  
}  

配置Action:

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">  
<struts>  
    <package name="default" extends="json-default">  
        <action name="validate" class="ValidateAction">  
             <result type="json" />  
             <result name="error" type="json"></result>  
        </action>  
    </package>  
</struts> 

页面访问JSP:

<%@ page language="java" contentType="text/html; charset=utf-8"  
    pageEncoding="utf-8"%>  
<%  
    String path = request.getContextPath();  
    String basePath = request.getScheme() + "://"  
            + request.getServerName() + ":" + request.getServerPort()  
            + path + "/";  
%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
 <head>  
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />  
    <title>Welcome to BoadVedio</title>  
    <script type='text/javascript' src="<%=basePath%>resource/js/jquery-1.8.3.js"></script>  
    <script type="text/javascript">  
            var basePath = '<%=basePath%>';  
            function validate(){  
                var username = document.getElementById("username").value;  
                $.ajax({  
                    url:basePath+"validate.action",  
                    type:"post",  
                    dataType:"json",  
                    data:{username:username},  
                    success:function(data){  
                        var message = data.result.message;  
                        $('#message').html(message);  
                    },  
                    error : function(XMLHttpRequest, textStatus, errorThrown) {  
                        alert("error when insert.");  
                    }  
                });  
            }  
    </script>  
  </head>  
  <body>  
    <input type="text" name="username" id="username"/>  
    <input type="button" value="提交"  
    <div id="message"></div>  
  </body>  
</html>    

测试基本功能没有问题。只是对于Action的返回值是SUCCESS还是ERROR,对页面是有影响的。上述配置,action配置中的success和error类型都是JSON,这样不管Action走入的是return SUCCESS还是ERROR分支,都会把成员变量result对象转化成JSON返回给页面的,ajax请求都是走入success分支中的。但是如果把error类型配置成一个jsp,那么,此时ajax的请求返回时是进入了error分支了

<struts>  
    <package name="default" extends="json-default">  
        <action name="validate" class="ValidateAction">  
             <result type="json" />  
             <result name="error" >/error.jsp</result>  
        </action>  
    </package>  
</struts> 

而且浏览器并没有自动跳转到error.jsp页面去。那么问题来了:为什么配置error为error.jsp的时候,ajax请求走入了error分支呢?这个应该是ajax请求的dataType类型设置成了json,如果此时Action返回了error.jsp,那么ajax会视为异常。

还有个问题就是,action的哪些成员变量会被转化成JSON数据返回给页面呢?如果我定义了多个关联的类对象,那么是不是它们都会放入json返回值中呢?待验证。

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2017-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

JVM入门——运行时数据区

jdk1.7.0_79  ?   这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课。其中的“堆”和“虚拟机栈(栈)”更是耳熟能详。...

20950
来自专栏java学习

1.3java的运行原理

java的运行原理 这里我们简单分析一下我们的第一个应用程序,其中涉及到很多没有接触过的概念,大家可先阅读以下,以后会详细讲解。重点是理解java的运行原理。 ...

38540
来自专栏Janti

Java多线程高并发学习笔记(一)——Thread&Runnable

 进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活...

753100
来自专栏流柯技术学院

TestNG官方文档中文版(2)-annotation

TestNG的官方文档的中文翻译版第二章,原文请见 http://testng.org/doc/documentation-main.html 2 - Ann...

13110
来自专栏微信公众号:Java团长

阿里历年经典Java面试题汇总

当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。

14220
来自专栏老付的网络博客

java对象头

Java是一个面向对象的语言,在Java中可以使用new关键字来产生一个对象,但这个对象到底是什么,应该具有哪些属性?

51520
来自专栏cnblogs

knockout源码分析之computed(依赖属性)

一、序列图 ? 二、主要代码文件 1、dependentObservable.js:主要包含ko.computed相关方法的处理 2、dependencyDet...

21950
来自专栏java工会

阿里历年经典Java面试题汇总

17260
来自专栏Java学习之路

03 Spring框架 bean的属性以及bean前处理和bean后处理

整理了一下之前学习spring框架时候的一点笔记。如有错误欢迎指正,不喜勿喷。 上一节我们给出了三个小demo,具体的流程是这样的: 1.首先在aplicat...

32760
来自专栏python3

python 用户交互

input是个内建函数,具体用法:接收用户输入的内容,输入的字符串,接收到就是字符串;输入的是数字,接收的就是数字

14420

扫码关注云+社区

领取腾讯云代金券