在今天我主要要介绍的有如下知识点:

HTML表单的提交方式

HTM控件

获取HTML表单内容

乱码问题

SQL注入

服务器端表单

HTML服务器控件

HTML表单的提交方式对于一个普通HTML表单来说,它有两个重要的属性:action和method。

action属性指明当前表单提交之后由哪个程序来处理,这个处理程序可以是任何动态网页或者servlet或者CGI(Common Gateway Interface),在asp.net里面一般都是都aspx页面来处理。

method属性指明form表单的提交方式。它有两个可能值get和post。

下 面我们以一个例子来说明get和post的区别。用Dreamweaver8创建两个aspx页面,分别为Register.aspx和 GetUserInfo.aspx。暂时我们不需要在GetUserInfo.aspx页面写任何代码,Register.aspx页面的代码如下:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

用户注册  title >

head >

用户注册  td >  tr >

用户名  td >    td >  tr >

密码  td >    td >  tr >

td >    td >  tr >

table >

form >

body >

html >

将Register.aspx和GetUserInfo.aspx都保存到C:/Inetpub/wwwroot下,然后打开浏览器在地址栏中输入http://localhost/register.aspx ,用户名和密码分别输入“zhoufoxcn”和“123456”,点击“提交”按钮,我们看到如下结果:

 注 意上面的代码中“

”这句,现在我们仅仅将method由“get”变成“post”,我们再次输入“zhoufoxcn”变成 “123456”,提交表单,我们看到如下结果:

 细 心的朋友可能会注意到,当我们以get方式提交的时候,在浏览器地址栏里除了接收参数的网页名之外,还有我们的表单名和参数值,在这里是 “username=zhoufoxcn&pwd=123456”,而以post方式提交的时候地址栏除了接收参数的网页之外并没有这样参数。具 体说来get和post提交方式有如下两个区别:

(1)get方式提交的表单在地址栏会显示参数名和参数值,而post方式不会。用post提交 参数相对来说更隐蔽一些,也相对安全一些。假如我们这个页面用于用户登录并且存放用户信息的表为“users”,我们的sql语句可能会这么 写:string sql=” select * from users where username='”+username+”’ and password='”+password+”’”;然后我们的username和password变量从表单提交的数据获取,正常情况下用户填写是没有 问题,就上面的例子来说用户填写的用户名和密码分别是“zhoufoxcn”和“123456”,那么我们最后得到的SQL语句 是:sql=”select * from users where username=’zhoufoxcn’ and password=’123456’”,这样是没有问题的。如果用get方式提交,用户可以对上面的参数进行一些改动,比如在地址栏直接输入:http://localhost/GetUserInfo.aspx?username=zhoufoxcn&pwd=123';delete * from users',那么我们得到的SQL就是:string sql=” select * from users where username='zhoufoxcn' and password='123';delete * from users'”,执行上面的SQL语句就能把Users这个表里的所有数据删除掉!这个一个触目惊心的危险!这个就叫SQL注入。

(2)由于浏览器地址栏能输入的最大字符数有限制,所以用get方式提交不能处理参数值更大的表单,而post方式则没有这个限制。

上面我说到用post方式提交表单相对安全,并没有说绝对安全,就拿上面的表单来说,假如上面的网站代码发布在www.netskycn.com 上发布,我们可以通过http://www.netskycn.com/register.aspx和http://www.netskycn.com/GetUserInfo.aspx 来访问,那么我们完全可以在本地制作一个网页,HTML的页面都行,它的代码如下:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

用户注册

用户注册
用户名
密码

注意表单的action属性我用了全路径的url地址,只要我们能连上互联网,那么这个表单一样可以正确提交的,同样也能产生触目惊心的危害!对于这个问题如何避免我会专门抽出一篇文章来讲如何防范,这里暂不赘述。

HTML控件HTML控件在上面的例子里已经用到,它就是指用HTML表单里的一些列元素来提供用户交 互,它们都是类似“

获取表单值通过用get方式提交表单我们可以看到提交到服务器的时候,在网页后面有 “?username=zhoufoxcn&pwd=12345”这么一个字符串,也就是以表单里HTML控件的名字=控件值的方式,并且如果存 在多个控件,彼此之间以“&”分割,那么我们就可以以控件名来获取控件值。获取HTML控件值常见有以下集中方式:

获取方式表单提交方式

Request.QueryString["控件名"]适合于get方式提交的表单

Request.Form["控件名"]适合于post方式提交的表单

Request["控件名"]同时适合于get和post方式提交的表单

从上面我们可以看到用Request["控件名"]这种方式对于get和post两种方式都可行,那么我们就可以用这种方式来应付所有提交的表单。现在我们在“GetUserInfo.aspx”页面编写如下代码:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

注册表单提交的信息  title >

head >

用户名:

密码:

body >

html >

我们再次输入“zhoufoxcn”和“123456”并提交表单,得到如下画面:

 得到了我们期望的效果。

乱码问题

