Ext学习Reader_Writer

本文深入解析了Ext JS中的Reader与Writer组件的功能、配置与应用,包括如何通过Reader读取JSON/XML数据并转换为Model,以及如何通过Writer将Model转换为JSON/XML数据用于后台交互。

首先概念要清楚:

Reader:主要用于将Proxy数据dialing读取的数据按照不同的规则进行解析, 将解析好的数据保存到Model中

结构图:Ext.data.reader.Reader  读取器的根类
                     Ext.data.reader.Json  JSON格式的读取
      Ext.data.reader.Xml  XM格式的读取器

Writer

机构图:Ext.data.writer.Writer
                      Ext.data.writer.Json   对象被解析成JSON的形式
      Ext.data.writer.Xml    对象被解析成XML形式传到后台

我们先看看API上面的图:




(function(){
	Ext.onReady(function(){
		 var userData={
			 //total:200,
			 
			 count:200,
			 user:[{auditor:'wangfangchen',info:{
			     userID:'1',
			     name:'uspcat.com',
			     orders:[
			    	 {id:'001',name:'pen'},
			    	 {id:'002',name:'book'}
			    	 ]
			 }}]
		 };
		 
		 //model
		 Ext.regModel("user",{
			 fields:[
				 {name:'userID',type:'string'},
				 {name:'name',type:'string'}
				 ],
				 hasMany: {model: 'order'} //name: 'products'}
		 });
		 
		 Ext.regModel("order",{
			 fields:[
				 {name:'id',type:'string'},
				 {name:'name',type:'string'}
				 ],
		    //   belogsTo:{type:'belongsTo',model:'user'}
		  associations: [
        { type: 'belongsTo', model: 'order' }
    ]
		 });
		 
		 var mproxy = Ext.create('Ext.data.proxy.Memory', {
			   // autoLoad: true,
			    model: 'user',
			    data : userData,
			    reader:{
			 type:'json',
			 root:'user',
			 implicitIncludes:true, //让关系级联
			 totalProperty:'count',
			 record:'info'   //服务器返回的数据可能很负载,用有用的数据信息装载到model中
			    }
			});
		 mproxy.read(new Ext.data.Operation(), function(result){
			 var datas=result.resultSet.records;
			// alert(result.resultSet.total);
			 alert(result.resultSet.total);
			 Ext.Array.each(datas,function(model){
				 alert(model.get('name'));
			 });
			 var user=result.resultSet.records[0];
			 var orders=user.orders();
			 orders.each(function(order){
				 alert(order.get('name'))
			 });
		 })
	}); 
})();


这个JSON类型的Reader应该:

1.简单用了JSON读取器,讲了下几个配置参数的用法
2.回顾一对多,多对一的数据模型建立方式
3.内存的代理装载数据,读取数据
4.提了一下Store关于each()的用法


Reader Writer 都是依托代理的实现的
Reader;是把负责的业务逻辑而翻译的一种格式通过很多配置参数来读到
Ext中转换成Model层


Writer:就是把现有的Model转换成Json和Xml传回到后台,然后再后台



下面我们看一看:数组形式的

(function(){
 Ext.onReady(function(){
	Ext.regModel("person",{
	   fields:[
		   'name','age'    //两种格式
		   //{name:'name'},
		   //{name:'age'}
		   ],
		   
		   //做一个代理
	    proxy:{
		    type:'ajax',
		    url:'person.jsp',
		    reader:{
		    type:'array'
		    }
		   }
    });
	
	var user=Ext.ModelManager.getModel('person');
		user.load(1,{
			success:function(model){
			alert(model.get('name'));
			}
	})
	})
})();

这个地方要注意一下:它的代理方式是
  reader:{
		    type:'array'
		    }
那么我们在后台传入的时候就需要用数组的形式传到前台了,看看person.jsp这个文件
<pre name="code" class="plain"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
response.getWriter().write("[['wangfangchen',26]]");
%>

这个是大家一定要理解清楚的。


</pre><pre name="code" class="javascript">
</pre><pre name="code" class="javascript">
下面看看XML格式的读取器:
<pre name="code" class="html">(function(){
	Ext.onReady(function(){
		Ext.regModel("user",{  //建立模型
			fields:[
				{name:'name'},
				{name:'id'}
				],
				
				proxy:{       //做一个
			       type:'ajax',
			       url:'users.xml',
			       reader:{
		             type:'xml',
		             record:'user'
			       }
				}
		});
		//生成模型
		var user=Ext.ModelManager.getModel('user');
		user.load(1,{
			success:function(model){
			alert(model.get('name'));
			
			}
		})
	})
})();


