Tomcat下創(chuàng)建和發(fā)布Web應(yīng)用
前面我們把Tomcat+JDK1.5+MySQL+Eclipse架構(gòu)搭起來(lái)了,接下去的工作是舉一個(gè)小例子讓初學(xué)者明白如何創(chuàng)建和發(fā)布Web應(yīng)用,有了一個(gè)總的框架,這樣大家在做JSP和Servlet的時(shí)候就不會(huì)有一種破損殘缺、缺乏系統(tǒng)的感覺(jué),我的學(xué)習(xí)方式歷來(lái)是由粗到細(xì),先看樹(shù)木再俯瞰森林會(huì)把我弄瘋的......
1、首先創(chuàng)建Web應(yīng)用的目錄結(jié)構(gòu),我這里在Tomcat的/webapps下面創(chuàng)建一個(gè)Web應(yīng)用的目錄helloapp,這是Web應(yīng)用的根目錄,所有JSP和HTML文件都存放在此目錄下;它下一級(jí)有個(gè)WEB-INF文件夾,它存放web.xml文件和classes、lib文件夾,詳細(xì)后面再說(shuō),先建了。
2、介紹web.xml文件。這是一個(gè)發(fā)布描述文件,用來(lái)配置發(fā)布信息,包括:Servlet定義;Servlet初始化參數(shù);Servlet以及JSP的映射;安全域配置參數(shù);welcome文件清單;資源引用;環(huán)境變量的定義。閑話少說(shuō),創(chuàng)建web.xml文件,內(nèi)容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
</web-app>
第一行指定XML的版本和字符編碼,第二行指定文檔類型,<web-app>中放著關(guān)于Web應(yīng)用的配置元素。
3、在server.xml中加入<Context>元素。server.xml在/conf下,打開(kāi)后在<host>后面加入如下<Context>元素
<Context path="/helloapp" docBase="helloapp" debug="0"
reloadable="true"/>
其中,path指定訪問(wèn)該Web應(yīng)用的URL入口;docBase指定Web應(yīng)用的文件路徑;reloadable如果為true,一旦class文件被更新,服務(wù)器會(huì)自動(dòng)重新加載Web應(yīng)用,當(dāng)然這樣會(huì)加重服務(wù)器運(yùn)行負(fù)荷。
4、部署HTML文件。在helloapp下創(chuàng)建index.html文件,內(nèi)容如下:
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<p><font size="7">Welcome to Alec's Home</p>
<p><a href="login.jsp?language=English">English version</a>
</body>
</html>
在瀏覽器地址欄鍵入http://localhost:8080/helloapp/index.html
5、部署JSP。創(chuàng)建兩個(gè)JSP文件,一個(gè)login.jsp,一個(gè)hello.jsp。前者顯示登陸頁(yè)面,要求輸入用戶名和口令,這個(gè)頁(yè)面鏈接到名為DispatcherServlet的Servlet。后者被這個(gè)Servlet調(diào)用,顯示hello頁(yè)面。如前面所說(shuō),JSP文件都放在helloapp下。
<html>
<head>
<title>Alex's Addressing</title>
</head>
<body>
<br>
<form name="loginForm" method="post" action="dispatcher">
<table>
<tr>
<td><div align="right">用戶名:</div></td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密碼:</div></td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="Submit" name="Submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
上述是login.jsp文件內(nèi)容。
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<b>歡迎:<%=request.getAttribute("USER")%></b>
</body>
</html>
這是hello.jsp文件內(nèi)容。
6、部署Servlet。創(chuàng)建名為DispatcherServlet.java的文件編譯成Servlet,它調(diào)用HttpServletRequest對(duì)象的getParameter方法讀取提交的loginForm表單數(shù)據(jù),獲取用戶名和口令,然后將用戶名和口令保存在HttpServletRequest對(duì)象的屬性中,在把請(qǐng)求轉(zhuǎn)發(fā)給hello.jsp。
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class DispatcherServlet extends HttpServlet
{
public String target="/hello.jsp";
public void init(ServletConfig config)
throws ServletException{
super.init(config);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
String username=request.getParameter("username");
String password=request.getParameter("password");
request.setAttribute("USER",username);
request.setAttribute("PASSWORD",password);
//將請(qǐng)求定向到目標(biāo)文件
ServletContext context=getServletContext();
System.out.println("重定向到"+target);
RequestDispatcher dispatcher=context.getRequestDispatcher(target);
dispatcher.forward(request,response);
}
public void destroy(){
}
}
上述是DispatcherServlet.java文件,用來(lái)編譯成servlet。編譯成class文件后存放位置為/helloapp/WEB-INF/classes/mypack/DispatcherServlet.class;然后在/helloapp下的web.xml中作如下修改:
<?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/j2ee/dtds/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
</web-app>
說(shuō)明一下,<servlet-name>定義Servlet的名字;<servlet-class>指定實(shí)現(xiàn)這個(gè)Servlet的類;<init-param>定義Servlet的初始化參數(shù)(包括參數(shù)名和參數(shù)值),一個(gè)<servlet>元素中可以有多個(gè)<init-param>元素;<load-on-startup>指當(dāng)Web應(yīng)用啟動(dòng)時(shí),裝載Servlet的次序。當(dāng)這個(gè)值為正數(shù)或零時(shí),Servlet容器先加載數(shù)值小的servlet,再依次加載其他數(shù)值大的servlet,如果這個(gè)值為負(fù)數(shù)或者沒(méi)有設(shè)定,那么Servlet容器將在Web客戶首次訪問(wèn)這個(gè)Servlet時(shí)加載它。我這里沒(méi)用到后兩個(gè)元素。
7、部署JSP Tag Library
Tag Library向用戶提供了自定義JSP標(biāo)簽的功能。我們定義一個(gè)名為mytaglib的標(biāo)簽庫(kù),包含一個(gè)簡(jiǎn)單的hello標(biāo)簽,它能將JSP頁(yè)面中所有的<mm:hello/>解析為字符串“Hello”。
(1)
package mypack;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloTag extends TagSupport
{
public void HelloTag(){}
public int doEndTag() throws JspException{
try{
pageContext.getOut().print("Hello");
}
catch(Exception e){
throw new JspTagException(e.getMessage());
}
return SKIP_BODY;
}
public void release(){
super.release();
}
}
這是HelloTag.java文件,編譯成用于處理hello標(biāo)簽的類。
(2)創(chuàng)建Tag Library的描述文件mytaglib.tld文件,這個(gè)文件定義mytaglib標(biāo)簽庫(kù)和hello標(biāo)簽。它存放為/WEB-INF/mytaglib.tld。源碼如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>mytaglib</shortname>
<uri>mytaglib</uri>
<tag>
<name>hello</name>
<tagclass>mypack.HelloTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Just Says Hello</info>
</tag>
</taglib>
(3)在/helloapp/WEB-INF下的web.xml添加<taglib>元素,如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/mytaglib</taglib-uri>
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
</web-app>
<taglib>中包含<taglib-uri>和<taglib-location>屬性。前者指定Tag Library標(biāo)示符;后者指定Tag Library的描述文件(TLD)的位置。
(4)在hello.jsp文件中加入hello標(biāo)簽。prefix用來(lái)指定引用mytaglib標(biāo)簽庫(kù)時(shí)的前綴,修改后如下:
<%@ taglib uri="/mytaglib" prefix="mm"%>
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<b><mm:hello/><%=request.getAttribute("USER")%></b>
</body>
</html>
經(jīng)測(cè)試OK!
8、創(chuàng)建并發(fā)布WAR文件。一般來(lái)說(shuō),在Web應(yīng)用的開(kāi)發(fā)階段,為了方便調(diào)試,采用開(kāi)放式的目錄結(jié)構(gòu)來(lái)發(fā)布Web應(yīng)用,這樣方便更新或替換文件。產(chǎn)品發(fā)布時(shí),應(yīng)將整個(gè)Web應(yīng)用打包為WAR文件,再進(jìn)行發(fā)布。
(1)MS-DOS下進(jìn)入/helloapp目錄下鍵入如下命令:jar cvf helloapp.war *.*;
(2)把helloapp.war拷貝到/webapps目錄下;
(3)刪除原來(lái)的helloapp目錄;
(4)啟動(dòng)Tomcat服務(wù)器。
Tomcat服務(wù)器啟動(dòng)時(shí),會(huì)把webapps下所有WAR文件自動(dòng)展開(kāi)為開(kāi)放式的目錄結(jié)構(gòu),變?yōu)?webapps/helloapp目錄。
文章來(lái)源:http://syneer1981.spaces.live.com/blog/cns!6F8B2C7500427759!120.entry?_c=BlogPart
posted on 2007-04-16 00:13 大頭劍客 閱讀(1048) 評(píng)論(0) 編輯 收藏 所屬分類: 學(xué)習(xí)筆記