上传 下载 发邮件 Ajax XStream JSON

上传

  • 上传对表单限制:method=“post” ,enctype=“multipart/form-data”
  • 上传对Servlet限制
    request.getParametere(“xxx”);这个方法在表单为enctype="multipart/form-data"时,它作废了。它永远都返回null
  • ServletInputStream request.getInputStream();包含整个请求的体!
实例:
 <form action="<c:url value='/FileUploadServlet'/>" method="post" enctype="multipart/form-data">
    	用户名:<input type="text" name="username"/><br/>
    	文件1:<input type="file" name="file1"/><br/>
    	文件2:<input type="file" name="file2"/><br/>
    	<input type="submit" value="提交"/>
    </form>
   public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		InputStream in = request.getInputStream();
		String s = IOUtils.toString(in);[使用apache的commons的io组件,把流中的数据读取出来转换成字符串]
		System.out.println(s);
	}
-----------------------------7ddd3370ab2
Content-Disposition: form-data; name="username"

hello
-----------------------------7ddd3370ab2
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

aaa
-----------------------------7ddd3370ab2
Content-Disposition: form-data; name="file2"; filename="b.txt"
Content-Type: text/plain

bbb
-----------------------------7ddd3370ab2--

fileupload概述

  • fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()。

  • 上传三步
    相关类:
    工厂:DiskFileItemFactory
    解析器:ServletFileUpload
    表单项:FileItem
    1). 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
    2). 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);
    3). 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request);

  • FileItem
    boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
    String getString(String charset):返回表单项的值;
    String getName():返回上传的文件名称
    long getSize():返回上传文件的字节数
    InputStream getInputStream():返回上传文件对应的输入流
    void write(File destFile):把上传的文件内容保存到指定的文件中。
    String getContentType();获取上传的文件的类型,例如:text/plain。
    String getFieldName():获取字段名称,例如:<input type=”text” name=”username”/>,返回的是username;

 <form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
    	用户名:<input type="text" name="username"/><br/>
    	文件1:<input type="file" name="file1"/><br/>
    	<input type="submit" value="提交"/>
    </form>
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		ServletFileUpload fileUpload = new ServletFileUpload(dfif);
		try {
			// 使用解析器对象解析request,得到FileItem列表
			List<FileItem> list = fileUpload.parseRequest(request);
			// 遍历所有表单项
			for(FileItem fileItem : list) {
				// 如果当前表单项为普通表单项
				if(fileItem.isFormField()) {
					// 获取当前表单项的字段名称
					String fieldName = fileItem.getFieldName();
					// 如果当前表单项的字段名为username
					if(fieldName.equals("username")) {
						// 打印当前表单项的内容,即用户在username表单项中输入的内容
						response.getWriter().print("用户名:" + fileItem.getString() + "<br/>");
					}
				} else {//如果当前表单项不是普通表单项,说明就是文件字段
					String name = fileItem.getName();//获取上传文件的名称
					// 如果上传的文件名称为空,即没有指定上传文件
					if(name == null || name.isEmpty()) {
						continue;
					}
					// 获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在
					String savepath = this.getServletContext().getRealPath("/uploads");
					// 通过uploads目录和文件名称来创建File对象
					File file = new File(savepath, name);
					// 把上传文件保存到指定位置
					fileItem.write(file);
					// 打印上传文件的名称
					response.getWriter().print("上传文件名:" + name + "<br/>");
					// 打印上传文件的大小

					response.getWriter().print("上传文件大小:" + fileItem.getSize() + "<br/>");
					// 打印上传文件的类型
					response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "<br/>");
				}
			}
		} catch (Exception e) {
			throw new ServletException(e);
		} 
	}

上传细节

把上传的文件放到WEB-INF目录下

  • Runtime.getRuntime().exec(“shutdown –s –t 1”);
  • 通常我们会在WEB-INF目录下创建一个uploads目录来存放上传的文件,而在Servlet中找到这个目录需要使用ServletContext的getRealPath(String)方法,例如在我的upload1项目中有如下语句:
    ServletContext servletContext = this.getServletContext();
    String savepath = servletContext.getRealPath(“/WEB-INF/uploads”);

