New Resume部分
New Resume部分位于子目录nresume中,它包含两个ASP文件(见图29.3)。这两个用于发布一个新的履历表,在第一页上用户输入个人简历,在第二页上,信息被确认并输入数据库。
图29.3 New Resume部分
nresume1.asp nresume2.asp
New Resume页
New Resume页的源文件名nresume1.asp,这个页的主体部分由HTML表单构成(见图29.4)。这个表单包含了用户输入信息例如:工作目标,技能等。这里显示的输入信息的HTML表单的源代码。
<BLOCKQUOTE>
<BR>*Your Full Name:
<BR><INPUT NAME="FullName" TYPE=TEXT SIZE=30 VALUE="<%=Request.Form("FullName")%>" MAXLENGTH="50">
<P>*Your Email:
<BR><INPUT NAME="Email" TYPE=TEXT SIZE=30 VALUE="<%=Request.Form("Email")%>" MAXLENGTH="50">
<P>Your Phone:
<BR><INPUT NAME="Phone" TYPE=TEXT SIZE=30 VALUE="<%=Request.Form("Phone")%>" MAXLENGTH="30">
</BLOCKQUOTE>
注意每个表单字段都有一个MAXLENGTH属性,填写到每个表单字段中的数据将会插入进数据库表中。一个表的字段有其最大长度,MAXLENGTH属性防止用户输入比此表中字段长度更多的信息。如果你不使用MAXLENGTH属性的话,当表中的内容插入到数据库中去时可能会收到一个来自SQL Server的错误消息。
同时也注意每个表单字段所用的VALUE属性,例如FullName字段的VALUE属性值被指定为“< %=Server.cfmLEncode(Request.From(
“FullName”))%>”。当这个HTML首次显示的时候,Request. Form(“FullName”)返回一个空字符串。换句话说,此时VALUE属性没有内容,VALUE属性的作用在下一段中详细介绍。
图29.4 New Resume页
Confirm New Resume页
当用户单击位于New Resume页上的Submit Resume按钮时,他将被带入Confirm New Resume页。Confirm New Resume页的文件名为nresume2.asp。
根据用户在提交的表单内容,Confirm New Resume将显示不同的页面(见图29.5)。
这个页面用来在将表单内容插入数据库之前对其验证,表29.2显示了其完整的代码。
图29.5 Confirm New Resume
列表29.2 nresnme2.asp代码
<%
' Replaces Single Quotes With Double Quotes
FUNCTION KillQuotes(theString)
KillQuotes=Replace(theString,"'","''")
END FUNCTION
' Create All Of The Hidden Fields
SUB HiddenFields
FOR EACH thing IN Request.Form
%>
<INPUT NAME="<%=Thing%>" TYPE="HIDDEN" VALUE="<%=Request.Form(Thing)%>">
<%
NEXT
END SUB
%>
<HTML>
<HEAD><TITLE> Confirm Resume </TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF" ALINK="#FF0000">
<!-- Create Title Banner Table -->
<TABLE BGCOLOR="#00aaff" WIDTH="100%">
<TR><TD VALIGN=CENTER>
<FONT FACE=ARIAL SIZE=+4> ASP Job Site</FONT><FONT SIZE=+2> <I> Confirm New Resume </I></FONT>
</TD></TR>
</TABLE>
<!-- Create Main Body Table -->
<TABLE HEIGHT="100%" CELLPADDING=20>
<TR>
<!-- The Left Cell Of The Body Table Contains The Navigation Strip -->
<TD ALIGN=CENTER VALIGN=TOP BGCOLOR="#D0D0D0" WIDTH=100>
<B>
<P><A HREF="../default.asp">Home</A>
<P><HR>
<P>Consultants
<P><A HREF="/fjob/fjob1.asp">Find A Job</A>
<P><FONT COLOR="#808080">Post A Resume</FONT>
<P><A HREF="/uresume/uresume1.asp">Update Your Resume</A>
<P><HR>
<P>Employers
<P><A HREF="/fconsult/fconsult1.asp">Find A Consultant</A>
<P><A HREF="/njob/njob1.asp">Post A Job</A>
<P><A HREF="/ujob/ujob1.asp">Update Job Information</A>
</B>
</TD>
<!-- The Right Cell Of The Body Table Contains The Page Contents -->
<TD ALIGN=CENTER VALIGN=CENTER>
<TABLE HEIGHT="100%" ALIGN=CENTER CELLSPACING=50>
<TR><TD>
<%
' Check Whether Passwords Match
IF UCASE(Request.Form("Password"))<>UCASE(Request.Form("CHKPass")) THEN
%>
<FONT SIZE=+2><i>The two passwords you entered do not match.</i>
<BR>Click Back to return to the previous page.</FONT>
<P>
<FORM METHOD="POST" ACTION="nresume1.asp">
<% HiddenFields %>
<INPUT TYPE="SUBMIT" VALUE="Back">
</FORM>
<%
ELSE
' Check For Required Fields
IF Request.Form("FullName")="" or
Request.Form("Email")="" or
Request.Form("Password")="" THEN
%>
<FONT SIZE=+2><i>In order to submit your resume, you must complete all required fields.</i>
<BR>Click Back to return to the previous page.</FONT>
<P>
<FORM METHOD="POST" ACTION="nresume1.asp">
<% HiddenFields %>
<INPUT TYPE="SUBMIT" VALUE="Back">
</FORM>
<%
ELSE
' Create ADO Objects
Set MyConn=Server.CreateObject("ADODB.Connection")
MyConn.Open Application("ConnectionString")
' Check If Email Already Exists
SET RS=MyConn.Execute("SELECT FullName
FROM resumes WHERE EMAIL='"&Request.Form("Email")&"'")
IF NOT RS.EOF THEN
%>
<FONT SIZE=+2><i>The email address you entered already exists.</i>
<BR>To update your resume, please visit our Update Resume Page.
Otherwise, click Back to return to the previous page and enter a different email address.</FONT>
<P>
<FORM METHOD="POST" ACTION="nresume1.asp">
<% HiddenFields %>
<INPUT TYPE="SUBMIT" VALUE="Back">
</FORM>
<%
ELSE
' IF Email Does NOT Exist, Then Do SQL INSERT
' Create SQL Insert String
FOR EACH thing IN Request.FORM
IF Request.Form(thing)<>"" and UCASE(thing)<>"CHKPASS" THEN
MyCols=MyCols&thing&","
IF Request.Form(thing)="CHECKED" THEN
MyVals=MyVals&"1,"
ELSE
MyVals=MyVals&"'"&KillQuotes(Request.Form(thing))&"',"
END IF
END IF
NEXT
MyCols="INSERT resumes ("&MyCols&"EntryDate) "
MyVals="VALUES ("&MyVals&"'"&NOW&"')"
MySQL=MyCols&MyVals
MyConn.Execute MySQL
%>
<FONT SIZE=+2><i>Thank you for submitting your resume!</i>
<BR>You can use your password to update your resume any time in the future
by visiting the Update Resume Page.
<P>
<FORM ACTION="../default.asp">
<P ALIGN=RIGHT><INPUT TYPE="SUBMIT" VALUE="Home">
</FORM>
<%
END IF ' For Email Exists
RS.Close
MyConn.Close
END IF ' For Required Fields
END IF ' For Matching Passwords
%>
</TD></TR>
<!-- Close Nested Table -->
</TABLE>
</TD></TR>
<!-- Close Body Table -->
</TABLE>
</BODY>
</HTML>
这个ASP页在提交HTML表单之前验证三件事:
■首先,它检查用户在HTML表单中输入的两个密码是否匹配。
■其次,检查,所必须填入的字段是否都已正确填写。
■最后,检查用户输入的e-mail地址在数据库中是否已经存在。
如果以上三条准则中的任何一条失败,用户将得到一个错误信息。他可以单击标有Back的按钮来返回New Resume页。例如,这里显示的是当用户没有全部填写必须填入字段时所显示错误信息的程序代码。
' Check For Required Fields
IF Request.Form("FullName")="" or
Request.Form("Email")="" or
Request.Form("Password")="" THEN
%>
<FONT SIZE=+2><i>In order to submit your resume, you must complete all required fields.</i>
<BR>Click Back to return to the previous page.</FONT>
<P>
<FORM METHOD="POST" ACTION="nresume1.asp">
<% HiddenFields %>
<INPUT TYPE="SUBMIT" VALUE="Back">
</FORM>
这个代码片断将检查用户是否输入名字,E-mail地址和密码。如果他没有填入以上的任一项,将显示错误信息和HTML表单,注意所调用的过程Hidden Fields,这个过程被放置在HTML表单中,它做什么呢?
设想一下如果一个人填写了所有的简历信息,仅仅忘了填写e-mail地址。他提交了表单并得到一个错误信息和一个按钮用于返回前一页。如果当他返回前页时发现他所先前已经输入表单的信息全部丢失的话,一定会很沮丧,怎样才能防止这一切发生呢?
通过用隐蔽字段将信息传回到页面的方法,表单中可以显示用户先前输入的数据。例如,假设一个人在New Resume页中的job goals这一栏中输入了一段很长的信息,但忘了输入一个e-mail地址。为了将信息通过Confirm New Resume页传送回New Resnme页,你可以使用以下的代码:
<FORM METHOD="POST" ACTION="nresume1.asp">
<INPUT NAME=“Goals”TYPE=“HIDDEN”VALUE=“<%=Request.FORM(
“Goals”)%>”><INPUT TYPE="SUBMIT" VALUE="Back">
</FORM>
记住在先前的一段中,在New Resume 页中所有的HTML表单字段都有VALUE属性。例如:Goals 字段的文本框HTML 代码如下:
<BLOCKQUOTE>
Enter a brief description of your work goals:
<BR><TEXTAREA NAME="Goals" COLS=40 ROWS=10 WRAP="VIRTUAL">
<%=Request.Form("Goals")%></TEXTAREA>
</BLOCKQUOTE>
当用户第一次使用New Resume页时,在Goals文本框没有显示任何信息。但是,假设当他递交表单时一个错误发生,当他按动在Confirm New Resume页中的Back按钮返回New Resnme页时,任何先前输入Goals文本块的内容将再每次出现,数据通过隐蔽字段传送回第一页。
但是,如果在Confirm New Resume页中为每一个在New Resume页上的表单字段都设置一个隐藏字段将是一项很乏味的工作。幸运的是,你不必这样做。HiddenFields过程将自动执行这一切,这里是这个过程的代码:
' Create All Of The Hidden Fields
SUB HiddenFields
FOR EACH thing IN Request.Form
%>
<INPUT NAME="<%=Thing%>" TYPE="HIDDEN" VALUE="<%=Request.Form(Thing)%>">
<%
NEXT
END SUB
这个过程为在From集合中的每个项都创建一个隐藏字段,如果从New Resume页中提交的HTML表单有500个字段的语,这个过程将自动在Confirm New Resume页中产生500个隐藏字段。当用户按动Back按钮,所有的隐藏表单字段将回送到New Resume页,所有输入到HTML表单的元素信息都得到保存。文章框、文本域、甚至检查框都能从隐藏表单字段中获得正确的数据。在这里检查框将引起一个特殊问题。这里是在New Resume页中使用的代码,用来提供检查框一个正确的值:
<BR><INPUT NAME="IIS" TYPE="CHECKBOX"
VALUE="CHECKED" <%=Request.Form("IIS")%>>Internet Information Server
注意到检查框的VALUE属性被设置成CHECKED。如果当表单被提交时,检查框是被选中的,那么IIS表单字段的值是CHECKED。如果用户在一个错误之后返回这一页,这个值将在INPUT标记里显示出来,通过显示CHECKED属性,检查框被再次选中。
现在假定表单内容有错误,这时数据将插入名为resumes的数据库表,一个SQL INSERT语句用于将数据插入resumes表。在处理过程中,这个SQL INSERT语句将根据表单集合中内容自动产生。表单的每项名称都与resumes表中的字段名相一致,通过循环语句产生SQL INSERT语句。
以下是动态产生SQL INSERT字符串的代码:
' Create SQL Insert String
FOR EACH thing IN Request.FORM
IF Request.Form(thing)<>"" and UCASE(thing)<>"CHKPASS" THEN
MyCols=MyCols&thing&","
IF Request.Form(thing)="CHECKED" THEN
MyVals=MyVals&"1,"
ELSE
MyVals=MyVals&"'"&KillQuotes(Request.Form(thing))&"',"
END IF
END IF
NEXT
MyCols="INSERT resumes ("&MyCols&"EntryDate) "
MyVals="VALUES ("&MyVals&"'"&NOW&"')"
MySQL=MyCols&MyVals
MyConn.Execute MySQL
%>