ZendFramework2学习笔记 json和ajax

要实现zf2的控制器输出json数据,主要要解决2个问题,第一个就是修改header头的Content-type部分为



‘Content-Type: application/json‘,第二个就是输出json数据。

修改header头,可以手动修改也可以自动修改。

自动修改的方式是,使用zf2的JsonRenderer,或者json的view helper:

1)使用JsonRenderer的方法:zf2默认使用PhpRender,因此需要在项目启动的时候,修改renderer。在启动模块(Application)的onBootStrap方法中,添加一个render事件的linstener(registerJsonStratery),

    public function onBootstrap($e)
    {
        // Register a render event
        $app = $e->getParam('application');
        $app->getEventManager()->attach('render', array($this, 'registerJsonStrategy'), 100);
    }

在lisntener中将jsonStratery sttach到View的EventManger上,

    public function registerJsonStrategy($e)
    {
        $matches    = $e->getRouteMatch();
        $moduleRootName = $matches->getMatchedRouteName();//$moduleaRootName是在module.config.php中配置的route名称
        if ($moduleRootName != 'test') { //该模块所有控制器都设置为JsonRenderer
            return;
        }

        $app          = $e->getTarget();
        $locator      = $app->getServiceManager();
        $view         = $locator->get('Zend\View\View');
        $jsonStrategy = $locator->get('ViewJsonStrategy');

        $view->getEventManager()->attach($jsonStrategy, 100);
    }

2)使用view helper的方法:在控制器里面禁用layout($view->setTerminal(true);)或者在layout里面不要输出任何html,然后view里面json输出,

$arr = array();
$arr[] = 1111;
$arr[] = 'aaaa';

echo $this->json($arr);

手动修改header头的方式,在view里面(禁用layout)或者在layout里面输出,

header('Content-Type: application/json');

zf2提供了json编解码类Zend\Json\Json用于json数据编解码,该类会先尝试使用php函数json_encode和json_decode进行编解码,如果php不支持这2个函数,该类则会使用php脚本进行编解码,因此,在zf2中尽量使用该类而不要使用php的json_encode和json_decode进行编解码。

例子1:让单个控制器的action输出json,

方法一:

//控制器代码

use Zend\Json\Json;

//.......

$arr = array();
$arr[] = 1111;
$arr[] = 'aaaa';
$jsonData = Json::encode($arr); 

$view =  new ViewModel(array(
    'jsonData' => $jsonData
));

$view->setTerminal(true);

return $view;

//或者

$arr = array();
$arr[] = 1111;
$arr[] = 'aaaa';

$view =  new ViewModel(array(
    'arr' => $arr
));

return $view;

//视图代码

header('Content-Type: application/json');

echo $this->jsonData;

//或者

echo $this->json($this->arr);

方法二:新建一个layout文件如下,

//view/layout/json.phtml

header('Content-Type: application/json');

控制器代码,

use Zend\Json\Json;

//.......

$layout = $this->layout();
$layout->setTemplate('layout/json');

$arr = array();
$arr[] = 1111;
$arr[] = 'aaaa';
$jsonData = Json::encode($arr); 

$view =  new ViewModel(array(
    'jsonData' => $jsonData
));

return $view;

视图代码,

echo $this->jsonData;

例子2:让某个模块或者某个控制器都输出json,将renderer改为JsonRenderer并且更换默认的php layout后,就直接在view中输出json数据了,

    public function onRoute(MvcEvent $e)
    {
        $matches    = $e->getRouteMatch();
        $moduleRootName = $matches->getMatchedRouteName();//$moduleaRootName是在module.config.php中配置的route名称
        if ($moduleRootName != 'test') { //该模块所有控制器都设置为JsonRenderer
            return;
        }
        $controllerName = $matches->getParam('controller');//$controllerName是在module.config.php中配置的controller名称
	if ($controllerName != 'Test\Controller\Test') { //该控制器所有actions都设置为JsonRenderer
            return;
        }

        $e->getViewModel()->setTemplate("layout/json");
    }

    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);

        $eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'onRoute'), -9000);
        $eventManager->attach('render', array($this, 'registerJsonStrategy'), 100);
    }

    public function registerJsonStrategy($e)
    {
        $matches    = $e->getRouteMatch();
        $moduleName = $matches->getMatchedRouteName();

        $matches    = $e->getRouteMatch();
        $moduleRootName = $matches->getMatchedRouteName();//$moduleaRootName是在module.config.php中配置的route名称
        if ($moduleRootName != 'test') { //该模块所有控制器都设置为JsonRenderer
            return;
        }
        $controllerName = $matches->getParam('controller');//$controllerName是在module.config.php中配置的controller名称
	if ($controllerName != 'Test\Controller\Test') { //该控制器所有actions都设置为JsonRenderer
            return;
        }

        $app          = $e->getTarget();
        $locator      = $app->getServiceManager();
        $view         = $locator->get('Zend\View\View');
        $jsonStrategy = $locator->get('ViewJsonStrategy');

        $view->getEventManager()->attach($jsonStrategy, 100);
    }