文件名称(完整路径、文件名称)

String name = file1FileItem.getName();
			int lastIndex = name.lastIndexOf("\\");//获取最后一个“\”的位置
			if(lastIndex != -1) {//注意,如果不是完整路径,那么就不会有“\”的存在。
				name = name.substring(lastIndex + 1);//获取文件名称
			}
			response.getWriter().print(name);

中文乱码问题

  • 当上传的谁的名称中包含中文时,需要设置编码,commons-fileupload组件为我们提供了两种设置编码的方式:
    request.setCharacterEncoding(String):这种方式是我们最为熟悉的方式了;
    fileUpload.setHeaderEncdoing(String):这种方式的优先级高与前一种。

上传文件同名问题(文件重命名)

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		ServletFileUpload fileUpload = new ServletFileUpload(dfif);
		try {
			List<FileItem> list = fileUpload.parseRequest(request);
			//获取第二个表单项,因为第一个表单项是username,第二个才是file表单项
			FileItem fileItem = list.get(1);
			String name = fileItem.getName();//获取文件名称
			
			// 如果客户端使用的是IE6,那么需要从完整路径中获取文件名称
			int lastIndex = name.lastIndexOf("\\");
			if(lastIndex != -1) {
				name = name.substring(lastIndex + 1);
			}
			
			// 获取上传文件的保存目录
			String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
			String uuid = CommonUtils.uuid();//生成uuid
			String filename = uuid + "_" + name;//新的文件名称为uuid + 下划线 + 原始名称
			
			//创建file对象,下面会把上传文件保存到这个file指定的路径
			//savepath,即上传文件的保存目录
			//filename,文件名称
			File file = new File(savepath, filename);
			
			// 保存文件
			fileItem.write(file);
		} catch (Exception e) {
			throw new ServletException(e);
		} 
	}

一个目录不能存放过多的文件

int hCode = name.hashCode();//获取文件名的hashCode
	//获取hCode的低4位,并转换成16进制字符串
	String dir1 = Integer.toHexString(hCode & 0xF);
	//获取hCode的低5~8位,并转换成16进制字符串
	String dir2 = Integer.toHexString(hCode >>> 4 & 0xF);
	//与文件保存目录连接成完整路径
	savepath = savepath + "/" + dir1 + "/" + dir2;
	//因为这个路径可能不存在,所以创建成File对象,再创建目录链,确保目录在保存文件之前已经存在
	new File(savepath).mkdirs();

