通过反射机制实现Servlet与JSON数据共享

106 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解通过反射机制实现Servlet与JSON数据共享,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

自定义——>反射机制将高级引用数据类型转换为JSON字符串

实例
 此处将任意类型对象内容转换为JSON格式字符串返回
     可以使用反射机制手动模拟,也可以使用JSON的jar包
ReflectUtil
 package com.jinhuan.util;
 ​
 import java.lang.reflect.Field;
 ​
 public class ReflectUtil {
 ​
     public static String jsonDeal(Object obj) {
         /*
         * 作用:
         *      将任意类型对象内容转换为JSON格式字符串返回
         * 参数:
         *      一个高级引用类型对象 Object
         * */
         Class classFile = null;
         Field fieldArray[] = null;
         StringBuffer res = new StringBuffer("{");
 ​
         //获取当前对象的类文件
         classFile = obj.getClass();
         //获得当前class的所有属性
          fieldArray = classFile.getDeclaredFields();
          //获得当前对象的所有值
         try {
             for (int i = 0; i < fieldArray.length; i++) {
                 Field field = fieldArray[i];
                 //确保私有访问权限属性可以在class文件外部使用
                 field.setAccessible(true);
                 //获取每个属性的名称和value
                 String fileName = field.getName();
                 Object value = field.get(obj);
                 //将获得属性及其值拼接为JSON格式字符串
                 res.append(""");
                 res.append(fileName);
                 res.append("":"");
                 res.append(value);
                 res.append(""");
                 if(i < fieldArray.length-1)
                     res.append(",");
             }
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         } finally {
             res.append("}");
         }
 ​
         return res.toString();
     }
 }
 ​
Student
 package com.jinhuan.entity;
 ​
 public class Student {
     private Integer sid;
     private String sname;
 ​
     public Student(Integer sid, String sname) {
         this.sid = sid;
         this.sname = sname;
     }
 ​
     public Student() {
     }
 ​
     public Integer getSid() {
         return sid;
     }
 ​
     public void setSid(Integer sid) {
         this.sid = sid;
     }
 ​
     public String getSname() {
         return sname;
     }
 ​
     public void setSname(String sname) {
         this.sname = sname;
     }
 }
OneServlet
 package com.jinhuan.controller;
 ​
 import com.jinhuan.entity.Student;
 import com.jinhuan.util.ReflectUtil;
 ​
 import java.io.IOException;
 ​
 public class OneServlet extends javax.servlet.http.HttpServlet {
     protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
 ​
     }
 ​
     protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
 ​
         //创建一个学生对象
         Student stu = new Student(12, "尽欢");
         /*
         * 由于Stu是一个高级引用数据对象
         * 直接调用request将stu对象传过去的话,传过去的是改对象的地址
         * 可以将该对象的内容抓换为一个JSON类型的字符串,来进行传递
         * {"sid":12,"sname":"尽欢"}--->字符串格式"{"sid":12,"sname":"尽欢"}"
         * 但是,这样进行转换的效率是极低的,所以可以将其封装成一个方法;来帮助我们将每一个对象,转换为一个JSON字符串
         *
         * */
 ​
         //将该对象转换为一个JSON字符串
         //手动模拟实现
         String str = ReflectUtil.jsonDeal(stu);
         /*
         使用jar包操作方式
                 1、String str = JSONObject.fromObject(stu).toString();
                 2、通过json.jar工具类将集合内容转换为【JSON数组格式】字符串
                     JSONArray jsonArray = JSONArray.fromObject(stuList
         */
         //将其存入到请求作用域对象中
         request.setAttribute("key",str);
         //请求转发
         request.getRequestDispatcher("/index_1.jsp").forward(request,response);
 ​
     }
 }
index_1.jsp
 <%--
   Created by IntelliJ IDEA.
   User: 尽欢
   Date: 2021/11/23
   Time: 16:45
   To change this template use File | Settings | File Templates.
 --%>
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
   <head>
     <title>$Title$</title>
   </head>
   <body>
       <script type="text/javascript">
         var stu = ${requestScope.key};
         window.alert("学员编号 "+stu.sid+" 学员姓名 "+stu.sname);
       </script>
   </body>
 </html>