type:'xml',那对应的读取数据就是一个xml格式的,下面看看url:‘user.xml'
<pre name="code" class="html"><users>
    <user>
       <name>uspcat.com</name>
       <id>001212</id>
    </user>
</users>



</pre><pre name="code" class="javascript">最后看看writer写入器:xml和JSON
其实这两种格式都差不多,只要改一下格式就OK。
<pre name="code" class="html">//所谓写Write(实际上就是返回到后台取,前台数据返回到后台取)
(function(){
Ext.onReady(function(){
	Ext.regModel("person",{
	   fields:[
		   'name','age'    //两种格式
		   //{name:'name'},
		   //{name:'age'}
		   ],
		   
		   //做一个代理
	    proxy:{
		    type:'ajax',
		    url:'person.jsp',
		    writer:{
		       type:'json'
		    }
		   }
    });
	
	Ext.ModelMgr.create({
		name:'uspact.con',
		age:1 
	},'person').save();
})
})();



url:'person.jsp',这个jsp是用来获取这个.js传递过来的数据,是json格式或者xml格式,然后处理相应的业务逻辑。
</pre><pre name="code" class="javascript">这个type:'json’传递过去的格式就是JSON格式,是‘xml'那么传递过去的就是xml格式。
</pre><pre name="code" class="javascript">看下面调试的图大家就清晰了:
<img src="https://img-blog.youkuaiyun.com/20140906160146703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXRKYXZhd2Zj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.youkuaiyun.com/20140906160409122?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXRKYXZhd2Zj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

分析以下代码使用方法 import os import PyPDF2 import math def split_pdf_by_size(input_pdf_path, output_dir, max_size_mb=50): """按文件大小拆分PDF的核心函数""" # 确保输出目录存在 os.makedirs(output_dir, exist_ok=True) print(f"📂 输出目录: {output_dir}") try: with open(input_pdf_path, 'rb') as pdf_file: pdf_reader = PyPDF2.PdfReader(pdf_file) total_pages = len(pdf_reader.pages) print(f"✅ 成功加载PDF,共 {total_pages} 页") # 获取文件大小信息 file_size = os.path.getsize(input_pdf_path) print(f"📊 原始文件大小: {file_size/1024/1024:.2f} MB") # 计算每页平均大小 avg_page_size = file_size / total_pages print(f"📄 每页平均大小: {avg_page_size/1024:.2f} KB") # 计算拆分方案 max_size_bytes = max_size_mb * 1024 * 1024 max_pages_per_file = math.floor(max_size_bytes / avg_page_size) total_files = math.ceil(total_pages / max_pages_per_file) print(f"🔍 计算完成:将拆分为 {total_files} 个文件,每个最多 {max_pages_per_file} 页") # 执行拆分 for file_num in range(total_files): start_page = file_num * max_pages_per_file end_page = min((file_num + 1) * max_pages_per_file, total_pages) - 1 pdf_writer = PyPDF2.PdfWriter() for page_num in range(start_page, end_page + 1): pdf_writer.add_page(pdf_reader.pages[page_num]) # 生成输出文件名 input_filename = os.path.basename(input_pdf_path) filename_without_ext = os.path.splitext(input_filename)[0] output_filename = f"{filename_without_ext}_part_{file_num + 1}.pdf" output_path = os.path.join(output_dir, output_filename) # 写入文件 with open(output_path, 'wb') as output_file: pdf_writer.write(output_file) print(f"✅ 已生成 {file_num + 1}/{total_files}:包含第{start_page + 1}-{end_page + 1}页") print(f"\n🎉 所有文件已保存到: {output_dir}") return True except Exception as e: print(f"❌ 拆分失败: {str(e)}") return False def main(): # -------------------------- # 👇 在这里修改你的参数 # -------------------------- input_pdf_path = r"e:\考研\英语\2026考研英语词汇.pdf" # 你的PDF文件路径 output_dir = r"e:\考研\英语\拆分后的文件" # 输出目录 max_size_mb = 50 # 每个文件最大大小(MB) # 检查输入文件是否存在 if not os.path.exists(input_pdf_path): print(f"❌ 错误: 找不到文件 - {input_pdf_path}") return # 调用拆分函数 split_pdf_by_size(input_pdf_path, output_dir, max_size_mb) if __name__ == "__main__": main()
最新发布
09-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值