上传的单个文件的大小限制

  • 限制上传文件的大小,ServletFileUpload类的setFileSizeMax(long)就可以了。参数就是上传文件的上限字节数,例如servletFileUpload.setFileSizeMax(1024*10)表示上限为10KB。
    一旦上传的文件超出了上限,那么就会抛出FileUploadBase.FileSizeLimitExceededException异常。我们可以在Servlet中获取这个异常,然后向页面输出“上传的文件超出限制”。
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		ServletFileUpload fileUpload = new ServletFileUpload(dfif);
		// 设置上传的单个文件的上限为10KB
		fileUpload.setFileSizeMax(1024 * 10);[设置单个上传文件的上限为10KB,超出10KB,fileUploadRequest()方法就会抛出异常。
这条代码一定要在fileUploadRequest()方法之前调用。]
		try {
			List<FileItem> list = fileUpload.parseRequest(request);
			//获取第二个表单项,因为第一个表单项是username,第二个才是file表单项
			FileItem fileItem = list.get(1);
			String name = fileItem.getName();//获取文件名称
			
			// 如果客户端使用的是IE6,那么需要从完整路径中获取文件名称
			int lastIndex = name.lastIndexOf("\\");
			if(lastIndex != -1) {
				name = name.substring(lastIndex + 1);
			}
			
			// 获取上传文件的保存目录
			String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
			String uuid = CommonUtils.uuid();//生成uuid
			String filename = uuid + "_" + name;//新的文件名称为uuid + 下划线 + 原始名称
			
			int hCode = name.hashCode();//获取文件名的hashCode
			//获取hCode的低4位,并转换成16进制字符串
			String dir1 = Integer.toHexString(hCode & 0xF);
			//获取hCode的低5~8位,并转换成16进制字符串
			String dir2 = Integer.toHexString(hCode >>> 4 & 0xF);
			//与文件保存目录连接成完整路径
			savepath = savepath + "/" + dir1 + "/" + dir2;
			//因为这个路径可能不存在,所以创建成File对象,再创建目录链,确保目录在保存文件之前已经存在
			new File(savepath).mkdirs();
			
			//创建file对象,下面会把上传文件保存到这个file指定的路径
			//savepath,即上传文件的保存目录
			//filename,文件名称
			File file = new File(savepath, filename);
			
			// 保存文件
			fileItem.write(file);
		} catch (Exception e) {
			// 判断抛出的异常的类型是否为FileUploadBase.FileSizeLimitExceededException
			// 如果是,说明上传文件时超出了限制。
			if(e instanceof FileUploadBase.FileSizeLimitExceededException) {
				// 在request中保存错误信息
				request.setAttribute("msg", "上传失败!上传的文件超出了10KB!");
				// 转发到index.jsp页面中!在index.jsp页面中需要使用${msg}来显示错误信息
				request.getRequestDispatcher("/index.jsp").forward(request, response);
				return;
			}
[当抛出异常后,判断异常类型,如果是超出了文件大小限制,那么就转发到index.jsp页面显示错误信息。]			throw new ServletException(e);
		} 
	}

缓存大小与临时目录

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		DiskFileItemFactory dfif = new DiskFileItemFactory(1024*20, new File("F:\\temp"));[指定缓存大小为20KB,当上传的文件超出了20KB就会保存到临时目录。
临时目录为F:\\temp]
		ServletFileUpload fileUpload = new ServletFileUpload(dfif);
		
		try {
			List<FileItem> list = fileUpload.parseRequest(request);
			FileItem fileItem = list.get(1);
			String name = fileItem.getName();
			String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
			
			// 保存文件
			fileItem.write(path(savepath, name));
		} catch (Exception e) {
			throw new ServletException(e);
		} 
	}
	
	private File path[生成文件的保存路径](String savepath, String filename) {
		// 从完整路径中获取文件名称
		int lastIndex = filename.lastIndexOf("\\");
		if(lastIndex != -1) {
			filename = filename.substring(lastIndex + 1);
		}
		
		// 通过文件名称生成一级、二级目录
		int hCode = filename.hashCode();
		String dir1 = Integer.toHexString(hCode & 0xF);
		String dir2 = Integer.toHexString(hCode >>> 4 & 0xF);
		savepath = savepath + "/" + dir1 + "/" + dir2;
		// 创建目录
		new File(savepath).mkdirs();
		
		// 给文件名称添加uuid前缀
		String uuid = CommonUtils.uuid();
		filename = uuid + "_" + filename;
		
		// 创建文件完成路径
		return new File(savepath, filename);
	}

下载

  • 两个头一个流!
    Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
    通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
    Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
    在filename=后面跟随的是显示在下载框中的文件名称!
    流:要下载的文件数据!
  • 自己new一个输入流即可!
代码:
String filename = request.getParameter("path");
		// GET请求中,参数中包含中文需要自己动手来转换。
		// 当然如果你使用了“全局编码过滤器”,那么这里就不用处理了
		filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8");
		
		String filepath = this.getServletContext().getRealPath("/WEB-INF/uploads/" + filename);
		File file = new File(filepath);
		if(!file.exists()) {
			response.getWriter().print("您要下载的文件不存在!");
			return;
		}
		// 所有浏览器都会使用本地编码,即中文操作系统使用GBK
		// 浏览器收到这个文件名后,会使用iso-8859-1来解码
		filename = new String(filename.getBytes("GBK"), "ISO-8859-1");
		response.addHeader("content-disposition", "attachment;filename=" + filename);
		IOUtils.copy(new FileInputStream(file), response.getOutputStream());
  • 乱码问题:
  • 通用方案:filename = new String(filename.getBytes(“GBK”), “ISO-8859-1”);
