会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132476个问题
JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 30151楼
Python 全系列/第七阶段:网页编程基础/html5 30152楼
JAVA 全系列/第五阶段:JavaWeb开发/Web实战案例 30154楼

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

图片.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技术(旧) 30155楼

视频中老师的分页,开始

begin指的是开始读取的行数,从0开始

 end是读取到哪里的行数,不包括end

比如显示第2页的数据,每页2行。

int begin = (currentPage - 1) * pageRows; 

int end = currentPage * pageRows;


计算出begin=2  end=4


进行while循环的时候

image.png


currentNum指的是当前打印的行数。注意是从0开始的。那么对应输出第一行记录的时候,currentNum=0,输出完第一行记录的内容以后,currentNum++,才为1,也就是第二行记录在输出时的currentNum=1

由此可见,这种写法,由于一开始就把currentNum的值设置为0,并且在输出完第一行记录的内容后才加1

所以数据库当中的记录被我们用currentNum标识成了从0开始。

那么当我们比如显示第2页的数据,每页2行的时候,上面计算出计算出begin=2  end=4

进入while循环的时候,进行if判断,显然,第一次currentNum的值为0 0>=2 不成立,所以并没有执行if块,直接让currentNum++变成1,也就是说第一条记录(被我们标识成currentNum=0的记录)被略过没有打印。

再次进入循环,进行if判断,显然,第二次currentNum的值为1 1>=2 不成立,所以并没有执行if块,直接让currentNum++变成2,也就是说第二条记录(被我们标识成currentNum=1的记录)被略过没有打印。

再次进入循环,进行if判断,显然,第三次currentNum的值为2 2>=2 成立,执行if块,打印第三条记录(被我们标识成currentNum=2的记录)的内容,判断if条件,2==(4-1=3) 不成立,不执行break,继续向下,执行currentNum++变成3.

再次进入循环,进行if判断,显然,第四次currentNum的值为3 3>=2 成立,执行if块,打印第四条记录(被我们标识成currentNum=3的记录)的内容,判断if条件,3==(4-1=3) 成立,执行break,跳出整个while循环。

也就是说,最终打印了,

结果集中的第三条记录(被我们标识成currentNum=2的记录)的内容

结果集中的第四条记录(被我们标识成currentNum=3的记录)的内容

因为我们对结果集当中的记录进行的currentNum标识本来就是从0开始的。

再来看if的判断

 currentNum>=begin && currentNum<end

为什么没有在end那边加等号呢,

看上面的例子,打印第2页的内容,每行打印2条。

begin=2

end=4

打印数据currentNum=2,currentNum=3

发现规律了吗,实际上就是从begin的值(2)开始往下数,数2个(因为每页显示2个。

那么end是什么,end其实就是我们计算出来的,读到哪里的个数,当然我们也可以将end的值直接-1,求出来到底到哪里结束,

这样更好理解:

image.png


或者你觉得,从0开始太难受,为什么不都从1开始,也可以这样:

image.png


结果都没有问题,显示了结果集里,第三条与第四条的数据:

image.png

JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 30157楼
JAVA 全系列/第六阶段:项目管理与SSM框架/SpringMVC 30160楼

1.png

问题在图片里,麻烦老师帮忙解答

Python 全系列/第二阶段:Python 深入与提高/异常机制 30164楼

代码:

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


class TelephoneConverter(BaseConverter):
    regex = r"1[345789]/d{9}"


app.url_map.converters['tel'] = TelephoneConverter


@app.route('telephone/<tel:pnum>')
def my_telephone(pnum):
    return '您请求过来的电话号码值为:%s' % pnum


if __name__ == '__main__':
    app.run()

报错:

FLASK_APP = app.py

FLASK_ENV = development

FLASK_DEBUG = 0

In folder H:/python_exec/自定义URL

H:\python_virtualenv\flask_env\Scripts\python.exe -m flask run

 * Serving Flask app "app.py"

 * Environment: development

 * Debug mode: off

Traceback (most recent call last):

  File "h:\python37\lib\runpy.py", line 193, in _run_module_as_main

    "__main__", mod_spec)

  File "h:\python37\lib\runpy.py", line 85, in _run_code

    exec(code, run_globals)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\__main__.py", line 15, in <module>

    main(as_module=True)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 967, in main

    cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 586, in main

    return super(FlaskGroup, self).main(*args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 782, in main

    rv = self.invoke(ctx)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 1259, in invoke

    return _process_result(sub_ctx.command.invoke(sub_ctx))

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 1066, in invoke

    return ctx.invoke(self.callback, **ctx.params)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 610, in invoke

    return callback(*args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\decorators.py", line 73, in new_func

    return ctx.invoke(f, obj, *args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\click\core.py", line 610, in invoke

    return callback(*args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 848, in run_command

    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 305, in __init__

    self._load_unlocked()

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 330, in _load_unlocked

    self._app = rv = self.loader()

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 388, in load_app

    app = locate_app(self, import_name, name)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\cli.py", line 240, in locate_app

    __import__(module_name)

  File "H:\python_exec\自定义URL\app.py", line 19, in <module>

    @app.route('telephone/<tel:pnum>')

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\app.py", line 1315, in decorator

    self.add_url_rule(rule, endpoint, f, **options)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\app.py", line 98, in wrapper_func

    return f(self, *args, **kwargs)

  File "H:\python_virtualenv\flask_env\lib\site-packages\flask\app.py", line 1275, in add_url_rule

    rule = self.url_rule_class(rule, methods=methods, **options)

  File "H:\python_virtualenv\flask_env\lib\site-packages\werkzeug\routing.py", line 666, in __init__

    raise ValueError("urls must start with a leading slash")

ValueError: urls must start with a leading slash


Process finished with exit code 1


环境:

    pycharm2020.1

Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask视图基础和URL 30165楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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