简单生活 发表于 2015-1-18 11:40:04

JAVA编程:用定制标签库和设置文件完成对JSP页面元...

JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。js|会见|把持|页面把持客户端会见是开辟一个基于B/S的架构的体系的开辟者必需思索的成绩。JSP或SERVLET标准的基于设置文件的平安战略对资本的把持是以文件为单元的,即只能够界说某个视图全体能够或全体不克不及被会见。一个对照庞大的体系常常要请求对视图的一部分(如JSP页面里的一个按钮)供应会见把持,只同意被某种脚色的用户会见。假如接纳可编程的平安战略,由于对用户脚色和操纵的界说在开辟时不克不及界说,并且这类战略加年夜了程序员的事情量,它大概不是一种好的举措。
我接纳定制标签库和和设置文件来办理这个成绩:把要权限把持的JSP页面元素如BUTTON,作为标签的内容。为受回护的内容起一个独一的称号,把这个称号作为标签的一个属性。某个脚色对某个页面元素或一组页面元素是不是有权限,在XML设置文件中形貌。
比方,上面的JSP页面有“具体”和“修正”两个按钮。
<%@tagliburi="http://mytag"prefix="custTag"%>
<html>
<head>
<title>test</title>
</head>
<body>
<formname="form1">
<tablewidth="600"border="0"cellspacing="0"cellpadding="2">
<tr>
<td>
<custTag:JspSecurityelementName="employeedetail">
<inputtype="button"name="detail"value="具体">
</custTag:JspSecurity>
<custTag:JspSecurityelementName="employeemodify">
<inputtype="button"name="modify"value="修正">
</custTag:JspSecurity>
</td>
</tr>
</table>
<br>
</form>
</body>

上面XML设置文件内容暗示对脚色为common的用户,只对名为employeedetail的页面元素即“具体”按钮有权限,对脚色为“admin”的用户,对名为employeedetail和employeemodify的页面元素即两个按钮都有权限。
<?xmlversion="1.0"encoding="GB2312"?>
<security>
<htmlElementname="employeedetail">
<roleNamename="common"/>
<roleNamename="admin"/>
</htmlElement>
<htmlElementname="employeemodify">
<roleNamename="admin"/>
</htmlElement>
</security>

定制标签类JspSecurityTag承继了BodyTagSupport类。BodyTagSupport有一个变量bodyContent指向肇端标记和停止标记之间的内容。JspSecurityTag的公有静态变量roleList保留从XML文件中取到脚色和页面元素的对应汇合,公有变量ElementName对应页面元素的称号。当剖析该定制标签时,起首先取到页面元素的称号,再取到以后用户的脚色,假如脚色有该页面元素的权限,就显现标签注释(即页面元素),不然不显现。

Pagekagecom.presentation.viewhelper.JspSecurityTag;

importjavax.servlet.jsp.tagext.*;
importjavax.servlet.jsp.*;
importjava.util.*;
importorg.xml.sax.*;
importorg.xml.sax.helpers.*;
importorg.w3c.dom.*;
importjava.io.*;
importjavax.xml.parsers.*;