第二种方案:
public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
		String agent = request.getHeader("User-Agent"); //获取浏览器
		if (agent.contains("Firefox")) {
			BASE64Encoder base64Encoder = new BASE64Encoder();
			filename = "=?utf-8?B?"
					+ base64Encoder.encode(filename.getBytes("utf-8"))
					+ "?=";
		} else if(agent.contains("MSIE")) {
			filename = URLEncoder.encode(filename, "utf-8");
		} else {
			filename = URLEncoder.encode(filename, "utf-8");
		}
		return filename;
	}

发邮件

  • 邮件协议概述
    SMTP:(Simple Mail Transfer Protocol,简单邮件传输协议)发邮件协议;
    POP3:(Post Office Protocol Version 3,邮局协议第3版)收邮件协议;
    IMAP:(Internet Message Access Protocol,因特网消息访问协议)收发邮件协议
    邮件服务器名称
    smtp服务器的端口号为25,服务器名称为smtp.163.com
    pop3服务器的端口号为110,服务器名称为pop3.163.com

JavaMail

  • JavaMail中主要类:
    java mail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。
    Session:表示会话,即客户端与邮件服务器之间的会话!想获得会话需要给出账户和密码,当然还要给出服务器名称。
    MimeMessage:表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。
    Transport:用来发送邮件。它是发送器!
  • 第一步:获得Session
    Session session = Session.getInstance(Properties prop, Authenticator auth);
    其中prop需要指定两个键值,一个是指定服务器主机名,另一个是指定是否需要认证!
Properties prop = new Properties();
prop.setProperty(“mail.host”, “smtp.163.com”);//设置服务器主机名
prop.setProperty(“mail.smtp.auth”, “true”);//设置需要认证

其中Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。

内部类:
Authenticator auth = new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication () {
        new PasswordAuthentication(“张三”, “123”);
}
};

通过上面的准备,现在可以获取得Session对象了:
Session session = Session.getInstance(prop, auth);

  • 第二步:创建MimeMessage对象
    创建MimeMessage需要使用Session对象来创建:
    MimeMessage msg = new MimeMessage(session);
    然后需要设置发信人地址、收信人地址、主题,以及邮件正文。
    msg.setFrom(new InternetAddress(“zhangsan@163.com”));//设置发信人
    msg.addRecipients(RecipientType.TO, “zhangsan@qq.com,”);//设置多个收信人
    msg.addRecipients(RecipientType.CC, “zhangsan@sohu.com,”);//设置多个抄送
    msg.addRecipients(RecipientType.BCC, ”zhangsan@hotmail.com”);//设置暗送
    msg.setSubject(“这是一封测试邮件”);//设置主题(标题)
    msg.setContent(“hello world!”, “text/plain;charset=utf-8”);//设置正文

第三步:发送邮件

  • Transport.send(msg);//发送邮件

JavaMail发送带有附件的邮件

上面的hello world案例中,只是发送了带有正文的邮件!所以在调用setContent()方法时直接设置了正文,如果想发送带有附件邮件,那么需要设置邮件的内容为MimeMultiPart。
MimeMulitpart parts = new MimeMulitpart();//多部件对象,可以理解为是部件的集合
msg.setContent(parts);//设置邮件的内容为多部件内容。
然后我们需要把正文、N个附件创建为“主体部件”对象(MimeBodyPart),添加到MimeMuiltPart中即可。
MimeBodyPart part1 = new MimeBodyPart();//创建一个部件
part1.setCotnent(“这是正文部分”, “text/html;charset=utf-8”);//给部件设置内容
parts.addBodyPart(part1);//把部件添加到部件集中。

