Django-Form组件-2

参考: http://www.cnblogs.com/wupeiqi/articles/6144178.html

Django的Form组件的主要功能:

  • 生成HTML标签(可以保留上次输入内容)
  • 验证用户数据(显示错误信息)
  • HTML Form提交保留上次提交数据
  • 初始化页面显示内容

一、小试牛刀

1、创建myForm类

  1. from django import forms
  2. from django.forms import fields
  3.  
  4. class TestForm(forms.Form):
  5. name = fields.CharField(
  6. required=True,
  7. max_length=18,
  8. label="用户名:"
  9. )
  10. age = fields.IntegerField(
  11. min_value=12,
  12. max_value=70,
  13. label = "年龄:"
  14. )
  15. email = fields.EmailField()
  16.  
  17. city = fields.ChoiceField(
  18. choices=[(1,"北京"),(2,"上海"),(3,"广州"),(4,"深圳")], #<option value="1">北京</option>
  19. initial=2, #默认选中2 上海
  20. )
  21.  
  22. ff = fields.FileField(allow_empty_file=True)
  23.  
  24. hobby = fields.MultipleChoiceField(
  25. choices=[(1, "足球"), (2, "篮球"), (3, "乒乓球"), (4, "羽毛球")],
  26. initial=[1,2], # 默认选中1 2
  27. )

2、Views.py 函数处理

  1. def showInfoForm1(request):
  2. return render(request,"show_info_form1.html")
  3.  
  4. def addInfoForm1(request):
  5. if request.method =="GET":
  6. obj = TestForm()
  7. return render(request,"add_info_form1.html",{"obj":obj})
  8.  
  9. else:
  10. obj = TestForm(request.POST,request.FILES)
  11. if obj.is_valid():
  12. print(obj.cleaned_data)
  13. return redirect("/showInfoForm1/")
  14. else:
  15. return render(request, "add_info_form1.html", {"obj": obj})

3、生成HTML

  1. <body>
  2. <form action="/addInfoForm1/" method="post" novalidate enctype="multipart/form-data">
  3. <p>{{ obj.name.label }}{{ obj.name }}{{ obj.errors.name.0 }}</p>
  4. <p>{{ obj.age.label }}{{ obj.age }}{{ obj.errors.age.0 }}</p>
  5. <p>{{ obj.email.label }}{{ obj.email }}{{ obj.errors.email.0 }}</p>
  6. <p>{{ obj.ff.label }}{{ obj.ff }}{{ obj.errors.ff.0 }}</p>
  7.  
  8. <p>{{ obj.city.label }}{{ obj.city }}{{ obj.errors.city.0 }}</p>
  9. <p>{{ obj.hobby.label }}{{ obj.hobby }}{{ obj.errors.hobby.0 }}</p>
  10. <p><input type="submit"></p>
  11. </form>
  12. </body>

其他 obj.username.(插件)

  1. <form method="POST" enctype="multipart/form-data">
  2. {% csrf_token %}
  3.  
  4. {{ form.xxoo.label }}
  5. {{ form.xxoo.id_for_label }}
  6. {{ form.xxoo.label_tag }}
  7. {{ form.xxoo.errors }}
  8. <p>{{ form.user }} {{ form.user.errors }}</p>
  9. <input type="submit" />
  10. </form>

其他的一些插件方法

二、Form类

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

