上次看到處理HEAD請求,下面是關(guān)于Web應(yīng)用程序的配置問題。
Web應(yīng)用程序是Servlet、JSP、HTML文檔、圖片、模版以及其他可在支持Servlet的Web服務(wù)器上部署的所有Web資源的一個集合。
(這句話好長,總之就是你能在網(wǎng)上看到的東西,或者一些產(chǎn)生動態(tài)Web頁的程序)。
我們安裝了Tomcat就會知道,在webapps文件夾下面有很多的子文件夾,一個文件夾對應(yīng)一個應(yīng)用程序。他們是一堆的JSP程序以及配置文件。另外我們可以給他打包,成為一個存檔文件,擴展名為:war。
WEB-INF目錄
每個Web Apps,都有一個這樣的目錄,有一個web.xml文件。
現(xiàn)在對xml作一點學(xué)習(xí):
XML是eXtensible Markup Language
他與HTML類似,都是用標(biāo)簽標(biāo)記它的內(nèi)容,并用尖括號來結(jié)束;
XML和HTML的服務(wù)目標(biāo)是不同的:XML文檔中的標(biāo)簽沒有定義文字的顯示格式,而是解釋了文本的意思。它是一個可擴展的標(biāo)記語言,他可以定制一些新的標(biāo)簽來寫你自己需要的文檔。
有幾個要注意的地方:
1、XML區(qū)分大小寫(大小寫敏感)
2、又開始的標(biāo)簽必須有結(jié)束(標(biāo)簽必須是一對)要么就這么寫:<servlet/>,用來代替一對的符號
3、嵌套的元素不可以重疊!例如這樣寫就是非法的<outside><inside></outside></inside>
4、所有數(shù)值必須加上單引號或者雙引號
配置描述符:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>
hi
</servlet-name>
<servlet-class>
HelloWorld
</servlet-class>
</servlet>
</web-app>
web-app標(biāo)簽表示這些是用來配置一個web應(yīng)用程序的,servletname是一個你所寫的servlet的名字,class是他的類名,可以寫成所屬包名+類名的形式,有些IDE可以自動的生成。
servlet映射
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>
hi
</servlet-name>
<servlet-class>
HelloWorld
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
hi
</servlet-name>
<url-pattern>
/hello.html
</url-patter>
</servlet-mapping>
</web-app>
servlet-mapping表示他來標(biāo)示servlet的映射信息,映射過后我們就可以用自己定義的地址來訪問他;
其中有兩個子標(biāo)簽,一個是name,另一個是url-pattern。第一個不用說就是servlet里面定義的那個name;
url-pattern指的是上面那個servlet-name所指定的servlet可以在瀏覽器中用什么樣的url訪問。
設(shè)置有幾種:
明確映射,就是一個地址,跟普通的相對路徑?jīng)]有什么區(qū)別。
路徑前綴映射,/lite/*這樣子的url-pattern
就是以/開頭,/*結(jié)尾,處理所有擁有該前綴的請求。這種映射機制,允許一個servlet來控制一個虛擬目錄層次的sevlet請求。
擴展名映像:
*.jsp
可以表示這個servlet用來處理所有的JSP請求。
默認映射,/
如果沒有與之相匹配的servlet可以處理該請求,則將這個請求扔給這個servlet,等同于/*,要慎用!
posted @
2005-12-30 13:33 Fusion KISS 閱讀(596) |
評論 (1) |
編輯 收藏
今天動手實踐了一下寫Servlet的代碼,感覺不錯.現(xiàn)在寫些東西給大家分享一下:
我們是用Servlet的API處理HTTP請求的,現(xiàn)在我給大家看一段代碼,它的作用就是在瀏覽器里面打出一行字,經(jīng)典的不能再經(jīng)典(你想說老土我也不反對)就是,Hello,World
package Chap2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld extends HttpServlet
{
// eclipse非要讓我加這句話,要么會有一個警告,我看對運行沒有什么影響我就加了,不知道哪位高人知道怎么用這個東西
private static final long serialVersionUID = 1L;
// 這個方法可以處理GET的請求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 設(shè)置一個Content-Type首部
response.setContentType("text/html");
// 這個東西就像你拿到了向客戶端瀏覽器寫字的一支筆
PrintWriter out = response.getWriter();
// 現(xiàn)在可以往客戶端的瀏覽器寫HTML代碼了,想怎么寫就怎么寫,呵呵
out.println( "<HTML>" );
out.println( "<HEAD><TITLE>Hello World</TITLE></HEAD>" );
out.println( "<BODY>" );
out.println( "<BIG>Hello World</BIG>" );
out.println( "</BODY></HTML>" );
}
}
把這個東西發(fā)布到你的服務(wù)器下面,你就可以看到一行字:Hello,World.
至于怎么配置服務(wù)器,近期我會給大家一份資料,里面詳細描述了配置JDK+Tomcat+Eclipse+MyEclipse的方法,這些軟件都可以到我的網(wǎng)站上去下載,鏈接在我的簽名里面!
下面我們來點動態(tài)的東西,做完了以后,學(xué)過JSP的人們會發(fā)現(xiàn),這個...不就是JSP么?
對!JSP就是拿這個東西實現(xiàn)的,就如同Windows API和MFC的關(guān)系;相信如果你是個肯鉆研的主,早就不愿意學(xué)MFC那個把你規(guī)定的死死的東西了吧.
第二個例子:
package Chap2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Exp2 extends HttpServlet
{
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter( "name" );
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>Hello " + name + ".</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( "Hello, " + name + "." );
out.println( "</BODY>" );
out.println( "</HTML>" );
}
public String getServletInfo()
{
return "A servlet that knows the name of the person to whom it's saying hello";
}
}
這個Servlet可以接受一個name的參數(shù),當(dāng)然你可以新建一個頁面來讓用戶來提交這個參數(shù).
我給大家一個
<HTML>
<HEAD>
<TITLE>Introductions</TITLE>
</HEAD>
<BODY>
Exp2
<FORM METHOD=GET ACTION="servlet/Exp2"> If you don't mind me asking, what is your name?
<INPUT TYPE=TEXT NAME="name"></P>
<INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
純粹的HTML代碼,簡單的不能再簡單,根據(jù)你服務(wù)器配置的不同和Servlet存放的地方的不同,你要看你的FORM標(biāo)簽上面那個ACTION屬性該怎么填!
Exp2那個Servlet就是接受了一個name的變量,然后叫一下你的名字,問候你下你呵呵.
但是有時候用戶會發(fā)出一個HEAD請求(客戶端只想看到響應(yīng)的首部時發(fā)出的請求),這個東西可能會讓你很煩,你心里會說這些人就會給我搗亂,發(fā)什么HEAD請求啊!確實這個東西看上去微不足道,也沒有doHead()的方法可以使用.任何有子類HttpServlet和實現(xiàn)了doGet方法的servlet都支持HEAD請求.
現(xiàn)在我們看一下處理HEAD請求的工作過程:
HttpServlet的service()方法確定HEAD請求并把它特殊對待。它構(gòu)建一個修改過的HttpServletResponse對象,并把它和原來的請求一起發(fā)給doGet方法(你知道了,我們要在doGet那個東西里面做文章!)。很高興地告訴你,如果是一個HEAD請求,系統(tǒng)可以為我們自動屏蔽后面的輸出,但是如果讓我們來做一個判斷,你可以提高你的程序性能,也能加深我們對這個Servlet的了解。
我們要在Exp2的doGet()方法中加一句話:
if( request.getMethod().equals( "HEAD" ) ) return;
通過request這個對象我們可以看到客戶端的請求類型,如果這個字符串時HEAD,哈哈,干掉他!
但是,即使我們只是處理一個HEAD請求,我們也要設(shè)置Content-Type首部。
posted @
2005-12-30 13:32 Fusion KISS 閱讀(423) |
評論 (0) |
編輯 收藏
HTTP servlet基礎(chǔ)
內(nèi)容:編寫和運行一個簡單的HTTP servlet
包括如何在一個標(biāo)準(zhǔn)的Web應(yīng)用程序上預(yù)見性servlet及其基于XML的配置描述
HTTP基礎(chǔ)
重點:GET POST方法
HTTP是一個簡單的、無狀態(tài)的協(xié)議。
在訪問一個Web服務(wù)的時候(方法就是填入一個URL加以訪問),瀏覽器會發(fā)出一個請求,類似于ftp里面的各種命令,這種請求要指定一個HTTP請求的名稱、URL、HTTP協(xié)議的版本;
例子:GET /intro.html HTTP/1.0
這個命令使用了GET方法向一個名為intro.html的文檔提出請求,用的是1.0版本的HTTP協(xié)議。
之后,瀏覽器發(fā)送一個選擇性的首部信息告知服務(wù)器關(guān)于請求的附加信息,注意,這些信息不直接和你所要請求的那個URL有關(guān),而是可以對服務(wù)器的響應(yīng)有一點幫助。
例子:
User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)
Accept: image/gif, image/jpeg, text/*, */*
User-Agent說明了客戶端軟件的信息
Accept說明了客戶端愿意接受的media(MIME)類型的數(shù)據(jù);
發(fā)送了附加信息,客戶端發(fā)送一個空行給服務(wù)器,表示已經(jīng)完成。
下面該服務(wù)器響應(yīng)了,響應(yīng)的第一行是用來指服務(wù)器所用的HTTP/1.0 200 OK
200-是正常的提示
還有一個我們比較常見的狀態(tài)碼:
404-找不到
發(fā)送了狀態(tài)條后,服務(wù)器發(fā)送響應(yīng)首部,用來告訴客戶端,服務(wù)器使用的軟件和響應(yīng)內(nèi)容類型的信息。
GET和POST
前面提到過,發(fā)送請求的時候有一個叫做HTTP請求的東西(也叫做方法),最最常用的就是GET和POST了.
看名字就知道:
GET:取得信息的方法;說白了就是讀取
POST:用來發(fā)送信息;就像在版上灌水一個道理
GET方法(用來讀數(shù)據(jù),地球人都知道了現(xiàn)在),請求中可以加入一些自身信息來更好地描述需求.比如在URL中顯式地發(fā)送一個信息給一個頁面;
POST方法,如果要上傳一個東西,你可能要傳輸一個上M的文件,所以它用不同的技術(shù)來向服務(wù)器發(fā)送信息.一個POST請求把它的不限長度的數(shù)據(jù)作為HTTP請求體的一步分.通常通過Socket發(fā)送出去.傳送對用戶是不可見的(想象一下,如果你的信用卡號傳給銀行的時候?qū)τ脩艨梢?你的錢恐怕早就沒有了.呵呵
posted @
2005-12-30 13:26 Fusion KISS 閱讀(386) |
評論 (0) |
編輯 收藏
以前也知道要改配置文件~~今天看了一個帖子~~覺得這個答案比較好。
轉(zhuǎn)自:cjsdn
怎么在Tomcat里發(fā)布自己的程序?
http://www.china***net 作者:aile 發(fā)表于:2003-06-11 22:24:30
我剛開始學(xué)JSP,用WINXP+Tomcat4.1.24,在webapps目錄下建立一個新目錄myjsp,把自己寫的jsp程序test.jsp放在里面,可是用http://localhost:8080/myjsp/test.jsp
無法運行(The requested resource (/begjsp-ch01/index.jsp) is not available)把它放在ROOT里用http://localhost:8080/test.jsp運行正常,
我應(yīng)該怎么做?
【發(fā)表回復(fù)】【查看CU論壇原帖】【關(guān)閉】
--------------------------------------------------------------------------------
kpflysky 回復(fù)于:2003-06-12 08:38:32
同意
你主要是server.xml里面的映射沒有弄清楚
默認的根目錄是ROOT
所以你放到ROOT里就可以了
--------------------------------------------------------------------------------
badseed 回復(fù)于:2003-06-11 23:51:25
你有沒有寫web.xml
研究一下 webapps/examples/WEB-INF目錄下的文件和目錄結(jié)構(gòu)
,再看看 web.xml的寫法
--------------------------------------------------------------------------------
zhangv 回復(fù)于:2003-06-12 21:06:14
找到%tomcathome%\conf\server.xml文件,在<host>標(biāo)簽中加入:
<Context path="/虛擬目錄名" docBase="本地路徑" debug="0"
reloadable="true" crossContext="true">
</Context>
這樣將你的jsp文件放到"本地路徑"下,然后在瀏覽器中輸入http://127.0.0.1:8080/虛擬目錄名/xxx.jsp即可執(zhí)行.
注意!!!還沒有完!!這時候你的這個虛擬目錄還沒有執(zhí)行servlet的能力(當(dāng)然如果你不用servlet那就令當(dāng)別論了).
下面是一個范例:
<Context path="/bbs" docBase="work" debug="0"
reloadable="true" crossContext="true">
</Context>
你要建一個名叫work的目錄在webapps\下
要使這個work目錄可以執(zhí)行servlet,要有一個配置文件--web.xml,內(nèi)容為:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>MyWEB</display-name>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
</web-app>
這個使最小配置,僅僅是指明servlet的位置.要把這個文件放到webapps\work\WEB-INF\下,你自己的servlet放到webapps\work\WEB-INF\classes\下.
手酸~^_^
posted @
2005-12-18 21:58 Fusion KISS 閱讀(429) |
評論 (0) |
編輯 收藏
我來自國防科技大學(xué),現(xiàn)在是一名大三的學(xué)生。希望大家一起和我來交流JSP和有關(guān)UML結(jié)合Java的技術(shù)。
posted @
2005-12-18 11:29 Fusion KISS 閱讀(209) |
評論 (0) |
編輯 收藏