之后,就可以直接在浏览器端的javascript中通过ajax获取json数据了:

<script lang="javascript">
    $(document).ready(function(){

        $("#b01").click(function(){

            htmlobj=$.ajax({url:"/test/json",async:false});

            alert(htmlobj.responseText);

        });

    });
</script>



时间: 2024-10-04 14:03:34

ZendFramework2学习笔记 json和ajax的相关文章

[ajax 学习笔记] json数据格式

之前写过ajax传送数据可以用普通文本和XML两种格式.这里记一下json数据格式. json:javascript object notation. 之前分析过,用文本和XML传送数据各有优劣.而json可以轻松地将javascript对象转换成可以随时发送的数据. 一个json数据例子: var people = { "programmers": [ { "firstName": "Brett", "lastName":&

jQuery学习笔记10:Ajax技术

jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. jQuery 采用了三层封装:最底层的封装方法为:$.ajax(),而通过这层封装了第二层有三种方法:.load().$.get()和$.post(),最高层是$.getScript()和$.getJSON()方法. 函数 描述 jQuery.ajax() 执行异步 HTTP (Ajax) 请求. .ajaxComplete() 当 Ajax 请求完成时注册要调用的处理程序.这是一个

[转]Spring MVC 学习笔记 json格式的输入和输出

Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.8.1</version>

JS学习笔记-JSON

JSON(JavaScriptObject Notation)-JS对象表示法,是JavaScript的一个严格子集,它是一种开发式和基于文本的数据交换格式,因此JSON并不是JS独有,其他很多语言也可以对JSON进行解析和序列化. 特点: 1.轻量级-易于阅读和编写,同时易于及其解析和生成 2.可表示类型: (1)简单值:字符串.数值.布尔值.null,不支持特殊值JS中的undefined (2)对象 { "user" : "Admin", "age&

jvascript学习笔记---Json数据格式

JSON(JavaScriptObject Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包. JSON的规则很简单:对象是一个无序的“‘名称/值’对”集合.一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”(冒号):“‘名称/值’对”之间使用“,”(逗号)分隔. 简单的例子: var user = { "username":"andy&quo

《ASP.NET MVC 4 实战》学习笔记 8:Ajax(下)

三.使用JSON和客户端模板的Ajax: 1.使用JSON的Ajax:1)添加模型: { public class Speaker { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string PictureUrl { get; set; } public string Bio { get; set; } public s

ajax学习笔记3-jQuery实现ajax(大拇指向上)

jQuery实现ajax: jQuery本身提供了一个ajax方法,jQuery.ajax([settings]) type:类型,”POST”或”GET”(默认) url:发送请求的地址 data:是一个对象,连同请求发送到服务器的数据 dataType:预期服务器返回的数据类型,如果不指定,jQuery将自动根据HTTP包MIME信息来智能判断,一般采用json格式,可以设置为“json” success:是一个方法,请求成功后的回调函数.传入返回后的数据,以及包含成功代码的字符串. err

Spring MVC 学习笔记 json格式的输入和输出

Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.8.1</version>

ZendFramework2学习笔记 文件上传、文件上传进度

修改php.ini以适应文件的要求: //php.ini file_uploads = On post_max_size = 600M upload_max_filesize = 600M session.upload_progress.enabled = On session.upload_progress.freq = "1%" session.upload_progress.min_freq = "1" 以上我们限制了文件大小限制在不超过600MB. 关于文件