对于上面的表单,我们在用户名和密码处分别输入“周公”和“123456”,会得到如下的结果,如下图:

 这里用户就变成了“???”了,之所以出现这样的情况就是因为我们的编码原因。这就像我们在酒吧里对一个懂普通话的服务员说来一杯酒,他马上会送你一杯酒;可是当我们对一个不懂普通话的服务员用普通话说来一杯酒,他就会一头雾水了。

之所以出现乱码就是因为在这里客服端请求的编码和服务器响应的编码不一致,这个问题在《asp.net夜话之二:内置对象》中讲Request和Response对象的时候讲到过,没有看过的朋友请返回去看一下,这里只贴出结果:

从 上面的图上我们看到默认情况下Request的ContentEncoding为UTF8Encoding,而Response的 ContentEncoding为System.Text.DBCSCodePageEncoding,二者的不一致导致了输入中文成了乱码。

我 们常见的编码有gb2312、gbk和unicode几种,gb2312能显示日常生活最常用的6000多个汉字,这对于一般的公文足够了,可是如果要用 来显示一个古文献就不行了(据说康熙词典收录了4万多汉字),当它不能显示的时候也会出现乱码。Gbk是在gb2312的基础上扩展的,大概能显示1万8 千多个汉字,这对于一般古文献也差不多够了。Unicode则更大一些,它能显示20901个汉字(范围是从/u4e00到/u9fa5),并且还能显示 日文、韩文、台湾文字、香港文字和新加坡等文字,所以目前很多网站都采用unicode编码。Utf8编码就是unicode编码中的一种,关于它们的编 码原理有兴趣的朋友可以查询有关资料。

因为目前用Dreamweaver创建动态网页的时候默认都是采用gb2312编码(asp和jsp的程序 员的网站编码很多都采用了这个默认值)。如果我们要想正确获取表单的值,我们可能就需要更改默认编码,对于上面的乱码问题,我们只需要更改 Register.aspx页面就行,将Register.aspx页面的这部分更改一下:

更改为:

这样就能正常显示了,如下:

 注意,使用Microsoft Visual Studio 2005创建网站的时候默认编码就是utf-8,无需更改。

服务器端表单在此之前我们见到的表单都是如下格式:

并且我们都是利用的HTML控件。现在我们要介绍服务器端表单,服务器端表单与前面的表单相比,多了一个runat=”server”标记,如下:

在服务器端表单里可以不用指定action属性,表示由当前页面处理,也可以不指定method属性,默认为post方式提交表单。在服务器端表单 里,我们不光可以使用HTML控件,还可以使用HTML服务器控件,还可以使用asp.net控件(asp.net控件稍后会专门花篇幅介绍)。

另外需要注意的是,在一个asp.net页面中可以有多个不带runat=”server”标记的表单,但是只能有一个服务器端表单。

HTML控件

HTML服务器控件与普通服务器控件不同的是:在普通HTML控件中加上了一个id属性和一个runat=”server”标记。如下就是一个HTML服务器控件:

HTML服务器控件有几个限制:

在整个asp.net页面中这个控件id的必须唯一,并且HTML服务器控件只能放在HTML服务器表单 中。因为一个asp.net页面只能有一个服务器表单,所以说在服务器表单中控件的id值必须唯一,因为我们在编程的时候通过这个id来访问HTML服务 器控件。如果不唯一就会报错,如下:

下面就是一个使用了HTML服务器控件并且能正确运行的表单:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

服务器表单和HTML服务器控件  title >

head >

form >

body >

html >

这个页面在浏览器端的HTML源代码如下:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

服务器表单和HTML服务器控件  title >

head >

div >

div >  form >

body >

html >

我们可以看到在客服端得到的HTML代码中都是标准的HTML代码,我们的文本框和密码框及服务器端提交按钮(因为它在服务器代码里也有runat=”server”标记)变成了如下代码:

也就是,所有的服务器控件经过服务器运行之后都会变成标准的HTML控件。这样我们可以得出一个结论:如果我们的控件功能本来就很简单,我们就可以直接使用HTML控件,这样就可以减轻服务器的负担,提高运行效率。另外,在上面的代码中多了一些以前我们没有见过的部分:

因为服务器会保存服务器控件的状态和属性,所以它会利用一些隐藏域来保存这方面的信息,这部分的内容是经过Base64编码的。

服务器控件的好处是我们可以动态在代码中动态控制服务器控件的属性,对于上面的代码我们改造如下:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

服务器表单和HTML服务器控件  title >

head >

protected void btnOK_Click(Object Src, EventArgs E)

{

Response.Write("用户名:"+this.txtUserName.Value);

Response.Write("密码:"+this.txtPassword.Value);

this.btnOK.Disabled = true ;

}

script >

form >

body >

html >

上面代码中多了“”,并且提交按钮多了一个onserverclick="btnOK_Click" 属性。在“”标记中我们写了一个protected void btnOK_Click(Object Src, EventArgs E)方法,这个方法符合System.EventHandler委托的标准。这个方法有两个参数,第一个表示由什么控件激发了这个事件,第二个参数表示事 件发生时的一些相关信息。