1、Django的forms内置字段如下:

  1. Field
  2. required=True, 是否允许为空
  3. widget=None, HTML插件(默认的是input 标签,可以定制生成 radio checkBox texeArea等等)
  4. label=None, 用于生成Label标签或显示内容
  5. initial=None, 初始值
  6. help_text='', 帮助信息(在标签旁边显示)
  7. error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
  8. show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
  9. validators=[], 自定义验证规则
  10. localize=False, 是否支持本地化
  11. disabled=False, 是否可以编辑
  12. label_suffix=None Label内容后缀
  13.  
  14. 下列类都继承了Field(除了Field有的方法外,他们自己也有一些方法)
  15. CharField(Field)
  16. max_length=None, 最大长度
  17. min_length=None, 最小长度
  18. strip=True 是否移除用户输入空白
  19.  
  20. IntegerField(Field)
  21. max_value=None, 最大值
  22. min_value=None, 最小值
  23.  
  24. FloatField(IntegerField)
  25. ...
  26.  
  27. DecimalField(IntegerField)
  28. max_value=None, 最大值
  29. min_value=None, 最小值
  30. max_digits=None, 总长度
  31. decimal_places=None, 小数位长度
  32.  
  33. BaseTemporalField(Field)
  34. input_formats=None 时间格式化
  35.  
  36. DateField(BaseTemporalField) 格式:2015-09-01
  37. TimeField(BaseTemporalField) 格式:11:12
  38. DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
  39.  
  40. DurationField(Field) 时间间隔:%d %H:%M:%S.%f
  41. ...
  42.  
  43. RegexField(CharField)
  44. regex, 自定制正则表达式
  45. max_length=None, 最大长度
  46. min_length=None, 最小长度
  47. error_message=None, 忽略,正则没有匹配成功的错误信息都使用 error_messages={'invalid': '...'}
  48.  
  49. EmailField(CharField)
  50. ...
  51.  
  52. FileField(Field)
  53. allow_empty_file=False 是否允许空文件
  54.  
  55. ImageField(FileField)
  56. ...
  57. 注:需要PIL模块,pip3 install Pillow
  58. 以上两个字典使用时,需要注意两点:
  59. - form表单中 enctype="multipart/form-data"
  60. - view函数中 obj = MyForm(request.POST, request.FILES)
  61.  
  62. URLField(Field)
  63. ...
  64.  
  65. BooleanField(Field)
  66. ...
  67.  
  68. NullBooleanField(BooleanField)
  69. ...
  70.  
  71. ChoiceField(Field)
  72. ...
  73. choices=[(1,"北京"),(2,,"上海"),(3,"广州")], 选项,如:choices = ((0,'上海'),(1,'北京'),)  <option value="1">北京</option>
  74. required=True, 是否必填
  75. widget=None, 插件,默认select插件
  76. label=None, Label内容
  77. initial=None, 初始值
  78. help_text='', 帮助提示
  79.  
  80. ModelChoiceField(ChoiceField)
  81. ... django.forms.models.ModelChoiceField
  82. queryset, # 查询数据库中的数据
  83. empty_label="---------", # 默认空显示内容
  84. to_field_name=None, # HTML的input/option等标签中value的值对应的字段
  85. limit_choices_to=None # ModelForm中对queryset二次筛选
  86.  
  87. ModelMultipleChoiceField(ModelChoiceField)
  88. ... django.forms.models.ModelMultipleChoiceField
  89.  
  90. TypedChoiceField(ChoiceField)
  91. coerce = lambda val: val 对选中的值进行一次转换
  92. empty_value= '' 空值的默认值
  93.  
  94. MultipleChoiceField(ChoiceField)
  95. ...
  96.  
  97. TypedMultipleChoiceField(MultipleChoiceField)
  98. coerce = lambda val: val 对选中的每一个值进行一次转换
  99. empty_value= '' 空值的默认值
  100.  
  101. ComboField(Field)
  102. fields=() 使用多个正则验证,如下:即验证最大长度20,又验证邮箱格式
  103. fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
  104.  
  105. MultiValueField(Field)
  106. PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
  107.  
  108. SplitDateTimeField(MultiValueField)
  109. input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
  110. input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
  111.  
  112. FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中(显示path路径下所有文件)
  113. path, 文件夹路径
  114. match=None, 正则匹配
  115. recursive=False, 递归下面的文件夹
  116. allow_files=True, 允许文件
  117. allow_folders=False, 允许文件夹
  118. required=True,
  119. widget=None,
  120. label=None,
  121. initial=None,
  122. help_text=''
  123.  
  124. GenericIPAddressField
  125. protocol='both', bothipv4,ipv6支持的IP格式
  126. unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1 PSprotocol必须为both才能启用
  127.  
  128. SlugField(CharField) 数字,字母,下划线,减号(连字符)
  129. ...
  130.  
  131. UUIDField(CharField) uuid类型
  132. ...

