?? 第4章(1).txt
字號:
<HTML>
<BODY>
<%! //聲明一個需同步處理的文件:
File f=null;
String use="yes";
%>
<%--獲取客戶提交的小說的名字--%>
<% String name=(String)session.getAttribute("name");
byte c[]=name.getBytes("ISO-8859-1");
name=new String(c);
//獲取客戶續寫的內容:
String content=(String)request.getParameter("messages");
if(content==null)
{content=" ";
}
%>
<%File storyFileDir=new File("F:/2000","story");
storyFileDir.mkdir();
f=new File(storyFileDir,name);
//把對文件的操作放入一個同步塊中,并通知
//其它用戶該文件正在被操作中:
if(use.startsWith("yes"))
{ synchronized(f)
{ use="beisusing";
try{
RandomAccessFile file=new RandomAccessFile(f,"rw");
file.seek(file.length()); //定位到文件的末尾。
file.writeUTF(content);
file.close();
use="yes";
out.print("<BR>"+"內容已經寫入");
}
catch(IOException e){}
}
}
//如果該小說正在被續寫,就通知客戶等待:
else
{out.print("該小說正在被續寫,請等待");
}
%>
</BODY>
</HTML>
例子13(效果如圖4.18、4.19、4.20所示)
Example4_13.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>選擇要上傳的文件:<BR>
<FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data">
<INPUT type=FILE name="boy" size="38">
<BR>
<INPUT type="submit" name ="g" value="提交">
</BODY>
</HTML>
accept.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<HTML>
<BODY>
<%try{ InputStream in=request.getInputStream();
File f=new File("F:/2000","B.txt");
FileOutputStream o=new FileOutputStream(f);
byte b[]=new byte[1000];
int n;
while((n=in.read(b))!=-1)
{o.write(b,0,n);
}
o.close();
in.close();
}
catch(IOException ee){}
out.print("文件已上傳");
%>
</BODY>
</HTML>
例子14(效果如圖4.21、4.22、4.23所示)
Example4_14.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<% String str=response.encodeURL("acceptFile.jsp");
%>
<P>選擇要上傳的文件:<BR>
<FORM action="<%=str %>" method="post" ENCTYPE="multipart/form-data">
<INPUT type=FILE name="boy" size="45">
<BR> <INPUT type="submit" name ="g" value="提交">
</FORM>
</BODY>
</HTML>
acceptFile.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<HTML>
<BODY>
<%try{ //用客戶的session的id建立一個臨時文件:
String tempFileName=(String)session.getId();
//建立臨時文件f1:
File f1=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/examples/",tempFileName);
FileOutputStream o=new FileOutputStream(f1);
//將客戶上傳的全部信息存入f1:
InputStream in=request.getInputStream();
byte b[]=new byte[10000];
int n;
while( (n=in.read(b))!=-1)
{o.write(b,0,n);
}
o.close();in.close();
//讀取臨時文件f1,從中獲取上傳文件的名字,和上傳的文件的內容:
RandomAccessFile random=new RandomAccessFile(f1,"r");
//讀出f1的第2行,析取出上傳文件的名字:
int second=1;
String secondLine=null;
while(second<=2)
{secondLine=random.readLine();
second++;
}
//獲取第2行中目錄符號'\'最后出現的位置
int position=secondLine.lastIndexOf('\\');
//客戶上傳的文件的名字是:
String fileName=secondLine.substring(position+1,secondLine.length()-1);
random.seek(0); //再定位到文件f1的開頭。
//獲取第4行回車符號的位置:
long forthEndPosition=0;
int forth=1;
while((n=random.readByte())!=-1&&(forth<=4))
{ if(n=='\n')
{ forthEndPosition=random.getFilePointer();
forth++;
}
}
//根據客戶上傳文件的名字,將該文件存入磁盤:
File f2=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/examples/",fileName);
session.setAttribute("Name",fileName);//供showImage.jsp頁面使用。
RandomAccessFile random2=new RandomAccessFile(f2,"rw");
//確定出文件f1中包含客戶上傳的文件的內容的最后位置,即倒數第6行。
random.seek(random.length());
long endPosition=random.getFilePointer();
long mark=endPosition;
int j=1;
while((mark>=0)&&(j<=6))
{ mark--;
random.seek(mark);
n=random.readByte();
if(n=='\n')
{ endPosition=random.getFilePointer();
j++;
}
}
//將random流指向文件f1的第4行結束的位置:
random.seek(forthEndPosition);
long startPoint=random.getFilePointer();
//從f1讀出客戶上傳的文件存入f2(讀取從第4行結束位置和倒數第6行之間的內容)。
while(startPoint<endPosition-1)
{ n=random.readByte();
random2.write(n);
startPoint=random.getFilePointer();
}
random2.close();random.close();
f1.delete(); //刪除臨時文件
}
catch(IOException ee){}
out.print("文件已上傳");
%>
<P> 查看上傳的圖象效果
<%String str=response.encodeURL("showImage.jsp");
%>
<FORM action="<%=str%>">
<Input type=submit value="查看">
</FOrm >
</BODY>
</HTML>
showImage.jsp:
<HTML>
<BODY>
<% String name=(String)session.getAttribute("Name");
if(name==null)
{name="";
}
out.print("<image src=http://192.168.1.100:8080/examples/"+name);
%>
</BODY>
</HTML>
例子15(效果如圖4.24、4.25所示)
Example4_15.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<HTML>
<BODY>
<P>點擊超鏈接下載Zip文檔book.Zip
<BR> <A href="loadFile.jsp">下載book.zip
</Body>
</HTML>
loadFile.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<HTML>
<BODY>
<% //獲得響應客戶的輸出流:
OutputStream o=response.getOutputStream();
//輸出文件用的字節數組,每次發送500個字節到輸出流:
byte b[]=new byte[500];
//下載的文件:
File fileLoad=new File("f:/2000","book.zip");
//客戶使用保存文件的對話框:
response.setHeader("Content-disposition","attachment;filename="+"book.zip");
//通知客戶文件的MIME類型:
response.setContentType("application/x-tar");
//通知客戶文件的長度:
long fileLength=fileLoad.length();
String length=String.valueOf(fileLength);
response.setHeader("Content_Length",length);
//讀取文件book.zip,并發送給客戶下載:
FileInputStream in=new FileInputStream(fileLoad);
int n=0;
while((n=in.read(b))!=-1)
{ o.write(b,0,n);
}
%>
</BODY>
</HTML>
例子16(效果如圖4.26所示)
readFileByLine.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%! //對字符串進行回壓流處理的方法:
public String getString(String content)
{ try{ StringReader in=new StringReader(content) ;//指向字符串的字符流。
PushbackReader push=new PushbackReader(in); //回壓流
StringBuffer stringbuffer=new StringBuffer(); //緩沖字符串對象。
int c;
char b[]=new char[1];
while ( (c=push.read(b,0,1))!=-1)//讀取1個字符放入字符數組b。
{ String s=new String(b);
if(s.equals("<")) //回壓的條件
{ push.unread('&');
push.read(b,0,1); //push讀出被回壓的字符字節,放入數組b.
stringbuffer.append(new String(b));
push.unread('L');
push.read(b,0,1); //push讀出被回壓的字符字節,放入數組b.
stringbuffer.append(new String(b));
push.unread('T');
push.read(b,0,1); //push讀出被回壓的字符字節,放入數組b.
stringbuffer.append(new String(b));
}
else if(s.equals(">")) //回壓的條件
{ push.unread('&');
push.read(b,0,1); //push讀出被回壓的字符字節,放入數組b.
stringbuffer.append(new String(b));
push.unread('G');
push.read(b,0,1); //push讀出被回壓的字符字節,放入數組b.
stringbuffer.append(new String(b));
push.unread('T');
push.read(b,0,1); //push讀出被回壓的字符字節,放入數組b.
stringbuffer.append(new String(b));
}
else if(s.equals("\n"))
{ stringbuffer.append("<BR>");
}
else
{ stringbuffer.append(s);
}
}
push.close();
in.close();
return new String(stringbuffer); //返回處理后的字符串。
}
catch(IOException e)
{return content=new String("不能讀取內容");
}
}
%>
<% String s=request.getParameter("g"); //獲取客戶提交的信息(是否重新讀取文件)
if(s==null)
{s=""; }
byte b[]=s.getBytes("ISO-8859-1");
s=new String(b);
File f=null;
FileReader in=null;
BufferedReader buffer=null;
if(session.isNew()) //當第一次請求該頁面時,建立和文件的輸入流連接。
{ f=new File("f:/javabook","JSP教程.txt");
in=new FileReader(f);
buffer=new BufferedReader(in);
session.setAttribute("file",f); session.setAttribute("in",in);
session.setAttribute("buffer",buffer);
}
if(s.equals("重新讀取文件")) //當請求重新讀取文件時,建立和文件的輸入流連接。
{ f=new File("f:/javabook","JSP教程.txt");
in=new FileReader(f);
buffer=new BufferedReader(in);
session.setAttribute("file",f); session.setAttribute("in",in);
session.setAttribute("buffer",buffer);
}
//將上述對象保存到用戶的session 對象中:
try{ String str=null; int i=1;
f=(File)session.getAttribute("file");
in=(FileReader)session.getAttribute("in");
buffer=(BufferedReader)session.getAttribute("buffer");
while( ((str=buffer.readLine())!=null)&&(i<=5))
{ //為了能顯示原始的HTML文件或JSP文件需使用回壓流技術。
str=getString(str);
out.print("<BR>"+str);
i++;
}
}
catch(IOException e)
{ out.print("文件不存在,或讀取出現問題");
}
%>
<%String code=response.encodeURL("readFileByLine.jsp");
%>
<HTML>
<BODY>
<P><BR>點擊按鈕讀取下5行:
<FORM action="<%=code%>" method="post" name=form>
<Input type=submit value="讀取文件的下5行">
</FORM>
<P><BR>點擊按鈕讀重新讀取文件:
<FORM action="" method="post" name=form>
<Input type=submit name="g" value="重新讀取文件">
</FORM>
</BODY>
</HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -