在Java EE應(yīng)用編程中Servlet是基礎(chǔ)憎夷,JSP是建立在Servlet基礎(chǔ)之上的拾给,其他Web框架如Struts、WebWork和Spring MVC都是基于Servlet的级及。本文主要講述MyEclipse和Tomcat配置Servlet的過程和簡單實現(xiàn)表單提交功能额衙。
希望對大家有所幫助,參考書籍《Java EE企業(yè)級應(yīng)用開發(fā)實例教程》窍侧。
Java+MyEclipse+Tomcat (一)配置過程及jsp網(wǎng)站開發(fā)入門
一. Servlet編程
1.Web基礎(chǔ)知識
在講述Servlet之前伟件,先了解下Web基礎(chǔ)知識。Web(World Wide Web斧账,萬維網(wǎng))本質(zhì)就是Internet所有文檔的集合咧织,Web文檔主要類型有HTML網(wǎng)頁、CSS拯爽、JavaScript、各種動態(tài)網(wǎng)頁逼肯、圖片、聲音和視頻等大刊。
Web文檔保存在Web站點(Site)上三椿,Web站點駐留在Web服務(wù)器上。Web服務(wù)器是一種軟件系統(tǒng)伴郁,提供Web文檔的管理和請求服務(wù)蛋叼,常見的Web服務(wù)器軟件有Apache、IIS狐胎、WebLogic和Tomcat等歌馍。每個服務(wù)器都有一個唯一的IP地址,Web服務(wù)器對外都有一個服務(wù)端口镜粤,默認時80或8080端口玻褪。
Web文檔都有一個唯一的地址公荧,通過URL格式來進行定位,其格式為:
協(xié)議://IP地址:端口/站點名/目錄/文件名
其中協(xié)議主要有HTTP窟社、HTTPS和FTP绪钥。根據(jù)不同的協(xié)議,默認端口可以省略匣吊,HTTP/HTTPS為80端口,F(xiàn)TP為21端口社痛。例:
http://210.30.108.30:8080/test/admin/login.jsp
Web服務(wù)器接收到請求后命雀,根據(jù)URL定位到相應(yīng)文檔,根據(jù)文檔類型進行對應(yīng)的處理撵儿,將文檔通過網(wǎng)絡(luò)發(fā)送到客戶端狐血,一般是瀏覽器,用戶即可查看或下載請求的文檔房匆。Web通過請求/響應(yīng)(Request/Response)模式進行工作报亩,即由瀏覽器使用URL對Web文檔進行請求,Web服務(wù)器接收并處理請求岳链,處理結(jié)束后將響應(yīng)內(nèi)容發(fā)送到瀏覽器劲件。
Web請求方式主要包括GET、POST苗分、PUT牵辣、DELETE和HEAD。其中GET請求直接返回請求的文檔择浊,同時傳遞參數(shù)在URL中逾条;POST請求將傳遞到Web服務(wù)器的數(shù)據(jù)保存到數(shù)據(jù)流中,只有通過表單提交形式才能實現(xiàn)担孔。如下:
Get請求:
http://localhost:8080/web01/main.do?id=1&password=123456
POST請求:
這些知識大家應(yīng)該都非常熟悉了,我就不再介紹了泳桦,引出表單就開始敘述Servlet娩缰。
2.什么是Servlet
在Sun公司制定Java EE規(guī)范初期,為實現(xiàn)動態(tài)Web而引入了Servlet浮毯,用于替代笨重的CGI(通用網(wǎng)關(guān)接口)泰鸡,實現(xiàn)了Java語言編程的動態(tài)Web技術(shù),奠定了Java EE的基礎(chǔ)饰迹。后來為進一步簡化動態(tài)Web網(wǎng)頁的生成余舶,并且在微軟公司推出了ASP(Active X服務(wù)系統(tǒng)頁面)技術(shù)的競爭下,Sun推出了JSP規(guī)范赠制,進一步簡化了Web網(wǎng)頁的編程挟憔。但JSP在進行HTTP請求處理方面不如Servlet方便和規(guī)范,Servlet在當(dāng)今的MVC模式Web開發(fā)中牢牢占據(jù)一地政恍。并且現(xiàn)在流行的Web框架基本基于Servlet技術(shù)达传,如Struts、WebWork和Spring MVC等。只有掌握了Servlet才能真正掌握Java Web編程的核心和精髓逊朽。
那么曲伊,究竟Servlet是什么東東呢追他?
Servlet是運行在Web容器的類岛蚤,能處理Web客戶的HTTP請求,并產(chǎn)生HTTP響應(yīng)单雾。
Servlet是Java EE規(guī)范定義的Web組件她紫,運行在Web容器中贿讹。由Web容器負責(zé)管理Servlet的聲明周期,包括創(chuàng)建和銷毀Servlet對象民褂∩蘅埃客戶不能直接創(chuàng)建Servlet對象和調(diào)用Servlet的方法,只能通過向Web服務(wù)器發(fā)出HTTP請求雹食,間接調(diào)用Servlet的方法吃挑。這是Servlet與普通Java類的重要區(qū)別街立。
Sun在如下兩個包中提供了Servlet的全部接口和類:
1.javax.servlet包含支持所有協(xié)議的通用Web組件接口和類
2.javax.servlet.http包含支持HTTP協(xié)議的接口和類
Servlet可以完成Web組件具有的所有功能赎离,如下:
1.接收HTTP請求
2.取得請求信息,包括請求頭和請求參數(shù)數(shù)據(jù)
3.調(diào)用其他Java類方法完成具體的業(yè)務(wù)功能
4.生成HTTP響應(yīng)虽画,包括HTML和非HTML響應(yīng)
5.實現(xiàn)到其他Web組件的跳轉(zhuǎn)荣病,包括重定向和轉(zhuǎn)發(fā)
編寫Servlet需要引入的兩個包和Java I/O包:
import java.io.;
import javax.servlet.;
import javax.servlet.http.*; 編寫接收HTTP請求并進行HTTP響應(yīng)的Servlet要繼承javax.servlet.http.HttpServlet。Servlet類的定義如下:
public class LoginAction extends HttpServlet {}
每個Servlet一般都需要重寫doGet方法和doPost方法脖岛。當(dāng)用戶使用GET方式請求Servlet時,Web容器調(diào)用doGet方法處理請求陨溅;當(dāng)用戶使用POST方法請求Servlet時绍在,Web容器嗲用doPost方法。
Servlet是生命周期時序圖如上圖所示悯嗓,包括加載類和實例化階段卸察、初始化階段坑质、處理請求階段和銷毀階段。
二. 配置Servlet
Servlet作為Web組件可以處理HTTP請求/響應(yīng)涡扼,因而對外要求一個唯一的URL地址吃沪。但由于Servlet是一個Java類文件,不像JSP那樣直接存放在Web目錄下就能獲得URL請求訪問地址红淡。Servlet必須在Web的配置文件/WEB-INF/web.xml中進行配置和映射才能響應(yīng)HTTP請求降铸。
1.Servlet聲明
它的任務(wù)是通知Web容器Servlet的存在,聲明語法如下:
HomePageAction
servlet.HomePageAction
其中聲明Servlet的名字桶蝎,一般與Servlet的類名相同即可谅畅,要求在一個web.xml文件內(nèi)名字唯一毡泻。指定Servlet的全名,即包名.類型牙捉。Web容器會根據(jù)此定義載入類文件到內(nèi)容中邪铲,進而調(diào)用默認構(gòu)造方法創(chuàng)建Servlet對象。
Servlet初始參數(shù)如數(shù)據(jù)庫Driver昧碉、URL揽惹、賬號和密碼等信息,在Servlet中可以讀取這些信息狭握,如下定義了一個初始參數(shù)疯溺,即數(shù)據(jù)庫的JDBC驅(qū)動。
HomePageAction
servlet.HomePageAction
driveName
sun.jdbc.odbc.JdbcOdbcDriver
在Servlet中可以通過ServletConfig取得定義的初始化參數(shù)恃疯,取得以上定義的參數(shù)的代碼如下:
private Connection cn=null; //定義數(shù)據(jù)庫連接對象
private String driverName=null; //數(shù)據(jù)庫驅(qū)動器
//取得Servlet定義的初始參數(shù)
driverName=config.getInitParameter("driverName");
//根據(jù)Servlet初始參數(shù)連接數(shù)據(jù)庫
Class.forName(driverName);
cn=DriverManager.getConnection("jdbc:odbc:cityoa"); 其中config是在Servlet中定義的ServletConfig類型的屬性變量今妄,由init方法取得它的實例鸳碧。可見連接不同數(shù)據(jù)庫雁仲,直接修改配置文件即可琐脏,不需要代碼的修改和重新編譯。
2.Servlet映射
任何Web文檔在Internet上都要有一個URL地址才能被請求訪問吹艇,Servlet不能像JSP一樣直接放在Web的發(fā)布目錄下昂拂,因此Servlet需要單獨映射URL地址。在WEB-INF/web.xml中進行Servlet的URL映射鼻听。
HomePageAction
/loginAction.do
上面代碼是絕對地址方式映射,只能映射到一個地址撑教。其中Servlet-name名稱和Servlet聲明中要一致醉拓,URL的格式如下:/目錄/目錄/文件名.擴展名亿卤。而匹配目錄模式映射方式如下,可以請求多個URL秆乳。
MainAction
/main/*
只要是以/main為開頭的任何URL都能請求此Servlet钻哩。如下:
http://localhost:8080/web01/main/login.jsp
http://localhost:8080/web01/main/info/add.do
同樣能你還能使用匹配擴展名模式映射方式,也可以響應(yīng)多地址的請求双藕。
MainAction
*.action
以上配置中擴展名為action的任何請求均能被Servlet響應(yīng)阳仔。如:
http://localhost:8080/web01/login.action
http://localhost:8080/web01/main/info/add.action
注意:你不能混合使用兩種匹配模式近范,否則會映射出錯,如/main/*.action這種是錯誤的混合模式叶堆。
三. 簡單實現(xiàn)表單提交功能
創(chuàng)建Web Project項目斥杜,項目名稱為TestServlet。項目結(jié)構(gòu)如下圖所示:
在WebRoot文件夾下創(chuàng)建images文件夾忘渔,并添加圖片logo.jpg缰儿。添加inc文件夾,新建style.css文件宣赔,代碼如下:
.main {
width: 1024px;
text-align:left;
}
.font {
font-family: "Trebuchet MS";
font-size: 14px;
font-weight: bold;
color: #FFFFFF;
}
.div {
margin: 0px;
padding: 0px;
width: 1014px;
}
.tdBgColor{
background-color:#6b1101;
}
a{
font-family: "Trebuchet MS";
font-size: 14px;
font-weight: bold;
color: #FFFFFF;
line-height:50px;
text-decoration:none;
}
a.hover{
font-family: "Trebuchet MS";
font-size:14px;
font-weight: bold;
color:#0000FF;
line-height:50px;
text-decoration:underline;
padding-bottom:1px;
}
a.visited{
font-family: "Trebuchet MS";
font-size:14px;
font-weight: bold;
color:#000066;
line-height:50px;
text-decoration:none;
}
a.active{
font-family: "Trebuchet MS";
font-size:14px;
font-weight: bold;
color:#0000FF;
line-height:50px;
text-decoration:none;
padding-bottom:1px;
} 然后修改index.jsp主頁儒将,代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
歡迎使用火車票訂票系統(tǒng)管理系統(tǒng) 椅棺,如有不足齐蔽,敬請指導(dǎo)!
系統(tǒng)管理員登錄
用戶名:
密 碼:
關(guān)于我們 | 網(wǎng)站聲明
版權(quán)所有?2014-2015 北京理工大學(xué) Eastmount
京ICP備10009636號
此時運行Web網(wǎng)站诱渤,點擊Run As=》MyEclipse Server Application谈况。如圖所示:
此時碑韵,輸入用戶名和密碼登錄效果如下圖所示:
然后在src中新建文件夾Servlet,新建HomePageAction.java文件占卧,代碼如下:
package servlet;
import java.io.IOException;
import java.sql.*; //導(dǎo)入數(shù)據(jù)庫處理所有庫
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JOptionPane;
//用戶登錄處理Servlet 系統(tǒng)登錄主頁處理表單
public class HomePageAction extends HttpServlet {
private Connection cn=null; //定義數(shù)據(jù)庫連接對象
private String driverName=null; //數(shù)據(jù)庫驅(qū)動器
private String url=null; //數(shù)據(jù)庫地址URL
//初始化方法联喘,取得數(shù)據(jù)庫連接對象
public void init(ServletConfig config) throws ServletException
{
super.init(config);
driverName=config.getInitParameter("driverName");
url=config.getInitParameter("url");
try {
Class.forName(driverName);
cn=DriverManager.getConnection(url);
} catch(Exception e) {
System.out.println("取得數(shù)據(jù)庫連接錯誤:"+e.getMessage());
}
}
//處理GET請求方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//取得用戶注冊表單提交的數(shù)據(jù)
String userid=request.getParameter("userid");
String password=request.getParameter("password");
//判斷登錄賬號為空豁遭,則自動跳轉(zhuǎn)到注冊頁面
if(userid==null||userid.trim().length()==0) {
response.sendRedirect("index.jsp");
JOptionPane.showMessageDialog(null, "User name or password can't be empty!");
}
//判斷登錄密碼為空
if(password==null||password.trim().length()==0) {
response.sendRedirect("index.jsp");
JOptionPane.showMessageDialog(null, "User name or password can't be empty!");
}
//查詢數(shù)據(jù)庫和跳轉(zhuǎn)到登錄主界面
try {
//查詢數(shù)據(jù)庫操作
//跳轉(zhuǎn)到主界面
response.sendRedirect("success.jsp");
} catch(Exception e) {
System.out.println("錯誤:"+e.getMessage());
response.sendRedirect("index.jsp");
}
}
//處理POST請求方法
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doGet(request,response);
}
//銷毀方法
public void destroy() {
super.destroy();
try {
cn.close();
}catch(Exception e) {
System.out.println("關(guān)閉數(shù)據(jù)庫錯誤:"+e.getMessage());
}
}
} 同時在WEB-INF文件夾web.xml文件中配置Servlet蓖谢,代碼如下:
index.jsp
HomePageAction
servlet.HomePageAction
driveName
sun.jdbc.odbc.Jdbc0dbcDriver
url
jdbc:odbc:cityoa
HomePageAction
/loginAction.do
最后新建success.java文件闪幽,跳轉(zhuǎn)后顯示的頁面。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
界面表單提交跳轉(zhuǎn)成功
返回
顯示效果如下圖所示:
此時Servlet配置成功委可,而且表單跳轉(zhuǎn)功能也實現(xiàn)了。你可能遇到如下錯誤:
解決方案如下:
最后希望文章對你有所幫助拾酝,下一篇文章準備講述JSP網(wǎng)站的一種經(jīng)典網(wǎng)站模型和MyEclipse數(shù)據(jù)庫配置相關(guān)知識卡者。如果文章有不足或錯誤的地方,還請海涵材诽!
(By:Eastmount 2015-5-7 清晨4點 http://blog.csdn.net/eastmount/)