2008年8月20日
把一個指定的文件上傳到服務(wù)器,通常依靠JSP技術(shù)完成,需要使用到兩個JSP頁面。第一個JSP頁面是選擇要上傳的文件,第二個JSP頁面是從客戶端獲取該文件里面的信息,并把這些信息以客戶端相同的格式保存在服務(wù)器端,該頁面主要為功能處理頁面。
第一個頁面的實現(xiàn)必須含有FILE類型的表單,并且表單的enctype的屬性必須為"muldtipart/form-data"。
第二個頁面要使用內(nèi)置對象request調(diào)用方法getInputStream()獲得一個輸入流,通過這個輸入流讀取客戶上傳的全部信息,如上傳文件的 名字,文件的大小,文件的類型。根據(jù)request所獲得的信息創(chuàng)建一個數(shù)據(jù)輸出流對象,把信息寫到一個指定的文件內(nèi)
第一個文件內(nèi)容如下:
<body>
<form method="post" action="file_14.jsp" enctype="multipart/form-data">
<input type="file" name="file1" size="50" /><br>
<input type="submit" value="上傳" />
</form>
第二個文件內(nèi)容如下:
<%@ page contentType="text/html; charset='utf-8'" %>
<%@ page import="java.io.*" %>
<%@ page import ="java.util.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import = "javax.servlet.http.*" %>
<body>
<%
int MAX_SIZE = 102400 * 102400; //定義上傳文件的最大字節(jié)
String rootPath; //創(chuàng)建跟路徑的保存變量
DataInputStream in = null; //聲明文件讀入類
FileOutpubStream fileOut = null; //
String remoteAddr = request.getRemoteAddr(); //取得客戶端的網(wǎng)絡(luò)地址
String servName = request.getServerName(); //獲得服務(wù)器的名字
out.print("serverName=" + serverName + "<br>");
out.print("request.getServletPath() = " + request.getServletPath() + "<br>")
JavaBean是一個可重復(fù)使用、且跨平臺的軟件組件(SoftWare Component),它可以在軟件開發(fā)工具如:Borland JBuilder \ Oracle JDeveloper 或是 Sun ONE Studio 等等里,以可視化的開發(fā)方式來開發(fā)。
首先,你可以將JAVABEAN視為一個黑盒子(Black Box),雖然知道這個軟件組件所具備的功能,卻不知其內(nèi)部是如何運作的。筆者提供給讀者一個假象的情況:有一個黑盒子,只知道它上面有一個按鈕,你只要按下去經(jīng)過十分鐘,就會掉下一張一千元的鈔票,不過你看不見其內(nèi)部任何的構(gòu)造,而這就是JAVABEAN最重要的特性,它將許多的信息都封裝了起來,用戶無需知道黑盒子如何產(chǎn)生出鈔票,只需知道按下那個按鈕,然后等十分鐘,超片就會自動產(chǎn)生出來。
一般而言,JAVABEAN可分為:有用戶接口(user interface)的javabean和沒有用戶接口的javabean,通常JSP是搭配沒有UI的JAVABEAN,因此后面所提到的JAVABEAN都知識單純處理一些食物,如:數(shù)據(jù)運算,連接數(shù)據(jù)庫和數(shù)據(jù)處理,等等,至于有用戶接口的JAVABEAN部分,請讀者自己參考JAVABEAN的相關(guān)書籍。
通常一個標準的JAVABEAN有如下幾項特性:
(1)javabean是一個公開的(public)類;
(2)javabean類必須有一個無傳入?yún)?shù)(zero-argument)的構(gòu)造函數(shù)(constructor);
(3)取得或設(shè)置屬性時,必須使用getXXX方法或setXXX方法。
例子:
package tw.com.javaworld.CH8;
import java.io.*;
public class SimpleBean{
public SimpleBean(){
}
private String name;
private String number;
public void setNumber(String number){
this.number = number;
}
public String getName(){
return name;
}
}
與JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是試用XML語法寫成的,它可以采用以下兩種格式:
<prefix:tag attribute = value attribute-list.../>
或者
<prefix:tag attribute = value attribute-list.../>
...
</prefix.tag>
SERVLET容器在處理JSP時,每當(dāng)遇到這種動作元素,都根據(jù)它的標記進行特殊處理。
JSP規(guī)范定義了一系列的標準動作,它用JSP作為前綴。這些標準的動作不去慣容器是如何實現(xiàn)的,但是每個WEB容器都必須提供這些操作類型。標準動作為網(wǎng)頁設(shè)計者提供了基本的功能,其他的廠商可以自由提供其他的非標準動作以增強功能。
標準動作有:
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:param>
<jsp:include>
<jsp:forward>
<jsp:plugin>
<jsp:fallback>
<jsp:attribute>
<jsp:body>
<jsp:invoke>
<jsp:doBody>
<jsp:element>
<jsp:output>
<jsp:scriptelet>
<jsp:declaration>等
在標準動作中,有許多是XML語法的動作元素,比如<jsp:scriptelet> <jsp:declaration>但他們的使用并不廣泛,下面介紹JSP中主要的動作元素。
文件導(dǎo)入標記<jsp:include>
include用于允許在請求時間內(nèi)在縣城的JSP頁面里包含靜態(tài)或者動態(tài)資源。被包含的對象只有對JSPWRITER對象的訪問權(quán),并且它不能設(shè)置頭或者COOKIE,如果頁面輸出是緩沖的,那么緩沖區(qū)的刷新要有限于包含的刷新。此指令在運行的效率上比<%@ page include %>指令的效率低,但是可以動態(tài)增加內(nèi)容。用戶可以通過一下的格式來使用文件導(dǎo)入標記
<jsp:include page="{relativeURL | <%=expression%>}" flush="true" />
<jsp:include page="{relativeURL | <%=expression%>}" flush = "true" >
<jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"
</jsp:include>
例如:
<jsp:include page="admin/login.jsp" />
<jsp:include page="copyright.html" />
<jsp:include page="admin/login.jsp">
<jsp:parame name = "username" value="JackLong" />
</jsp:include>
頁面轉(zhuǎn)向標記<jsp:forward />
實例:
<jsp:forword page="showinfo.jsp" >
<jsp:param name = "username" value = "<%=request.getParameter("username")%>"/>
<jsp:param name = "telephone" value = "<%=request.getParameter("telephone")%>"/>
</jsp:forword>
下面的代碼用于顯示當(dāng)前時間,并根據(jù)當(dāng)前是幾點輸出相應(yīng)的提示信息,其中,使用java.util.Date thisday=new java.util.Date();語句來取得當(dāng)前時間,然后通過相應(yīng)的方法取得年,月,日,時和分的信息并輸出:
<% page contentType="text/html; charset=utf-8" import="java.util.*" %>
<body>
<%
//獲取當(dāng)前的時間
java.util.Date thisday = new java.util.Date();
%>
當(dāng)前時間:
<%=thisday.getYear()+1900%>年
<%=thisday.getMonth()+1%>月
<%=thisday.getDate()%>日
<%=thisday.getHours()%>時
<%=thisday.getMinutes()%>分
<%
String str = "歡迎訪問:"
int num = this.getHours();
switch(num){
case 8:
case 9:
case 10:
case 11:
{
out.print("歡迎你的訪問,上午好!");
break;
}
case 12:
{
out.print("中午好!");
break;
}
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
{
out.print("下午好!");
break;
}
</body>
countFile.java
public class countFile{
public static void writeFile(String filename,long count){
PrintWriter out = new PrintWriter(new FileWriter(filename));
out.println(count);
out.close();
}
public static void readFile(String filename){
File f = new File(filename);
if(!f.exists()){
writeFile(filename,0);
}
BufferedReader in = new BufferedReader(new FileReader(f));
long count = Long.parseLong(in.readline());
return count;
}
public static String tranform(long count){
String countNumber = ""+count;
String newstring = "";
for(int i=0;i<countNumber.length;i++){
newstring+="<img src='images/"+countNumber.charAT(i)+".gif' >";
}
return newstring;
}
}