publicclassJspSecurityTagextendsBodyTagSupport{
//保留从XML文件中取到脚色和页面元素的对应汇合
privatestaticArrayListroleList;
//页面元素的称号
privateStringelementName;

publicvoidsetElementName(Stringstr)
{
this.elementName=str;
}

publicintdoAfterBody()throwsJspException{
if(roleList==null)
{
roleList=getList();
}
try{
//假如认证经由过程就显现标签注释,不然跳过标签注释,就这么复杂
if(isAuthentificated(elementName))
{
if(bodyContent!=null){
JspWriterout=bodyContent.getEnclosingWriter();
bodyContent.writeOut(out);
}else
{
}
}
}catch(Exceptione){
thrownewJspException();
}
returnSKIP_BODY;
}
//从XML设置文件中取到脚色和页面元素的对应,保留到静态的ArrayList
privateArrayListgetList()
{
DocumentBuilderFactorydbf=
DocumentBuilderFactory.newInstance();
DocumentBuilderdb=null;
Documentdoc=null;
NodeListchildlist=null;
StringelementName;
StringroleName;
intindex;
ArrayListtheList=newArrayList();

try{
db=dbf.newDocumentBuilder();
}catch(Exceptione)
{
e.printStackTrace();
}
try{
doc=db.parse(newFile("security.xml"));
}catch(Exceptione)
{
e.printStackTrace();
}
//读取页面元素列表
NodeListelementList=doc.getElementsByTagName("htmlElement");
for(inti=0;i<elementList.getLength();i++)
{
Elementname=((Element)elementList.item(i));
//页面元素的称号
elementName=name.getAttribute("name");
//该页面元素对应的有权限的脚色的列表
NodeListrolNodeList=((NodeList)name.getElementsByTagName("roleName"));
for(intj=0;j<rolNodeList.getLength();j++)
{
//有权限的脚色的称号
//roleName=((Element)rolNodeList.item(j)).getNodeValue();
roleName=((Element)rolNodeList.item(j)).getAttribute("name");
theList.add(newElementAndRole(elementName,roleName));
}
}
returntheList;
}

//反省该脚色是不是有该页面元素的权限
privatebooleanisAuthentificated(StringelementName)
{
StringroleName="";
//在用户上岸时把该用户的脚色保留到SESSION中,这里只是间接从SESSION中取用//户脚色。
roleName=this.pageContext.getSession().getAttribute("rolename”);
//roleList包括elementName属性为elementName,roleName属性为roleName的//ElementAndRole对象,则该脚色有该页面元素的权限
if(roleList.contains(newElementAndRole(elementName,roleName)))
{
returntrue;
}
}
returnfalse;
}
//暗示脚色和页面元素的对应的干系的外部类
classElementAndRole{
StringelementName;
StringroleName;
publicElementAndRole(StringelementName,StringroleName)
{
this.elementName=elementName;
this.roleName=roleName;
}
publicbooleanequals(Objectobj)
{
return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));
}
}
}
在标签库能被JSP页面利用前,要做以下三个步骤
1、在JSP页面中包含一个taglib元素,断定必要加载到内存的标签库。后面的JSP文件的第一行:<%@tagliburi="http://mytag"prefix="custTag"%>做的就是这件事。
2、在设置文件web.xml中利用taglib元素断定TLD文件的地位。在web.xml中增添:
<taglib>
<taglib-uri>http://mytag</taglib-uri>
<taglib-location>
/WEB-INF/mytag.tld
</taglib-location>
</taglib>
3、TLD文件必需利用taglib元素标识每一个定制标签极为属性。
上面是利用这个标签库对应的TLD文件
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!DOCTYPEtaglib
PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>myTag</shortname>
<uri/>
<tag>
<name>JspSecurity</name>
<tagclass>com.presentation.viewhelper.JspSecurityTag</tagclass>
<info>
JspSecurityTag
</info>
<attribute>
<name>elementName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>



ruby里有这些工具吗?又要简单多少?我没有用过这两门语言,我估计在这些语言力没有很统一的这种标准,或者根本就没有提供。

活着的死人 发表于 2015-1-21 12:30:22

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

小魔女 发表于 2015-1-25 17:48:17

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

小妖女 发表于 2015-1-30 09:30:44

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

admin 发表于 2015-2-4 06:03:50

是一种使用者不需花费很多时间学习的语言

不帅 发表于 2015-2-9 16:50:26

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

小女巫 发表于 2015-2-27 17:08:17

是一种突破用户端机器环境和CPU

只想知道 发表于 2015-3-2 20:49:53

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

谁可相欹 发表于 2015-3-10 12:29:41

是一种使用者不需花费很多时间学习的语言

爱飞 发表于 2015-3-17 06:22:42

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

若相依 发表于 2015-3-19 14:06:11

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

灵魂腐蚀 发表于 2015-3-24 05:31:11

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

再见西城 发表于 2015-3-25 03:02:42

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

深爱那片海 发表于 2015-3-27 19:09:47

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

冷月葬花魂 发表于 2015-4-4 19:48:50

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

再现理想 发表于 2015-4-6 13:51:20

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

老尸 发表于 2015-4-8 20:45:06

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

蒙在股里 发表于 2015-4-9 15:58:30

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

飘灵儿 发表于 2015-4-11 21:27:52

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

海妖 发表于 2015-5-10 18:57:41

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
页: [1]
查看完整版本: JAVA编程:用定制标签库和设置文件完成对JSP页面元...