注:UUID是根据MAC以及当前时间等创建的不重复的随机字符串

  1. >>> import uuid
  2.  
  3. # make a UUID based on the host ID and current time
  4. >>> uuid.uuid1() # doctest: +SKIP
  5. UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
  6.  
  7. # make a UUID using an MD5 hash of a namespace UUID and a name
  8. >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
  9. UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
  10.  
  11. # make a random UUID
  12. >>> uuid.uuid4() # doctest: +SKIP
  13. UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
  14.  
  15. # make a UUID using a SHA-1 hash of a namespace UUID and a name
  16. >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
  17. UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
  18.  
  19. # make a UUID from a string of hex digits (braces and hyphens ignored)
  20. >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
  21.  
  22. # convert a UUID to a string of hex digits in standard form
  23. >>> str(x)
  24. '00010203-0405-0607-0809-0a0b0c0d0e0f'
  25.  
  26. # get the raw 16 bytes of the UUID
  27. >>> x.bytes
  28. b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
  29.  
  30. # make a UUID from a 16-byte string
  31. >>> uuid.UUID(bytes=x.bytes)
  32. UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

2、Django Form组件的 widgets 内置插件:

  1. TextInput(Input)
  2. NumberInput(TextInput)
  3. EmailInput(TextInput)
  4. URLInput(TextInput)
  5. PasswordInput(TextInput)
  6. HiddenInput(TextInput)
  7. Textarea(Widget)
  8. DateInput(DateTimeBaseInput)
  9. DateTimeInput(DateTimeBaseInput)
  10. TimeInput(DateTimeBaseInput)
  11. CheckboxInput
  12. Select
  13. NullBooleanSelect
  14. SelectMultiple
  15. RadioSelect
  16. CheckboxSelectMultiple
  17. FileInput
  18. ClearableFileInput
  19. MultipleHiddenInput
  20. SplitDateTimeWidget
  21. SplitHiddenDateTimeWidget
  22. SelectDateWidget

fields.(插件)

补充知识点1:几种快速创建 HTML标签的方法,可以搭配着label_suffix=None  <Label内容后缀>   (不推荐用)

创建table标签下的内容(即:thead>th>td  tbody>tr>td):

创建ul标签下的内容(即:li标签) : 

创建p标签: 

三、widgets 常用插件

  1. # 单radio,值为字符串
  2. # user = fields.CharField(
  3. # initial=2,
  4. # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
  5. # )
  6.  
  7. # 单radio,值为字符串
  8. # user = fields.ChoiceField(
  9. # choices=((1, '上海'), (2, '北京'),),
  10. # initial=2,
  11. # widget=widgets.RadioSelect
  12. # )
  13.  
  14. # 单select,值为字符串
  15. # user = fields.CharField(
  16. # initial=2,
  17. # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
  18. # )
  19.  
  20. # 单select,值为字符串
  21. # user = fields.ChoiceField(
  22. # choices=((1, '上海'), (2, '北京'),),
  23. # initial=2,
  24. # widget=widgets.Select
  25. # )
  26.  
  27. # 多选select,值为列表
  28. # user = fields.MultipleChoiceField(
  29. # choices=((1,'上海'),(2,'北京'),(3,'杭州')),
  30. # initial=[1,],
  31. # widget=widgets.SelectMultiple
  32. # )
  33.  
  34. # 单checkbox
  35. # user = fields.CharField(
  36. # widget=widgets.CheckboxInput()
  37. # )
  38.  
  39. # 多选checkbox,值为列表
  40. # user = fields.MultipleChoiceField(
  41. # initial=[2, ],
  42. # choices=((1, '上海'), (2, '北京'),),
  43. # widget=widgets.CheckboxSelectMultiple
  44. # )

注意:一些插件也可以用 CharField() 来间接调用

