会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132429个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 32461楼
JAVA 全系列/第一阶段:JAVA 快速入门/IDEA的使用和第一个java项目 32462楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask数据库 32463楼
JAVA 全系列/(旧的隐藏)第二十一阶段:百战商城项目(Spring Cloud最新架构)/百战商城项目 32465楼
Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 32466楼
WEB前端全系列/第二阶段:JavaScript编程模块/DOM模型 32467楼
JAVA 全系列/第六阶段:项目管理与SSM框架/Mybatis 32468楼
WEB前端全系列/第二阶段:JavaScript编程模块/DOM模型 32470楼
Python 全系列/第一阶段:Python入门/控制语句 32472楼

老师,在这个添加的功能实现中,视频中老师添加的都是英文字段的,

我自己写出来这个功能之后,试着添加中文字段的username,可是在数据库中显示的是乱码,

然后我进行问题的排查,在控制台打印信息,发现在提取表单数据的时候就是打印的问号(说明是乱码)


我想问:浏览器,jsp页面,服务器之间的编码的关系是怎么样的?

这个是我添加功能的servlet

package com.sunxin.web.servlet;

import com.sunxin.pojo.Users;
import com.sunxin.service.UserManagerService;
import com.sunxin.service.impl.UserManagerServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

@WebServlet("/AddUser.do")
public class UserAddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String flag = req.getParameter("flag");


            if ("adduser".equals(flag)){

                //调用这个AddUserManager方法
                this.AddUserManager(req,resp);
            }

    }

    //定义一个处理这个添加功能的方法
    private void AddUserManager(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
           try{

               //实例化service接口
               UserManagerService ums = new UserManagerServiceImpl();
               ums.AddUserFunction(this.getThisPageUser(req));
                    
                    //排查的代码
               System.out.println("**************************************");
               System.out.println(this.getThisPageUser(req).getUsername());
               System.out.println("**************************************");

               resp.sendRedirect("ok.jsp");
           }catch (Exception e){
               e.printStackTrace();
               resp.sendRedirect("error.jsp");
           }


    }

    //定义一个获取User对象的方法的

    private Users getThisPageUser(HttpServletRequest req){

        //修改tomcat的编码方式
        try {
            req.setCharacterEncoding("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String username = req.getParameter("username");
        String userpwd = req.getParameter("userpwd");
        String usersex = req.getParameter("usersex");
        String phonenumber = req.getParameter("phonenumber");
        String qqnumber = req.getParameter("qqnumber");
        //装进一个user对象中
        Users user = new Users();
        user.setUsername(username);
        user.setUserpwd(userpwd);
        user.setUsersex(usersex);
        user.setPhonenumber(phonenumber);
        user.setQqnumber(qqnumber);

        return user;
    }

}

这个是页面的代码

<%--
  Created by IntelliJ IDEA.
  User: asus
  Date: 2020/8/5
  Time: 9:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  pageEncoding="UTF-8" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <link href="css/style.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
    <link href="css/select.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.idTabs.min.js"></script>
    <script type="text/javascript" src="js/select-ui.min.js"></script>
    <script type="text/javascript" src="editor/kindeditor.js"></script>
    <script type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
    <script type="text/javascript">
        $(document).ready(function(e) {
            $(".select1").uedSelect({
                width : 345
            });

        });
        function save(){
            window.location='ok.html';
        }

    </script>
    <script type="text/javascript">
        KE.show({id:"ecp",width:"800px",height:"300px"});
    </script>
</head>

<body>

<div class="place">
    <span>位置:</span>
    <ul class="placeul">
        <li><a href="#">用户管理</a></li>
        <li><a href="#">添加用户</a></li>
    </ul>
</div>

<div class="formbody">

    <div class="formtitle"><span>基本信息</span></div>

    <form action="AddUser.do" method="post" accept-charset="utf-8">
        <input type="hidden" name="flag" value="adduser"/>
    <ul class="forminfo">
        <li>
            <label>用户名</label>
            <input name="username" type="text" class="dfinput" /></li>
        <li>
        <li>
            <label>密码</label>
            <input name="userpwd" type="text" class="dfinput" /><i></i></li>
        <li>
            <label>性别</label><cite/>
            <input name="usersex" type="radio" value="1" checked="checked" />男&nbsp;&nbsp;&nbsp;&nbsp;
            <input name="usersex" type="radio" value="0" />女

        </li>
        <li>
            <label>联系方式</label>
            <input name="phonenumber" type="text" class="dfinput" />
        </li>
        <li>
            <label>QQ号</label>
            <input name="qqnumber" type="text" class="dfinput" />
        </li>
        <li>
            <label>&nbsp;</label>
            <input name="" type="submit"  class="btn" value="确认保存" />
        </li>
    </ul>
    </form>
</div>

</body>
</html>


JAVA 全系列/第五阶段:JavaWeb开发/Web实战案例 32473楼

看视频的时候,老师在将使用反射创建对象,并给对象的属性赋值的时候

图片.png

这段代码我认为有一点问题,老师利用rsmd的原因是,想得到数据库表department里面有多少个列。得到列的数量。

这里写了一个for循环,然后在for循环的底下,通过clazz字节码对象获取到属性对象数组。

然后通过for循环遍历属性对象数组,得到属性的名称,由于我们设置的属性名与列名相同,可以作为列名,使用结果集rs的getObject(“colunm列名”)方法,得到列的值。

这里注意,假如一共有3列,那么在第一层for循环下的第一轮循环下,里面for循环会执行3次,因为clazz字节码对象也有3个属性。那第一轮循环就rs.getObject(f[j].getName())三次,得到了3个属性的值。

如果接着按老师的这种方式写:这是视频原图

image.png

接着写,就是 

//首先关闭安全检查,可以对private修饰的属性进行操作

f[i].setAccessible(true);

//然后给t对象的当前遍历到的属性赋值,值为rs.getObject(f[j].getName()),从rs结果集中取出的列名为f[j].getName()的值。注意filed属性对象没有setObject方法。视频里好像老师提了一嘴

f[i].set(t,rs.getObject(f[j].getName()));

那么我们会发现,假如一共有3列,那么在第一层for循环下的第一轮循环下,里面for循环会执行3次,因为clazz字节码对象也有3个属性。那第一轮循环就f[i].set(t,rs.getObject(f[j].getName()));设置了三个属性的值,显然已经设置好了。

第二轮循环会重复操作,set(t,rs.getObject(f[j].getName()));设置了三个属性的值,第三轮循环也是如此,所以根本没有必要写第一轮循环。

当然也可以写foreach循环,以下是我的代码:

image.png

结果:可以正确查出:

image.png

但是有弊端,这里没有用rs.getMetadata()得到一系列值,包括列的个数,所以要保证列的个数与属性的个数一致,上面的代码才能用。

假如属性有4个,而数据库的列只有2个,那在rs.getObject(属性名)的时候就会找不到那个列。

为此我在Dept实体类里新加了一个属性并提供get/set方法

image.png

此时再去执行方法:表示74行找不到flag这一列。

image.png

所以我想可以利用获得列的个数,与当前的属性赋值进行判断,前多少个属性对应列,后面的就不再赋值了,也成功了。

image.png


JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 32474楼
JAVA 全系列/第五阶段:JavaWeb开发/JSP技术详解 32475楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637