Posts Tagged ‘件实’

JSP读取文件实例

星期一, 06月 2nd, 2008

//变量声明
java.lang.String strFileName; //文件名
java.io.File objFile; //文件对象
java.io.FileReader objFileReader; //读文件对象
char[] chrBuffer = new char[10]; //缓冲
int intLength; //实际读出de字符数(一个中文为一个字符)

//设置待读文件名
strFileName = “d:\\test.txt”;

//创建文件对象
objFile = new java.io.File(strFileName);

//判断文件是否存在
if(objFile.exists()){//文件存在
//创建读文件对象
objFileReader = new java.io.FileReader(objFile);

//读文件内容
while((intLength=objFileReader.read(chrBuffer))!=-1){
//输出
out.write(chrBuffer,0,intLength);
}

//关闭读文件对象
objFileReader.close();
}
else{//文件不存在
out.println(”下列文件不存在:” strFileName);
}

用定制标签库和配置文件实现对JSP页面元素的访问控制

星期一, 06月 2nd, 2008

控制客户端访问是开发一个基于B/Sde架构de系统de开发者必须考虑de问题.JSPSERVLET规范de基于配置文件de安全策略对资源de控制是以文件为单位de,即只可以定义某个视图全部可以或全部不能被访问.一个比较复杂de系统往往要要求对视图de一部分(如JSP页面里de一个按钮)提供访问控制,只允许被某种角色de用户访问.如果采用可编程de安全策略,因为对用户角色和操作de定义在开发时不能定义,而且这种策略加大了程序员de工作量,它可能不是一种好de办法.

我采用定制标签库和和配置文件来解决这个问题:把要权限控制deJSP页面元素如BUTTON,作为标签de内容.为受保护de内容起一个唯一de名称,把这个名称作为标签de一个属性.某个角色对某个页面元素或一组页面元素是否有权限,在XML配置文件中描述.

例如,下面deJSP页面有“详细”和“修改”两个按钮.

<%@ taglib uri=”http://mytag” prefix=”custTag” %>

<html>

<head>

<title>test</title>

</head>

<body >

<form name=”form1″ >

<table width=”600″ border=”0″ cellspacing=”0″ cellpadding=”2″ >

<tr>

<td>

<custTag:JspSecurity elementName=”employeedetail” >

<input type=”button” name=”detail” value=”详细” >

</custTag:JspSecurity>

<custTag:JspSecurity elementName=”employeemodify” >

<input type=”button” name=”modify” value=”修改” >

</custTag:JspSecurity>

</td>

</tr>

</table>

<br>

</form>

</body>

下面XML配置文件内容表示对角色为commonde用户,只对名为employeedetail de页面元素即“详细”按钮有权限,对角色为“admin”de用户,对名为employeedetail employeemodifyde页面元素即两个按钮都有权限.

<?xml version=”1.0″ encoding=”GB2312″?>

<security>

<htmlElement name=”employeedetail” >

<roleName name=”common” />

<roleName name=”admin” />

</htmlElement>

<htmlElement name=”employeemodify” >

<roleName name=”admin” />

</htmlElement>

</security>

定制标签类JspSecurityTag继承了BodyTagSupport类.BodyTagSupport有一个变量bodyContent指向起始标志和结束标志之间de内容.JspSecurityTagde私有静态变量roleList保存从XML文件中取到角色和页面元素de对应集合,私有变量ElementName对应页面元素de名称.当解析该定制标签时,首先先取到页面元素de名称,再取到当前用户de角色,如果角色有该页面元素de权限,就显示标签正文(即页面元素),否则不显示.

Pagekage com.presentation.viewhelper.JspSecurityTag;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.util.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import org.w3c.dom.*;

import java.io.*;

import javax.xml.parsers.*;