在protected void btnOK_Click(Object Src, EventArgs E)方法中我们利用了类似WinForm中操作控件的方式来操作我们的服务器控件,这也就是为什么asp.net页面成为WebForm的原因。在这个方 法里我们获取了控件的值,并最后将提交按钮禁用。

提交按钮的onserverclick属性值表示当这个按钮点击后由服务器上的哪个方法进行处理,这个方法要满足System.EventHandler委托的定义,这里我们写了btnOK_Click这个方法名。

这个页面初次运行的效果如下:

 然后我们分别输入”zhoufoxcn”和”123456”,提交表单之后的效果如下:

 我们看到在当前页面输出了表单控件的值,并且最后提交按钮呈现灰色状态,也就是被禁用了。

html表单用户名,HTML表单相关推荐

  1. ajax注册表单用户名实时验证,Ajax注册表单用户名实时验证..doc

    Ajax注册表单用户名实时验证. Ajax注册表单用户名实时验证 1.1.1 摘要 很多时候在网站上注册时,我们会发现,注册表单通常需要检查用户名和电子邮件地址的可用性:从而确保用户之间不拥有相同的用 ...

  2. java 用户名不为空_[Java教程]【关于JavaScript】常见表单用户名、密码不能为空

    [Java教程][关于JavaScript]常见表单用户名.密码不能为空 0 2015-05-31 12:00:14 在论坛等系统的用户注册功能中,如果用户忘记填写必填信息,如用户名.密码等,浏览器会 ...

  3. Ajax注册表单用户名实时验证

    原文地址为: Ajax注册表单用户名实时验证 1.1.1 摘要 很多时候在网站上注册时,我们会发现,注册表单通常需要检查用户名和电子邮件地址的可用性:从而确保用户之间不拥有相同的用户名和电子邮件地址: ...

  4. js验证表单用户名,密码

    实现目标: 当表单用户名.密码等各项内容符合格式时,表单提交成功,否则表单验证不通过,提交失败.废话不多说,上码,效果图最后. js代码: function checkUname() {var una ...

  5. php ci提交表单验证,ci表单验证代码

    概述 这是只考虑php对表单数据的接收处理.至于js部分以前会结合validate来讲解下 在解释 CodeIgniter 的数据验证处理之前,让我们先描述一下一般的情况: 一个表单显示了. 你填写并 ...

  6. Struts2 表单和非表单标签

    学习内容 Struts 2表单标签 Struts 2非表单标签 能力目标 熟练使用Struts 2表单标签开发表单 熟练使用Struts 2非表单标签 本章简介 上一章讲述了ognl和Struts2标 ...

  7. php显示html表单内容,HTML表单是什么?HTML表单内容的详细介绍(附代码)

    HTML 表单是用于搜集不同类型的用户输入的,表单是一个包含表单元素的区域:表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素:表单使用表单标签( )定义. 一.介 ...

  8. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例:1.写一个注册页面,把请求交给 struts处理<form action="${pageContext.r ...

  9. html把保留图片改为提交按钮,如何制作图片按钮,并为图片按钮添加提交表单和重置表单功能...

    网页中有表单,表单的默认按钮样式不是很好看,很多人为了美观使用图片做按钮. 今天中国在 一.图片按钮的制作方法 1. 定义图像形式的提交按钮. 2.用CSS把图片设为按钮的背景 3.作用,设置其bac ...

最新文章

  1. CentOS6.5更改ssh端口问题
  2. Ajax的优缺点以及异步和同步的区别
  3. 信息系统项目管理师-学习方法、重难点、10大知识领域笔记
  4. php trace 图形,trace工具定位php性能问题
  5. 1-Mybatis入门案例
  6. dcloud会员激活mui
  7. VC下几种转换为UNICODE字符串的方法
  8. aixdb2安装手册_AIX下安装db2数据库步骤
  9. AVR之bootloader介绍
  10. C#ORM系统 Moon.ORM使用方法
  11. [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用
  12. Studio One5中文电脑音乐制作宿主软件保卫萝卜
  13. 多渠道打包,生成不同包名的包
  14. sql 中英文格式的时间转数字格式
  15. 吉林大学老师蓝牙点名被赞“有创意”
  16. Python SMTP发送邮件
  17. Unity ShaderGraph图片发光效果
  18. Self-attention(李宏毅2022
  19. Kettle教程(三):Excel转换文本
  20. 【0基础强力推荐】R语言快速入门

热门文章

  1. FIFO、UART、ALE解释
  2. 解读Scorm(0):标准
  3. 《云计算:原理与范式》一3.10 企业对企业集成服务
  4. enum类型的标签内容根据语言的取法
  5. Windows 平台sqlalchemy 连接oracle数据库
  6. Oracle show sga产生的结果研究
  7. Springboot 应用部署建议
  8. Kotlin数据类型(一:数据类型)
  9. SPI子系统分析之二:数据结构【转】
  10. 关于垃圾回收,我来解释下为什么LocalConnection可以实现垃圾回收