element无法展示数据,Gson中文乱码

      我老师的课程进度已经讲到了element模块。这个模块的运用,她说,无非就是去element官网搬东西,找到合适自己的,自己复制过来,根据自己的情况修改下一些要显示数据,直接用,框架是现成的。

(传送地址:Element - 网站快速成型工具

      在这里面就很多元素可以直接用,效果十分美观。

      但在我自己的测试中,问题接踵而来:数据无法展示出来;展示出来之后,中文又无法显示,只显示一堆问号。 在求助我的老师之后,问题才得到解决。

     1.数据无法显示:

      HTML文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!-- 导入样式 -->
    <link rel="stylesheet" href="//unpkg.com/element-plus/dist/index.css" />

    <!-- 导入 axios -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <!-- 导入 Vue 3 -->
    <script src="//unpkg.com/vue@next"></script>
    <!--引入element-plus的组件库-->
    <script src="//unpkg.com/element-plus"></script>


</head>
<body>
<div id="users">
    <el-button type="primary" @click="getUsers">主要按钮</el-button>
    <div class="userlist">
        <!--el-table标签:表格设置
                       :data:绑定对应数组名
                       border:加竖直的边框
                       style:设置总宽度占比
                       -->
        <el-table
                :data="usersA"
                border
                style="width: 100%">
            <!--el-table-column标签:列设置
                            prop:绑定属性名
                            label:设置表头名
                            width:
                                   -->
            <el-table-column
                    prop="quetionId"
                    label="试题编号"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="Title"
                    label="题目"
                    width="180">
            </el-table-column>

            <el-table-column
                    prop="OptionA"
                    label="A"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="OptionB"
                    label="B"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="OptionC"
                    label="C"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="OptionD"
                    label="D"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="answer"
                    label="答案"
                    width="180">
            </el-table-column>

        </el-table>
    </div>
</div>
<script setup>
    const app = {
        data() {
            return {
                usersA: [],
            }
        },
        methods: {//方法区
            getUsers() {//方法
                axios.get('TryElement')//传入url地址
                    //请求响应成功执行的函数
                    .then(response => {//箭头函数
                            //从data属性中获得服务端回传数据
                            this.usersA = response.data;//将获得的数据赋值于data域中的users
                            console.log(this.usersA);
                        }
                        //请求或响应失败执行的函数
                    )
                    .catch(err => {
                            alert("错误");
                            console.log(err);
                        }
                    )
            }
        },
    }


    const vv = Vue.createApp(app)
    vv.use(ElementPlus)   //在vue3项目中需要先添加引用ElementPlus,后在挂载
    vv.mount('#users')
    // Vue.createApp(app).mount('#users')
</script>
</body>
</html>

Servlet文件:

package Try;

import com.google.gson.Gson;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "Servlet", value = "/TryElement")
public class TryElementServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
        // test为数据库名,?后面这句很重要,设置useSSl=false
        final String DB_URL = "jdbc:mysql://localhost:3306/user?characterEncoding=UTF8&autoReconnect=true&useSSL=false";

        // 数据库的用户名与密码,需要根据自己的设置
        final String USER = "root";
        final String PASS = "123456";

        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List list = new ArrayList();  //相比于ArrayList<Quetion>  list = new ArrayList<>();前者能写的字母少,还能实现等效的功能
        try {
            //驱动
            Class.forName(JDBC_DRIVER);
            //打开连接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            String sql = "select * from quetion";  //“*”不能省略
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()){
                Question quet = new Question();
                quet.setQuestionId(rs.getInt("quetionId"));
                quet.setTitle(rs.getString("title"));
                quet.setOptionA(rs.getString("optionA"));
                quet.setOptionB(rs.getString("optionB"));
                quet.setOptionC(rs.getString("optionC"));
                quet.setOptionD(rs.getString("optionD"));
                quet.setAnswer(rs.getString("answer"));
                list.add(quet);
            }
        }catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) { /* ignored */}
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) { /* ignored */}
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) { /* ignored */}
            }
        }
        response.setContentType("application/json");
        Gson gson =new Gson();
        String json=gson.toJson(list);


        System.out.println(json);
        PrintWriter writer  =response.getWriter();
        writer.print(json);
        writer.close();

    }
}

      由于我也是迷迷糊糊搬element的东西,我也不太懂,我就说一下的我Servlet文件:从quetion数据表里拿出所有数据给quet这个自定义类赋值,因为表里的数据不只一条,所以就拿个list存放,继而把list放进json,最后又把json写到response响应体里面,谁请求这个Servlet就可以用json里面的数据。上面我的HTML就是请求这个Servlet,然后用里面的数据。

运行结果:

      就只有答案显示出来了,而数据表里的其他键值都没有展示 。我无意间访问上面的那个Servlet文件,恍然大悟:prop属性中的字母大小写和json中的不一致!

<el-table-column
                    prop="quetionId"
                    label="试题编号"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="Title"
                    label="题目"
                    width="180">
            </el-table-column>

            <el-table-column
                    prop="OptionA"
                    label="A"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="OptionB"
                    label="B"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="OptionC"
                    label="C"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="OptionD"
                    label="D"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="answer"
                    label="答案"
                    width="180">
            </el-table-column>

 

把HTML中prop属性的字母改了之后:

      都显示出来。

2.中文编译乱码:

      有中文的地方为什么都是问号?

      原来,我把数据写进json的时候,就没有用utf-8来编译中文。解决措施,只需要在Servlet文件中的第73行代码做如下修改:

response.setContentType("application/json;charset=utf-8");

 

      结果全显示出来了!

      还有一点我刚开始就犯的错误是:我直接从地址访问Servlet文件,出现乱七八糟的东西(下图),没有element元素,我刚开始还以为会重定向跳到HTML网页。倒腾了好一会,我老师说得直接访问HTML 文件才会显示。      

 

      总结:

1.element的prop属性中的单词(大小写和字母拼写)要和json 里的一致。

2.把数据写进响应体里的时候,有中文得 response.setContentType("application/json;charset=utf-8");有utf-8编译。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

{Tomy}

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

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

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

打赏作者

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

抵扣说明:

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

余额充值