`
tangyuan1314
  • 浏览: 39792 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

Struts2中JSON插件的使用及出现的问题

阅读更多

       Struts2提供了对Ajax的支持,其中JSON是Ajax插件的一种,该插件将Action属性直接序列化为JSON对象后返回给客户端,从而使客户端页面可以直接访问到Action属性。

       在Struts2中使用JSON插件,首次将json插件包导入进去,接着实现Action逻辑,在struts.xml中配置该Action,然后实现JSP页面。下面来实现一个小例子,来完成这三个步骤。

1、实现Action逻辑

一个表单,有三个表单域,对应于三个请求参数,因此在Action中用三个相应的属性来封装这三个参数。Action的实现类如下:

 

package lee;

import java.util.HashMap;
import java.util.Map;

import javax.management.loading.PrivateClassLoader;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.sun.org.apache.bcel.internal.generic.NEW;
import org.apache.struts2.json.annotations.JSON;
//import org.apache.struts2.json.*;

public class JSONExample {
    private int[] ints={10,20};
    private Map<String,String> map = new HashMap<String,String>();
    private String customName="顾客";
    private String field1;
    private transient String field2;
    private String field3;
    
    public String execute(){
    	map.put("name", "wo");
    	return Action.SUCCESS;
    }
    
    @JSON(name="newName")
    public Map getMap(){
    	return this.map;
    }

	public void setCustomName(String customName) {
		this.customName = customName;
	}

	public String getCustomName() {
		return customName;
	}

	public void setField1(String field1) {
		this.field1 = field1;
	}

	public String getField1() {
		return field1;
	}

	public void setField2(String field2) {
		this.field2 = field2;
	}

	public String getField2() {
		return field2;
	}

	public void setField3(String field3) {
		this.field3 = field3;
	}

	public String getField3() {
		return field3;
	}
    
}
 

   上面代码中使用了JSON注释,指定了name属性,作用于下面所以的getter方法,只要属性的getter方法在注释下,则JSon就会返回给客户端。

2、在struts2.xml中配置Action

<package name="example" extends="json-default">
      <action name="JSONExample" class="lee.JSONExample">
           <result type="json"/>
      </action>
 </package>
 

 

 JSON插件提供一种名为json的ResultType,一旦为某个Action指定了类型为json的result,就不不要再映射到任何的物理视图。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的字符串,并将该字符串返回给客户端页面。

 配置时需注意:a 配置strut.i18n.encoding时,编码格式要改为UTF-8编码,因为Ajax的post请求是以UTF-8的方式进                          行编码的。

                      b 配置包时,要继承json-default包,因为只有此包里才定义了json结果类型,可在json插件包里找到                            struts-plugin.xml查看里面json-default包的定义,该包实际上继承了default包

3、实现JSP页面

为方面Ajax交互,我们使用javascript的一个框架Prototype.js.同时还要用json2.js库,用于将JSON格式字符串转换成JSON对象。下面是JSP页面:

 

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'jsonDemo.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript" src=json2.js></script>
	<script type="text/javascript" src=prototype.js></script>
    <script type=text/javascript>
      function gotClick(){
          var url='JSONExample.action';
          var params=Form.serialize('form1');
          var myAjax = new Ajax.Request(url,{
             method:'post',
             parameters:params,
             onComplete:processResponse,
             asynchronous:true
          });
      }
      function processResponse(request){
          var res = JSON.parse(request.responseText);
          for(var propName in res){
              $("show").innerHTML+=propName+"-->"+res[propName]+"</br>";
          }
      }
    </script>
  </head>
  
  <body>
     <form id="form1" name="form1">
        field1:<input type="text" name="field1" id="field1"/><br>
        field2:<input type="text" name="field2" id="field2"/><br>
        field3:<input type="text" name="field3" id="field3"/><br>
        <input type="button" value="提交" onclick="gotClick()"/>
     </form>
     <div id="show">
     </div>
  </body>
</html>
 

 

      上述页面使用Prototype.js中是Ajax.Request来进行Ajax交互。

完成,测试。

不太顺利,先出现了There is no Action mapped for namespace / and action name JSONExample. 的错误,就是找不到action,将json-default包换成default可以找到action,说明是jar包版本的问题,因为json-default是在json插件jar包里的struts-plugin.xml里定义的。仔细看启动日志,发现找不到json-default的包,于是将struts-plugin.xml重新显式引入了一下,但是此时可以找到了,又出现了新的问题

Result class [org.apache.struts2.json.JSONResult] doesn't exist (ClassNotFoundException) at result-type -

java.lang.ClassNotFoundException:org.apache.struts2.json.JSONResult,即虽然找到了json-default包但是其中定义的result为json的实现类却找不到,下面是struts-plugin.xml:

 

<?xml version="1.0" encoding="UTF-8" ?> 
  <!DOCTYPE struts (View Source for full doctype...)> 
- <struts>
- <package name="json-default" extends="struts-default">
- <result-types>
  <result-type name="json" class="org.apache.struts2.json.JSONResult" default="false" /> 
  </result-types>
- <interceptors>
  <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" /> 
  </interceptors>
  </package>
  </struts>
 

说明jar还是没有发挥作用,于是将插件包jsonplugin-0.34.jar换成struts2-json-plugin-2.1.8.jar包,问题彻底解决,看来就是版本的问题啊!

总结:遇到问题首先要找出原因,仔细分析,并多借助网络。问题解决后要善于总结!

分享到:
评论

相关推荐

    struts2的json插件

    总的来说,Struts2的JSON插件极大地简化了Java Web应用中的JSON数据处理,提高了开发效率。了解并熟练使用这个插件,对于提升Web应用的用户体验和响应速度具有重要意义。无论是进行简单的数据交换还是构建复杂的前后...

    使用Struts2的JSON插件来实现JSON数据传递

    Struts2的JSON插件正是为了方便开发者在Struts2框架中处理JSON数据而设计的。 首先,让我们深入了解JSON。JSON是一种独立于语言的数据交换格式,具有易于人阅读和编写,同时也易于机器解析和生成的特点。它的数据...

    struts2+json

    在Struts2中集成JSON支持,首先需要添加相应的依赖,比如struts2-json-plugin,这个插件提供了JSON结果类型。当Action执行完毕后,可以返回一个JSON结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给...

    struts2-json-plugin

    struts2-json-plugin,Struts JSON插件

    struts2-json包集合 不会出现任何报错

    在Struts2中,JSON(JavaScript Object Notation)插件是实现前后端数据交互的重要工具,它允许开发者以JSON格式返回数据,方便前端进行处理。在标题中提到的"struts2-json包集合 不会出现任何报错",意味着这个...

    struts2与json整合

    在Struts2中,Action类中的方法负责处理来自客户端的请求。为了返回JSON数据,可以定义一个如下的Action方法: ```java public String getXxx() { return "aaa"; } ``` 当客户端调用此方法时,Struts2会自动将...

    struts2-json

    Struts2提供了JSON插件,允许开发者在Action类中返回JSON响应。安装插件后,只需在Action配置中启用JSON支持,就能自动处理JSON输出。 2. **Action配置**: 在Struts2的配置文件(struts.xml或struts.properties)...

    struts2-json-plugin源码

    在Struts2中,通过整合JSON插件,可以方便地将Action的返回结果转换为JSON格式,供前端JavaScript处理。 `struts2-json-plugin`是Struts2的一个插件,它使得Struts2能够处理JSON请求和响应,无需额外的配置或库。这...

    struts2+json的使用

    在Struts2中集成JSON,可以方便地将服务器端处理的结果以JSON格式传递给前端,简化数据传输并提高应用性能。 一、Struts2与JSON集成的必要性 在传统的Web开发中,服务器通常返回HTML页面来更新客户端视图。然而,...

    Struts2 ajax json使用介绍

    首先,为了在Struts2中使用Ajax和JSON,我们需要引入以下库: 1. Struts2的核心库:`struts2-core.jar` 2. Struts2的JSON插件:`struts2-json-plugin.jar` 3. JSON处理库:`json-lib.jar`(通常在Struts2的JSON插件...

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    这个插件允许开发者在Struts 2中轻松地创建能够返回JSON的Action,使得前端(通常使用JavaScript库如jQuery)可以获取到JSON数据并进行进一步处理。 现在我们来详细讨论这两个库在实际应用中的作用: 1. **json-...

    struts 2.0 与 2.1 需要的json插件

    在Struts 2的早期版本中,如2.0和2.1,为了支持JSON(JavaScript Object Notation)数据交换格式,开发者需要额外安装和配置JSON插件。JSON在Web应用中广泛用于前后端的数据传输,因为它轻量级、易于阅读和编写,...

    Struts2.5操作JSON相关jar包

    在Struts2中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于前后端交互,使得数据传输更加高效。本知识点主要围绕Struts2.5操作JSON的相关jar包进行详细介绍。 首先,`json包和...

    struts2返回JSON数据的两种方式

    总结,Struts2中返回JSON数据有两种主要方式:一是通过`response.getWriter().print()`手动输出JSON字符串;二是利用Struts2的内置JSON插件,通过返回特定的属性和结果类型自动处理JSON。每种方法都有其适用场景,...

    struts2-json-plugin-2.3.8.jar

    在实际开发中,为了使用这个插件,你需要将`struts2-json-plugin-2.3.8.jar`文件放入项目的类路径(classpath)下,然后在Struts2的配置文件(通常为struts.xml)中启用JSON插件。在Action类中,定义返回JSON数据的...

    struts2的json插件实例

    在Struts2中,可以通过JSON插件来实现JSON数据的处理,使得Web应用能够更方便地与AJAX或JavaScript进行交互。 本实例将详细介绍如何在Struts2项目中配置并使用JSON插件,以及如何创建一个简单的JSON响应。 首先,...

    struts2-json-lib

    1. 添加JSON插件到项目的类路径:确保`struts2-json-plugin-x.x.x.jar`在类路径中,并在`struts.xml`配置文件中启用JSON插件。 2. 配置Action:在Action类中,添加`@Result`注解或者在XML配置文件中定义结果类型为`...

    Struts2+Json+Android简单实现

    在Struts2中,我们可以配置Action类返回JSON类型的结果,这样当客户端(如Android应用)发起请求时,服务器会返回JSON格式的数据。这些数据可以包含对象、数组、字符串、数字等多种类型,非常适合移动设备上的数据...

    Struts2与JSON

    在Struts2中,我们可以使用JQuery的Ajax方法(如`$.ajax()`或`$.post()`)发送异步请求,提交表单数据到服务器,同时获取JSON响应。 整合步骤如下: 1. **配置Struts2**: 首先,确保你的项目已经引入了Struts2的...

    struts2所需的包和Struts2_json所需包

    2. **Struts2 JSON插件**:Struts2提供了一个JSON插件(`struts2-json-plugin.jar`),它允许我们将Action的返回值直接转换为JSON格式,便于前后端数据交换。这个插件简化了原本需要手动序列化对象到JSON字符串的...

Global site tag (gtag.js) - Google Analytics