萌萌妈妈 发表于 2015-1-18 11:39:43

JAVA网站制作之利用JSP标志库校验用户输出

C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱.js
在任何一个基于Web的使用中,程序逻辑请求用户提交必要校验的信息,而使用的创立者则能够用两种体例来检测数据。第一种办法就是在客户端校验,乃至在信息提交到服务器上之前也能够举行。一般,这类校验利用运转在客户端因特网扫瞄器内的JavaScript就能够完成。只管表格将要提交,可是剧本仍是会反省一切哀求的域,假如不切合就弹堕落误信息。第二种办法就是在服务器端校验。在实行对数据的任何操纵之前,利用使用服务器撑持的手艺来完成校验。
服务器真个校验使服务器更严重,却赐与了程序员更多的把持,而且包管了数据必定会检测。客户真个校验很简单被用户绕过(经由过程使JavaScript不克不及用),因而同意提交未检测的信息可使速率更快,由于用户不用传送页到服务器,也不用从服务器上猎取页。
今朝,愈来愈多的在线使用依附于服务器真个校验,次要缘故原由是它包管了检测而且进步了使用的平安性,另外一个缘故原由是服务器硬件和软件功能在近几年内有较年夜的进步,另有一个缘故原由是它虑及程序更年夜的天真性而且常常易于完成。
目次
校验历程
JSP标志
具有校验功效的JSP视图
结论
代码列表
在本文中,我将会商利用JavaJSP标志库举行服务器端校验的独一办法,而且冗长的形貌了JSP标志库的创立。我将在我之前文章"ApplyingMVCtoweb-basedapplicationswithJSPviews"形貌的Web使用上创建一个例子――一个在用户提交ZIP代码大概乡村名以后显现天色信息的复杂项目。该Web使用恪守Model-View-Controller(MVC)布局而且利用Tomcat使用服务器。
校验历程
在企业级使用中,数据校验是平安历程的必须部分。使用不仅必需捕获空域大概部分域,他还必需防备毛病项。假如数据提交到RDBMS存储器大概任何其他耐久性存储器内,而且已用在SQL语句中,用户就可以够附带(大概特地)提交招致SQL语句有效的坏数据。歹意用户乃至可以传送本义字符串大概将特别数据输出到提交表格内,使他们实行Web使用开辟者底本没有计划的任何操纵。比方他们能够删除来自数据库的行大概表格,大概猎取他们想要的信息。
我已完成校验的JSP页在MVC计划中属于"Views",而MVC计划是在线天色程序的一部分。每一个JSP视图要末提交数据要末显现数据。当提交带有ZIP代码大概乡村名的表格时,信息就被传送到服务器。在服务器上,ControllerServlet对象在特别操纵――来自于JSP的key参数――的基本之上实行一个操纵,然后重定向到下一个视图。更多细节我将在稍后会商;如今我们先看看JSP标志的事情体例。
JSP标志
你能够将JSP标志看做是一个可由运转在服务器上的Java代码实行的自界说举措。在JSP中,标志看起来就像一个尺度的HTML标志,可是它的逻辑不在客户端上实行,而是作为JSP转换而成的Servlet的一部分在服务器端实行。每一个标志封装在一个独自的类中,而且他的名字和参数属性显现在带有tld扩大名的特别设置形貌符文件内。该文件应当放在你的使用服务器内的web使用目次WEB-INF下,而且在JSP中利用%@taglib...%指令显现该文件,在web.xml文件中显现该文件。当JSP引擎碰到自界说标志时,它检测它本人是不是晓得标志类在那里,假如晓得的话,就实行响应的代码。标志类一般放在jar文件内而且放在WEB-INF下的lib目次下。
Ex...WEB-INFmytags.tld-deploymentdescriptorfile
Ex...WEB-INFlibmytags.jartaglibrary(orafulldirectorystructure)
为了展现怎样利用标志举行校验,我创立了一个自界说JSP标志来校验ZIP代码域,名叫notValidZip。标志能够实行任何举措,如HTML格局化、域操纵、大概乃至是数据库查询。为了其他的检测,我利用了来自ColdbeansSoftware(http://www.servletsuite.com)的标志库,也具有了校验HTML表格域的十分实在的标志。ColdbeansSoftware可收费用于非贸易用处。假如你必要在贸易站点利用标志,你能够本人编写大概购置。
上面是一个设置形貌符文件validtag.tld,它可以处置我的notValidZip标志:
<tag>
<name>notValidZip</name>
<tagclass>com.cj.valid.notValidZip</tagclass>
<bodycontent>JSP</bodycontent>
<info>testszipcode</info>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>length</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
显现了局为:它的名字叫notValidZip,它的代码在com.cj.valid.notValidZip类中,他有两个属性,一个属性必须,一个属性备选。
为了让Web使用晓得我包含了一个自界说标志库,我将这个标志库的信息增加到web.xml设置形貌符文件内。上面是代码:
<taglib>
<taglib-uri>/WEB-INF/validtag.tld</taglib-uri>
<taglib-location>/WEB-INF/validtag.tld</taglib-location>
</taglib>
最初,为了把这个标志库包含在JSP以内,我在我的JSP页首增加了这行代码:
<%@tagliburi="/WEB-INF/validtag.tld"prefix="valTag"%>
如今,经由过程编写标志前缀就能够利用来自该软件包中的任何标志;比方:
<valTag:notValidZipvalue="<%=request.getParameter("ZIP")%>">
<!--body-->
</valTag:notValidZip>
标志一般有一个别和备选属性。
<valTag:tagnameattribute1="value1"attribute2="value2">
<!--body-->
</valTag:tagname>
可是有些标志大概没有体;比方
<valTag:tagname/>.
在界说标志库时你能够编写你想要的任何前缀,可是标志名必需婚配tld文件中的名。
正如我所说,实在的校验逻辑是在Java类中举行的,这个Java类也被称为"notValidZip",放在标志库jar文件内。该标志类扩大了笼统TagSupport类,而且引进了javax.servlet.jsp.JspException,javax.servlet.jsp.tagext.标志和javax.servlet.jsp.tagext.TagSupport类。次要的举措逻辑在doStartTag()办法内。这个办法在JSP引擎碰到我的新标志时挪用。
doStartTag()办法前往的整数代码告知JSP引擎它是不是应当操纵标志的体。见本文开端的Listing1。
如今我们总结一下。起首,你编写标志类,将它放在web使用lib目次下的jar文件中,为标志创立一个设置形貌符文件,利用它的地位信息更新web.xml文件,最初利用taglib指令将它包含出去,你就能够在你的JSP中利用它了。假如我必要在多个中央举行ZIP代码校验,我只需将我的标志包含在多个页中。见Listing2.
具有校验功效的JSP视图
一般要增加校验功效,程序员必要一个独自的JSP页,这个页看起来像原版表格页,假如表格域有成绩,就显现毛病信息,而且由服务器显现(重定向到)该页。我只在原版JSP页中增加了毛病逻辑。表格第一次显现时不举行毛病检测。在提交举措中,表格将提交到他本身上,而且利用JSP标志校验域(在服务器端,JSPs编译成Servlets),而且假如统统准确,数据传送到次要的ControllerServlet.。不然,用户在统一个JSP中能够看到毛病信息。
在JSP页中,我有一个Javascriplet,它能够创立逻辑标志变量"validate",而且假如有一个"validate"参数提交给该JSP,它的值为true。
<%booleanvalidate=("true".equals((String)request.getParameter("validate")));%>
基于此逻辑变量值,JSP利用我的标志举行校验。在页面第一次装载时,这个变量为false,而且不必要校验。
为了提交页面给它自己,然后将它重定向到次要的ControllerServlet,我修正表格举措指向
<%=request.getRequestURI()%>
,而且默许JSP行进到标志
<jsp:forwardpage="../MainServlet"/>。
在用户提交表格时,他将一切的值都传送给统一个JSP,设定变量validate的值为true,检测利用的标志,而且假如数据失掉承认,JSP将一切的值传送给ControllerServlet。
假如呈现成绩,标志体将实行,而且告知JSP从头提交值到它自己上,然后依据毛病的分歧显现新的(大概分歧的)毛病信息。请注重:标志体内别的一个变量"success"也要设定为false。这个变量一入手下手设定为true,而且只反省是不是已实行过任何标志体。这就包管了只要当"validate"和"success"变量都为真时才传送表格。见Listing2.
假如你有多个域必要校验,来自标志体的毛病信息将显现不准确的域,这就削减了用户改正和从头提交的次数。
毛病的ZIP代码发生以下页面:
准确的ZIP代码发生以下页面:
结论
我输出到JSP中的附加逻辑能够在此JSP页面中实行校验操纵,将该逻辑与标志分离利用,就能够为服务器真个数据校验创立一个复杂而又十分可再用的计划,并且不必利用多个JSP大概Servlets。校验任何一品种型的域只需一个标志,你能够具有用于分歧的域范例的公用标志;比方电子邮件、德律风、大概只要整数的域。这类计划扩大了Model-View-Controller项目标JSP视图层,而且我能够用它来加强来自逻辑层的图象的分别度。假如标志代码产生了改动,利用JSP标志校验的Web计划师和开辟者也不用修正JSP中的任何代码;并且,他们不用晓得它是怎样校验的大概他利用了何种Java语法。他们只需把相似HTML的标志包含到他们的JSP页面中就能够了。【originaltext】【Downloadsourcecode】
代码列表
Listing1
publicintdoStartTag()throwsJspException{
//retruncodeof1willcausetagbodytoexecute
if(value==null)
returnthis.EVAL_BODY_INCLUDE;//checkifwehavezipcode
if(value.equals(null))
//checkifvalueisnotnull
returnthis.EVAL_BODY_INCLUDE;
if(value.length()==5){
//hastobeaninteger!shortcaseofzipcodexxxxx
try{
Integer.parseInt(value);
returnthis.SKIP_BODY;
}catch(NumberFormatExceptione){
returnthis.EVAL_BODY_INCLUDE;
}
}elseif(value.length()==10){
//longcaseofZipcodexxxxx-xxxx
Stringpart1=value.substring(0,5);
Stringdash=value.substring(5,6);
Stringpart2=value.substring(6);
if(!dash.equals("-"))
returnthis.EVAL_BODY_INCLUDE;
try{
Integer.parseInt(part1);
Integer.parseInt(part2);
returnthis.SKIP_BODY;
}catch(NumberFormatExceptione){
returnthis.EVAL_BODY_INCLUDE;
}
}
returnthis.EVAL_BODY_INCLUDE;//allothercases
Listing2
<FORMaction="<%=request.getRequestURI()%>"method="post">
<TABLEborder="1">
<inputtype="hidden"name="ACTIONKEY"value="WeatherAction.viewByZip">
<inputtype="hidden"name="REDIRECTKEY"value="weather_data">
<inputtype="hidden"name="validate"value="true">
<TBODY>
<TR>
<TD><fontface=Arialsize=2>Zip:</font></TD>
<TD>
<%if(validate){%>
<valTag:notValidZipvalue="<%=request.getParameter("ZIP")%>">
<!--dosomethingiffieldisempty-->
<fontcolor=redface=arialsize=2>
PleaseentervalidZipCode
</font><br>
<%success=false;%>
</valTag:notValidZip>
<%}%>
<INPUTtype="text"name="ZIP"
value="<%=((validate)?request.getParameter("ZIP"):"")%>">
<%if(success&&validate){%>
<jsp:forwardpage="../MainServlet"/>
<%}%>
</TD>
</TR>
<TR>
<TD></TD>
<TD><INPUTtype="submit"name="view"value="View"></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
Listing3
AbouttheAuthor
VladKofman是一个处置当局国防条约中的项目标体系机关师。他还介入了次要的华尔街公司和美国当局的企业级项目。他的次要乐趣在于面向对象的程序计划办法和计划形式。


比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。

灵魂腐蚀 发表于 2015-1-21 12:26:48

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

仓酷云 发表于 2015-1-25 08:44:53

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

蒙在股里 发表于 2015-1-25 23:35:18

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

飘灵儿 发表于 2015-1-29 06:30:44

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

若天明 发表于 2015-2-2 22:16:21

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

只想知道 发表于 2015-2-8 12:25:27

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

透明 发表于 2015-3-7 20:16:40

是一种将安全性(Security)列为第一优先考虑的语言

谁可相欹 发表于 2015-3-14 18:33:17

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

冷月葬花魂 发表于 2015-3-16 10:10:34

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

简单生活 发表于 2015-3-22 02:16:56

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

山那边是海 发表于 2015-4-5 08:47:06

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

飘飘悠悠 发表于 2015-4-10 04:49:18

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

乐观 发表于 2015-4-15 15:04:05

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

精灵巫婆 发表于 2015-4-21 16:44:09

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

海妖 发表于 2015-4-21 23:23:39

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

金色的骷髅 发表于 2015-4-23 07:29:51

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

不帅 发表于 2015-4-24 22:56:47

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

爱飞 发表于 2015-5-2 07:01:40

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

小女巫 发表于 2015-5-4 03:39:19

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
页: [1]
查看完整版本: JAVA网站制作之利用JSP标志库校验用户输出