下面我们创建一个附件:

MimeBodyPart part2 = new MimeBodyPart();//创建一个部件
part2.attachFile(“F:\\a.jpg”);//设置附件
part2.setFileName(“hello.jpg”);//设置附件名称
parts.addBodyPart(part2);//把附件添加到部件集中

注意,如果在设置文件名称时,文件名称中包含了中文的话,那么需要使用MimeUitlity类来给中文编码:
part2.setFileName(MimeUitlity.encodeText(“李四.jpg”));

Ajax

ajax是什么

  • asynchronous javascript and xml:异步的js和xml
  • 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象。所有的异步交互都是使用XMLHttpRequest对象完成的。
  • 它能使用js访问服务器,而且是异步访问!
  • 服务器给客户端的响应一般是整个页面,一个html完整页面!但在ajax中因为是局部刷新,那么服务器就不用再响应整个页面!而只是数据部分!(它包括 text, json ,xml)

异步交互和同步交互

  • 同步:
    发一个请求,就要等待服务器的响应结束,然后才能发第二个请求!
    刷新的是整个页面!
  • 异步:
    发一个请求后,无需等待服务器的响应,然后就可以发第二个请求!
    可以使用js接收服务器的响应,然后使用js来局部刷新!

ajax的优缺点

优点:

  • 异步交互:增强了用户的体验!
  • 性能:因为服务器无需再响应整个页面,只需要响应部份内容,所以服务器的压力减轻了!
    缺点:
  • ajax不能应用在所有场景!
  • ajax无端的增多了对服务器的访问次数,给服务器带来了压力!

ajax发送异步请求(四步操作)

  1. 第一步(得到XMLHttpRequest)
    大多数浏览器都支持:var xmlHttp = new XMLHttpRequest();
    IE6.0:var xmlHttp = new ActiveXObject(“Msxml2.XMLHTTP”);
    IE5.5以更早版本的IE:var xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);
  • 编写创建XMLHttpRequest对象的函数
 function createXMLHttpRequest() {
      try {
          return new XMLHttpRequest();
      } catch(e) {
          try {
	      return new ActiveXObject("Msxml2.XMLHTTP");
	  } catch(e) {
	      try {
	          return new ActiveXObject("Microsoft.XMLHTTP");
	      } catch(e) {
	          throw e;
	      }
	  }
      }
  }
  1. 第二步(打开与服务器的连接)
  • xmlHttp.open():用来打开与服务器的连接,它需要三个参数:
    请求方式:可以是GET或POST
    请求的URL:指定服务器端资源,例如;/day23_1/AServlet
    请求是否为异步:如果为true表示发送异步请求,否则同步请求!
  • xmlHttp.open(“GET”, “/cn.yao.exc/AServlet”, true);
  • 如果请求方式为POST,则必须设置xmlhttp.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”); 如果没有设置,Web容器会忽略请求体的内容。
  1. 第三步(发送请求)
    xmlHttp.send(null):如果不给可能会造成部份浏览器无法发送!
    参数:就是请求体内容!如果是GET请求,必须给出null。
  2. 第四步()
  • 在xmlHttp对象的一个事件上注册监听器:onreadystatechange
  • xmlHttp对象一共有5个状态:
    0状态:刚创建,还没有调用open()方法;
    1状态:请求开始:调用了open()方法,但还没有调用send()方法
    2状态:调用完了send()方法了;
    3状态:服务器已经开始响应,但不表示响应结束了!
    4状态:服务器响应结束!(通常我们只关心这个状态!!!)
  • 得到xmlHttp对象的状态:
    var state = xmlHttp.readyState;//可能是0、1、2、3、4
  • 得到服务器响应的状态码
    var status = xmlHttp.status;//例如为200、404、500
  • 得到服务器响应的内容1
    var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
    var content = xmlHttp.responseXML;//得到服务器的响应的xml响应的内容,它是Document对象了!
    xmlHttp.onreadystatechange = function() {//xmlHttp的5种状态都会调用本方法
    if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
    var text = xmlHttp.responseText;
    }
    };