public class JspSecurityTag extends BodyTagSupport {

//保存从XML文件中取到角色和页面元素de对应集合

private static ArrayList roleList;

//页面元素de名称

private String elementName;

public void setElementName(String str)

{

this.elementName=str;

}

public int doAfterBody() throws JspException{

if(roleList==null)

{

roleList=getList();

}

try{

//如果认证通过就显示标签正文,否则跳过标签正文,就这么简单

if(isAuthentificated(elementName))

{

if(bodyContent != null){

JspWriter out=bodyContent.getEnclosingWriter();

bodyContent.writeOut(out);

}else

{

}

}

}catch(Exception e){

throw new JspException();

}

return SKIP_BODY;

}

//XML配置文件中取到角色和页面元素de对应,保存到静态deArrayList

private ArrayList getList()

{

DocumentBuilderFactory dbf =

DocumentBuilderFactory.newInstance();

DocumentBuilder db = null;

Document doc=null;

NodeList childlist = null;

String elementName;

String roleName;

int index;

ArrayList theList = new ArrayList();

try{

db = dbf.newDocumentBuilder();

}catch(Exception e)

{

e.printStackTrace();

}

try{

doc = db.parse(new File(”security.xml”));

}catch(Exception e)

{

e.printStackTrace();

}

//读取页面元素列表

NodeList elementList = doc.getElementsByTagName(”htmlElement”);

for(int i=0;i<elementList.getLength();i )

{

Element name = ((Element)elementList.item(i));

//页面元素de名称

elementName = name.getAttribute(”name”);

//该页面元素对应de有权限de角色de列表

NodeList rolNodeList = ((NodeList)name.getElementsByTagName(”roleName”));

for(int j=0;j<rolNodeList.getLength();j )

{

//有权限de角色de名称

//roleName = ((Element)rolNodeList.item(j)).getNodeValue();

roleName = ((Element)rolNodeList.item(j)).getAttribute(”name”);

theList.add(new ElementAndRole(elementName,roleName));

}

}

return theList;

}

//检查该角色是否有该页面元素de权限

private boolean isAuthentificated(String elementName)

{

String roleName = “”;

//在用户登陆时把该用户de角色保存到SESSION中,这里只是直接从SESSION中取用//户角色.

roleName=this.pageContext.getSession().getAttribute(”rolename”);

// roleList包含elementName属性为elementName,roleName属性为roleNamede//ElementAndRole对象,则该角色有该页面元素de权限

if(roleList.contains(new ElementAndRole(elementName,roleName)))

{

return true;

}

}

return false;

}

//表示角色和页面元素de对应de关系de内部类

class ElementAndRole{

String elementName;

String roleName;

public ElementAndRole(String elementName,String roleName)

{

this.elementName=elementName;

this.roleName=roleName;

}

public boolean equals(Object obj)

{

return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));

}

}

}

在标签库能被JSP页面使用前,要做以下三个步骤

1、 JSP页面中包括一个taglib元素,确定需要加载到内存de标签库.前面deJSP文件de第一行:<%@ taglib uri=”http://mytag” prefix=”custTag” %>做de就是这件事.

2、 在配置文件web.xml中使用taglib元素确定TLD文件de位置.在web.xml中增加:

<taglib>

<taglib-uri>http://mytag</taglib-uri>

<taglib-location>

/WEB-INF/mytag.tld

</taglib-location>

</taglib>

3TLD文件必须使用taglib元素标识每个定制标签极其属性.

下面是使用这个标签库对应deTLD文件

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<!DOCTYPE taglib

PUBLIC “-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.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>

JSP发送邮件实例

星期一, 06月 2nd, 2008

vishal_donth gave this response on 10/18/2000:
//these are the pakages to be imported from
// Java Mail
//The Java Mail PAckage either be dowloaded
//seperately
//or else is Available in the J2sdkee1.2
// (Java Enterprise Edition)
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

//This function can be used to send the mail
// with the parameters given to it
//U have to specify the smtp server through
//which u have to send the mail
//since i was trying with a homenetmail
//account i directly sent the mail its server
//For sending this mail u need a mail server
//which lets u to relay the messages
//Try this thing for sending to a
//www.homenetmail.com account because it lets
//u send
//mails to the accounts like example try
//sending it to a "abc@homenetmail.com"
//account.Create the mail account in homenet
//mail first. If u get any other server which
//supports relaying u can try this on that
//also.
//Use this function in ur Servlet to send
//mail by calling the function with the
//parameters
public void sendMail(String toAddr, String subject, String body, String fromAddr)throws RemoteException{
try{
Properties props = new Properties();
props.put("mail.smtp.host","mail.homenetmail.com");
//Here we specify the SMTP server through
//which the mail should be delivered
Session session = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(fromAddr));
//Specify the From Address
InternetAddress[] tos =InternetAddress.parse(toAddr);
//Specify the To Address
msg.setRecipients(Message.RecipientType.TO,tos);
msg.setSubject(subject);
//Specify the Subject
msg.setText(body);
//Specify the Body
Transport.send(msg);
System.out.println("Message is Sent");
}
catch(Exception e){
System.out.println(e);
}
}
// U have to run this function on a computer
//which is directly connected
// to internet but not through a
//proxy……or else use a proxy which
//supports SMTP