举例:选择下拉框有两种调用方式

  1. abdd = fields.CharField(
  2. widget=widgets.Select([(1,'aa'),(2,'bb'),(3,'cc'),(4,'dd')]),
  3. )
  4. abdd = fields.IntegerField(
  5. widget=widgets.Select([(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd')]),
  6. )
  7. abdd = fields.ChoiceField(
  8. choices= [(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd')],
  9. )

补充知识点2:默认后端传给前端的 <input type='text'/> ,在前端显示为字符串。若要将HTML字符串渲染成 HTML标签有两种方法:

方法1:在后端 用mark_safe(txt) 将字符串包裹一下

方法2:前端模板语言渲染时加上  {{txt |safe}}

  1. abdd = fields.MultipleChoiceField(
  2. choices=[(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd')],
  3. widget=widgets.SelectMultiple(attrs={'class':'cc1'})
  4. )

定义HTML属性

在使用选择标签时,需要注意 choices的选项可以从数据库中获取,但是由于是静态字段  ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

方式一:(推荐使用!)

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4. from django.core.validators import RegexValidator
  5.  
  6. class MyForm(Form):
  7.  
  8. user = fields.ChoiceField(
  9. # choices=((1, '上海'), (2, '北京'),),
  10. initial=2,
  11. widget=widgets.Select
  12. )
  13. #每次刷新界面默认执行__init__,从数据库取数据
  14. def __init__(self, *args, **kwargs):
  15. super(MyForm,self).__init__(*args, **kwargs)
  16. # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
  17. # 或 从数据库取
  18. self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

方式二:(不推荐使用)

使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现

  1. from django import forms
  2. from django.forms import fields
  3. from django.forms import widgets
  4. from django.forms import models as form_model
  5. from django.core.exceptions import ValidationError
  6. from django.core.validators import RegexValidator
  7.  
  8. class FInfo(forms.Form):
  9. authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
  10. # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

四、自定义验证规则

方式一:

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4. from django.core.validators import RegexValidator
  5.  
  6. class MyForm(Form):
  7. user = fields.CharField(
  8. validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
  9. )

方式二:

  1. import re
  2. from django.forms import Form
  3. from django.forms import widgets
  4. from django.forms import fields
  5. from django.core.exceptions import ValidationError
  6.  
  7. # 自定义验证规则
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class PublishForm(Form):
  14.  
  15. title = fields.CharField(max_length=20,
  16. min_length=5,
  17. error_messages={'required': '标题不能为空',
  18. 'min_length': '标题最少为5个字符',
  19. 'max_length': '标题最多为20个字符'},
  20. widget=widgets.TextInput(attrs={'class': "form-control",
  21. 'placeholder': '标题5-20个字符'}))
  22.  
  23. # 使用自定义验证规则
  24. phone = fields.CharField(validators=[mobile_validate, ],
  25. error_messages={'required': '手机不能为空'},
  26. widget=widgets.TextInput(attrs={'class': "form-control",
  27. 'placeholder': u'手机号码'}))
  28.  
  29. email = fields.EmailField(required=False,
  30. error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
  31. widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

方法三:自定义方法

  1. from django import forms
  2. from django.forms import fields
  3. from django.forms import widgets
  4. from django.core.exceptions import ValidationError
  5. from django.core.validators import RegexValidator
  6.  
  7. class FInfo(forms.Form):
  8. username = fields.CharField(max_length=5,
  9. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
  10. email = fields.EmailField()
  11.  
  12. def clean_username(self):
  13. """
  14. Form中字段中定义的格式匹配完之后,执行此方法进行验证
  15. :return:
  16. """
  17. value = self.cleaned_data['username']
  18. if "" in value:
  19. raise ValidationError('666已经被玩烂了...', 'invalid')
  20. return value

方式四:同时生成多个标签进行验证

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4.  
  5. from django.core.validators import RegexValidator
  6.  
  7. ############## 自定义字段 ##############
  8. class PhoneField(fields.MultiValueField):
  9. def __init__(self, *args, **kwargs):
  10. # Define one message for all fields.
  11. error_messages = {
  12. 'incomplete': 'Enter a country calling code and a phone number.',
  13. }
  14. # Or define a different message for each field.
  15. f = (
  16. fields.CharField(
  17. error_messages={'incomplete': 'Enter a country calling code.'},
  18. validators=[
  19. RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
  20. ],
  21. ),
  22. fields.CharField(
  23. error_messages={'incomplete': 'Enter a phone number.'},
  24. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
  25. ),
  26. fields.CharField(
  27. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
  28. required=False,
  29. ),
  30. )
  31. super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
  32. **kwargs)
  33.  
  34. def compress(self, data_list):
  35. """
  36. 当用户验证都通过后,该值返回给用户
  37. :param data_list:
  38. :return:
  39. """
  40. return data_list
  41.  
  42. ############## 自定义插件 ##############
  43. class SplitPhoneWidget(widgets.MultiWidget):
  44. def __init__(self):
  45. ws = (
  46. widgets.TextInput(),
  47. widgets.TextInput(),
  48. widgets.TextInput(),
  49. )
  50. super(SplitPhoneWidget, self).__init__(ws)
  51.  
  52. def decompress(self, value):
  53. """
  54. 处理初始值,当初始值initial不是列表时,调用该方法
  55. :param value:
  56. :return:
  57. """
  58. if value:
  59. return value.split(',')
  60. return [None, None, None]

五、初始化数据

在Web应用程序中开发编写功能时,时常用到获取数据库中的数据并将值初始化在HTML中的标签上。

1、Form

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4. from django.core.validators import RegexValidator
  5.  
  6. class MyForm(Form):
  7. user = fields.CharField()
  8.  
  9. city = fields.ChoiceField(
  10. choices=((1, '上海'), (2, '北京'),),
  11. widget=widgets.Select
  12. )

2、Views

  1. from django.shortcuts import render, redirect
  2. from .forms import MyForm
  3.  
  4. def index(request):
  5. if request.method == "GET":
  6. values = {'user': 'root', 'city': 2}
  7. obj = MyForm(values)
  8.  
  9. return render(request, 'index.html', {'form': obj})
  10. elif request.method == "POST":
  11. return redirect('http://www.google.com')
  12. else:
  13. return redirect('http://www.google.com')

3、HTML

  1. <form method="POST" enctype="multipart/form-data">
  2. {% csrf_token %}
  3. <p>{{ form.user }} {{ form.user.errors }}</p>
  4. <p>{{ form.city }} {{ form.city.errors }}</p>
  5.  
  6. <input type="submit"/>
  7. </form>

【Python全栈-后端开发】Django进阶2-Form表单的更多相关文章

  1. 【Python全栈-后端开发】Django入门基础

    Django基础知识 一. 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的 ...

  2. 【Python全栈-后端开发】嵩天老师-Django

    嵩天老师-Python云端系统开发入门教程(Django) 视频地址:https://www.bilibili.com/video/av19801429 课前知识储备: 一.课程介绍: 分久必合.合久 ...

  3. 【Python全栈-后端开发】Django入门基础-2

    Django入门基础知识-2 一 .模版 一.模版的组成 HTML代码+逻辑控制代码 二.逻辑控制代码的组成 1  变量(使用双大括号来引用变量) {{var_name}} 2  标签(tag)的使用 ...

  4. 【Python全栈-后端开发】Django进阶之Model操作复习

    Django进阶之Model操作复习 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - ...

  5. 【Python全栈-后端开发】Django进阶1-分页

    Django[进阶篇-1 ]分页 分页 一.Django内置分页 from django.core.paginator import Paginator, EmptyPage, PageNotAnIn ...

  6. 【Python全栈-后端开发】数据库进阶

    数据库进阶 python关于mysql的API---pymysql模块 pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 pip install ...

  7. 【Python全栈-后端开发】MySQL数据库-练习题

    MySQL数据库-练习题 一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号 ...

  8. Django组件之Form表单

    一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...

  9. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

随机推荐

  1. Android 开发笔记

    11.android使用全局变量 定义Data类继承Application 在manifest.xml中声明 http://blog.csdn.net/feiyangxiaomi/article/de ...

  2. Python中_,__,__xx__的区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. #! /usr ...

  3. 【Java】Java8的Lambda入门记录

    简化定义匿名实现类 匿名实现类的传统方式 创建一个线程,需要实现Runnable接口,并实现public void run()方法,用传统的方式是这样的: public static void mai ...

  4. firewall防火墙使用

    firewall用zone来区分管理,默认有以下一些zone: 丢弃(DROP) 任何流入网络的包都被丢弃,不作出任何响应.只允许流出的网络连接. 阻塞(Block) 任何进入的网络连接都被拒绝,并返 ...

  5. js date 前一天

    Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d ...

  6. 关于C/C++中求最大公约数和最小公倍数的算法

    1.更相减损法 int gcd(int a,int b) { while(a!=b) { if(a>b) a-=b; else b-=a; } return a; } 2.辗转相除法--递归 i ...

  7. MyBatis总结五:#{}和${}的用法和区别

    From: https://www.cnblogs.com/blazeZzz/p/9295634.html #{}的用法: 我们发现,在Mapper.xml映射文件中,经常使用#{属性名} 来作为SQ ...

  8. Mysql分组查询group by语句详解

    (1) group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组(2) group by可用于单个字段分组,也可用于多个字段分组 select * from employee; ...

  9. mybatis batch批量提交大量数据

    转载:https://blog.csdn.net/Java_Mr_Zheng/article/details/50476757 在xml文件配置多条参数同时插入: <insert id=&quo ...

  10. PHP 合并有序数组

    <?php //两个有序数组合并 $arr1 = [1,5,7,44,66,89]; $arr2 = [4,5,6,88,99,105,111]; $arr3 = []; $l1 = count ...