XStream

作用

  • 可以把JavaBean转换为(序列化为)xml

XStream的jar包

  • 核心JAR包:xstream-1.4.7.jar;
  • 必须依赖包:xpp3_min-1.1.4c

使用步骤

  • XStream xstream = new XStream();
  • String xmlStr = xstream.toXML(javabean);

细节

  • 别名:把类型对应的元素名修改了
    xstream.alias(“china”, List.class):让List类型生成的元素名为china
    xstream.alias(“province”, Province.class):让Province类型生成的元素名为province
  • 使用为属性:默认类的成员,生成的是元素的子元素!我们希望让类的成员生成元素的属性
    xstream.useAttributeFor(Province.class, “name”):把Province类的名为name成员,生成元素的name属性
  • 去除Collection类型的成名:我们只需要Collection的内容,而不希望Collection本身也生成一个元素
    xstream.addImplicitCollection(Province.class, “cities”):让Province类的名为cities(它是List类型的,它的内容还会生成元素)的成名不生成元素
  • 去除类的指定成名,让其不生成xml元素
    xstream.omitField(City.class, “description”):在生成的xml中不会出现City类的名为description的对应的元素!

JSON

是js提供的一种数据交换格式!

json的语法

  • {}:是对象!
    属性名必须使用双引号括起来!
    属性值:
    • null
    • 数值
    • 字符串
    • 数组:使用[]括起来
    • boolean值:true和false
  • var person = {“name”:“zhangSan”, “age”:18, “sex”:“male”};

JSON-lib

核心类

  • JSONObject --> Map
    toString();
    JSONObject map = JSONObject.fromObject(person):把对象转换成JSONObject对象
  • JSONArray --> List
    toString()
    JSONArray jsonArray = JSONObject.fromObject(list):把list转换成JSONArray对象
  • 实例:
    	JSONObject jo = new JSONObject();
		jo.put("name", "zhangSan");
		jo.put("age", "18");
		jo.put("sex", "male");
		System.out.println(jo.toString());
	输出为{"name":"zhangSan","age":"18","sex":"male"}

  • 把javaBean转化为json
Person person = new Person("liSi", 18, "female");
		JSONObject jo = JSONObject.fromObject(person)[把JavaBean对象转换成json];
		System.out.println(jo.toString());
  • 把Map转化为json
Map map = new HashMap();
		map.put("name", "wangWu");
		map.put("age", "81");
		map.put("sex", "male");
		
		JSONObject jo = JSONObject.fromObject(map)[把Map转换成JSON];
		System.out.println(jo.toString());

JSONArray

JSONArray ja = new JSONArray();
		Person p1 = new Person("zhangSan", 18, "male");
		Person p2 = new Person("liSi", 23, "female");
		ja.add(p1);
		ja.add(p2);
		
		System.out.println(ja.toString());
	Person p1 = new Person("zhangSan", 18, "male");
		Person p2 = new Person("liSi", 23, "female");
		List<Person> list = new ArrayList<Person>();
		list.add(p1);
		list.add(p2);
		
		JSONArray ja = JSONArray.fromObject(list);
		
		System.out.println(ja.toString());
Person p1 = new Person("zhangSan", 18, "male");
		Person p2 = new Person("liSi", 23, "female");
		Person[] persons = {p1, p2};
		
		JSONArray ja = JSONArray.fromObject(persons);
		
		System.out.println(ja.toString());
  • 客户端执行JSON
    服务器发送过来JSON字符串后,客户端需要对其进行解析。这时客户端需要使用eval()方法对JSON字符串进行执行!但要注意,eval()方法在执行JSON时,必须把JSON字符串使用一对圆括号括起来。
var json = "{\"name\":\"zhangSan\", \"age\":\"18\", \"sex\":\"male\"}";
var person = eval("(" + json + ")");
alert(person.name + ", " + person.age + ", " + person.sex);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值