用文本文件实现的动态实时发布新闻的程序

星期一, 06月 2nd, 2008

动态实时发布新闻de程序,可以根据发布时间,自动地排列显示顺序.新闻文件为存储在指定目录de文本文件组成,当有新闻de时候,程序会自动地将其显示出来,并且排列在页面de最开始部分.
<html>
<head>
<title>News</title>
</head>
<body bfcolor="#ffffff">
<h1>News</h1>
<div aligh="center">
<table border="0" cellspacing="5" cellpadding="10" width="90%" bgcolor="#e0e0e0">
<?php
include(’locationfilename.php’);
function createur1($text){
//新闻de文本文件中这样插入您de链接
//${http://mysite.ch}
//或是${http://mysite.ch|My homepage in}
//开始处理文本文件部分
$s=$text;
$a=strstr($s,’${’);
if ($a){
$b=strstr($a,’}');
if ($b){
$la=strlen($a); $ls=strlen($s);
$s=substr($s,0,$ls-$la);
$a=substr($a,2);
$lb=strlen($b); $la=strlen($a);
$a=substr($a,0,$la-$lb); $b=substr($b,1);
$ta=strstr($a,"|");
if($ta){
$la=strlen($a); $lt=strlen($ta);
$linktext=substr($a,$la-$lt 1);
$a=substr($a,0,$la-$lt);
}
else{
$linktext=$a;
}
$s=$s."<a href="".$a."">".$linktext."</a>".$b;
}
}
return($s);
}
//在这里修改您de新闻文件存放目录
//切记,新闻文件必须是文本文件
$newspath="/home/htdocs/test/new/";
//设置数组
$newsfile=array();
//设置目录把柄
$hd=dir($newspath);
//获取全部文件,并将其存放在数组中
while($filename=$hd->read() ){
$s=strtolower($filename);
if (strstr($s,".txt")){
//检测最新修改日期
$lastchanged=filemtime($newspath.$filename);
$newsfile[$filename]=$lastchanged;
}
}
//文件排序
arsort($newsfile);
//输出文件
for(reset($newsfile); $key=key($newsfile); next($newsfile)){
$fa=file($newspath.$key);
$n=count($fa);
print "<tr><td>n";
print "<b>".date("d.m.Y - H:i:s",$newsfile[$key])."</b><br>n";
for($i=0; $i<$n; $i=$i 1){
$s=chop($fa[$i]);
$s=htmlspecialchars($s);
$s=createur1($s);
print $s."<br>n";
}
print "</td></tr>";
}
$hd->close();
?>
</body>
</html>

巧用FileSystem组件实现WEB应用中的本地特定打印

星期一, 06月 2nd, 2008

1、引言

随着Internetde飞速发展,许多企业都纷纷开发基于WEBde业务应用系统.一般情况下,基于WEBde业务应用都采用三层或三层以上de结构,前台即客户端是普通deWEB浏览器,中间业务逻辑应用层存放于WEB服务器上,由WEB服务器上de服务构件访问后台数据库.为了业务系统与Internetde互联,WEB服务器和数据库系统均托管在IDC(互联网数据中心),因而需要从托管在 IDCde服务器上提取业务数据在本地打印输出.在客户端浏览器只能打印简单deHTML页面de情况下,要求更为强大灵活de打印输出功能;通过采用相关de技术对浏览器de功能进行扩展,能够完成更复杂de数据打印de任务,如收条、回执等.笔者曾经为一网络教育公司开发教育管理软件时采用FileSystem组件实现在本地打印三联收款凭证和准考证等de功能.

2、FileSystem组件使用简介

FileSystem组件其实是一个ActiveX控件,其存在于WINDOWS平台中(不管是Win98、Win2000,还是NT环境都包含该组件.),CLSID:0D43FE01-11CF-8940-00A0C9054228.熟悉ASP编程人可能都使用过FileSystem组件,一般情况下该组件用在服务器端,用来对文本文件、文件夹及驱动器进行访问和控制.可以通过两种方法创建FileSystem组件de对象实例:

1、使用ASPde内置对象SERVERde方法Server.CreateObject来创建服务器端对象de实例.

2、使用Vbscript脚本函数CreateObject来创建客户端对象de实例(也可以在服务器端用该方法,但有时会出错,一般不使用;).

FileSystem组件对文本文件进行操作有如下方法:

CreateTextFile(Filename,[Overwrite if exists],[Unicode/ASCII]) //创建文本文件

OpenTextFile(Filename,[Input/output mode],[Create if not exists],[Format]) //打开文本文件

CopyFile(Filename1,Filename2,[Overwrite]) //拷贝文本文件

MoveFile (Filename1,Filename2) //移动文本文件

DeleteFile (Filename) //删除文本文件

GetFile (Filename) //获得文本文件

FileExists (Filename) //判断文本文件是否存在

FileSystem组件对文件夹和驱动器也有和文本文件相类似de方法,在此不一一赘述.

其实,FileSystem组件也可使用于客户端,采用创建FileSystem组件对象实例de第二种方法即可以使用该组件对客户端系统de文本文件、文件夹及驱动器进行访问和控制.因为微软平台带有FileSystem组件,所以对于微软平台de客户端则不需要从远程服务器下载,其在安装操作系统时会自己安装并注册;而对于其他平台de客户端则须安装插件并下载FileSystem组件.

3、本地端特定打印de实现机制

利用FileSystem组件实现本地端特定打印de过程如图所示:

<IMG SRC="http://www.computerworld.com.cn/htm/app/aprog/01_9_14_5.jpg" border=0>

1、客户端向WEB服务器发送数据请求;

2、WEB服务器根据业务处理逻辑与后台数据库进行交互,取得所需数据形成HTML页面,并附带有FileSystem组件对象deVBScript脚本,向客户端浏览器发回HTML页面;

3、在客户端运行脚本,脚本取得HTML页面构件de数据,建立与打印机de连接,向打印机输出打印数据.

前两步与一般deWEB应用没有什么区别,需要说明de是第三步:首先使用Vbscript脚本函数CreateObject来创建FileSystem组件对象de实例;然后调用该实例创建文本文件deCreateTextFile方法,把打印端口LPT1或LPT2作为文件名参数,并将可覆盖文件参数设为TRUE,建立与打印机de连接;调用获得de打印机文本文件流实例de写文本方法WriteLine向打印机输出打印de内容.

4、程序示例

客户端脚本:

<script Language=VBScript>

function print_onclick //打印函数

dim label

label=document.printinfo.label.value //获得HTML页面de数据

set objfs=CreateObject("Scripting.FileSystemObject") //创建FileSystem组件对象de实例

set objprinter=objfs.CreateTextFile ("LPT1:",true) //建立与打印机de连接

objprinter.Writeline("__________________________________") //输出打印de内容

objprinter.Writeline("| |")

objprinter.Writeline("| 您打印de数据是:"&label& " |”)

objprinter.Writeline("| |")

objprinter.Writeline("|_________________________________|")

objprinter.close //断开与打印机de连接

set objprinter=nothing

set objfs=nothing // 关闭FileSystem组件对象

end function

</script>

服务器端脚本:

<%………

set conn=server.CreateObject ("adodb.connection")

conn.Open "DSN=name;UID=XXXX;PWD=XXXX;"

set rs=server.CreateObject("adodb.recordset")

rs.Open(“select ……”),conn,1,1

……….%> //与数据库进行交互

HTML页面编码:

<HTML>

………

<FORM ID=printinfo NAME="printinfo" >

<INPUT type="button" value="打印>>" id=print name=print > //调用打印函数

<INPUT type=hidden id=text1 name=label value=<%=………%>> //保存服务器端传来de数据

………

</HTML>

5、说明及结论

1、使用此方法实现打印任务之前,必须调节浏览器de安全设置;在Internet选项上安全级别降低,对自己de站点充分信任,可以通过浏览器执行脚本访问本机资源.

2、本方法可以实现在局域网de打印机上打印远程服务器de数据,只须用局域网上打印机注册在本地de端口代替本地打印机端口作为创建文本文件deCreateTextFile方法de参数即可.

3、本方法可以实现根据用户选择打印de宽度、高度和数量及内容,并可重复打印.

4、不需要编写ActiveX控件即可以完成特定de打印功能,实现较为简单.

5、不足之处是需要调节浏览器de安全设置,且不支持图片和特殊字体de打印.