Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交
? ? ? ? 在Java EE應用編程中Servlet是基礎,JSP是建立在Servlet基礎之上的,其他Web框架如Struts、WebWork和Spring MVC都是基于Servlet的。本文主要講述MyEclipse和Tomcat配置Servlet的過程和簡單實現表單提交功能。
? ? ? ? 希望對大家有所幫助,參考書籍《Java EE企業級應用開發實例教程》。
? ? ? ??Java+MyEclipse+Tomcat (一)配置過程及jsp網站開發入門
一. Servlet編程
? ? ? ? 1.Web基礎知識
? ? ? ? 在講述Servlet之前,先了解下Web基礎知識。Web(World Wide Web,萬維網)本質就是Internet所有文檔的集合,Web文檔主要類型有HTML網頁、CSS、JavaScript、各種動態網頁、圖片、聲音和視頻等。
? ? ? ? Web文檔保存在Web站點(Site)上,Web站點駐留在Web服務器上。Web服務器是一種軟件系統,提供Web文檔的管理和請求服務,常見的Web服務器軟件有Apache、IIS、WebLogic和Tomcat等。每個服務器都有一個唯一的IP地址,Web服務器對外都有一個服務端口,默認時80或8080端口。
? ? ? ? Web文檔都有一個唯一的地址,通過URL格式來進行定位,其格式為:
? ? ? ? 協議://IP地址:端口/站點名/目錄/文件名
? ? ? ? 其中協議主要有HTTP、HTTPS和FTP。根據不同的協議,默認端口可以省略,HTTP/HTTPS為80端口,FTP為21端口。例:
? ? ? ? http://210.30.108.30:8080/test/admin/login.jsp
? ? ? ? Web服務器接收到請求后,根據URL定位到相應文檔,根據文檔類型進行對應的處理,將文檔通過網絡發送到客戶端,一般是瀏覽器,用戶即可查看或下載請求的文檔。Web通過請求/響應(Request/Response)模式進行工作,即由瀏覽器使用URL對Web文檔進行請求,Web服務器接收并處理請求,處理結束后將響應內容發送到瀏覽器。
? ? ? ? Web請求方式主要包括GET、POST、PUT、DELETE和HEAD。其中GET請求直接返回請求的文檔,同時傳遞參數在URL中;POST請求將傳遞到Web服務器的數據保存到數據流中,只有通過表單提交形式才能實現。如下:
? ? ? ? 這些知識大家應該都非常熟悉了,我就不再介紹了,引出表單就開始敘述Servlet。
? ? ? ? 2.什么是Servlet
? ? ? ? 在Sun公司制定Java EE規范初期,為實現動態Web而引入了Servlet,用于替代笨重的CGI(通用網關接口),實現了Java語言編程的動態Web技術,奠定了Java EE的基礎。后來為進一步簡化動態Web網頁的生成,并且在微軟公司推出了ASP(Active X服務系統頁面)技術的競爭下,Sun推出了JSP規范,進一步簡化了Web網頁的編程。但JSP在進行HTTP請求處理方面不如Servlet方便和規范,Servlet在當今的MVC模式Web開發中牢牢占據一地。并且現在流行的Web框架基本基于Servlet技術,如Struts、WebWork和Spring MVC等。只有掌握了Servlet才能真正掌握Java Web編程的核心和精髓。
? ? ? ? 那么,究竟Servlet是什么東東呢?
? ? ? ? Servlet是運行在Web容器的類,能處理Web客戶的HTTP請求,并產生HTTP響應。
? ? ? ? Servlet是Java EE規范定義的Web組件,運行在Web容器中。由Web容器負責管理Servlet的聲明周期,包括創建和銷毀Servlet對象。客戶不能直接創建Servlet對象和調用Servlet的方法,只能通過向Web服務器發出HTTP請求,間接調用Servlet的方法。這是Servlet與普通Java類的重要區別。
? ? ? ? Sun在如下兩個包中提供了Servlet的全部接口和類:
? ? ? ? ? ? ? 1.javax.servlet包含支持所有協議的通用Web組件接口和類
? ? ? ? ? ? ? 2.javax.servlet.http包含支持HTTP協議的接口和類
? ? ? ? Servlet可以完成Web組件具有的所有功能,如下:
? ? ? ? ? ? ? 1.接收HTTP請求
? ? ? ? ? ? ? 2.取得請求信息,包括請求頭和請求參數數據
? ? ? ? ? ? ? 3.調用其他Java類方法完成具體的業務功能
? ? ? ? ? ? ? 4.生成HTTP響應,包括HTML和非HTML響應
? ? ? ? ? ? ? 5.實現到其他Web組件的跳轉,包括重定向和轉發
? ? ? ? 編寫Servlet需要引入的兩個包和Java I/O包:
? ? ? ? public class LoginAction extends HttpServlet {}
? ? ? ? 每個Servlet一般都需要重寫doGet方法和doPost方法。當用戶使用GET方式請求Servlet時,Web容器調用doGet方法處理請求;當用戶使用POST方法請求Servlet時,Web容器嗲用doPost方法。
? ? ? ? Servlet是生命周期時序圖如上圖所示,包括加載類和實例化階段、初始化階段、處理請求階段和銷毀階段。
二. 配置Servlet
? ? ? ? Servlet作為Web組件可以處理HTTP請求/響應,因而對外要求一個唯一的URL地址。但由于Servlet是一個Java類文件,不像JSP那樣直接存放在Web目錄下就能獲得URL請求訪問地址。Servlet必須在Web的配置文件/WEB-INF/web.xml中進行配置和映射才能響應HTTP請求。
? ? ? ? 1.Servlet聲明
? ? ? ? 它的任務是通知Web容器Servlet的存在,聲明語法如下:
? ? ? ? 其中<servlet-name>聲明Servlet的名字,一般與Servlet的類名相同即可,要求在一個web.xml文件內名字唯一。<servlet-class>指定Servlet的全名,即包名.類型。Web容器會根據此定義載入類文件到內容中,進而調用默認構造方法創建Servlet對象。
? ? ? ? Servlet初始參數如數據庫Driver、URL、賬號和密碼等信息,在Servlet中可以讀取這些信息,如下定義了一個初始參數,即數據庫的JDBC驅動。
? ? ? ? 在Servlet中可以通過ServletConfig取得定義的初始化參數,取得以上定義的參數的代碼如下:
? ? ? ? 2.Servlet映射
? ? ? ? 任何Web文檔在Internet上都要有一個URL地址才能被請求訪問,Servlet不能像JSP一樣直接放在Web的發布目錄下,因此Servlet需要單獨映射URL地址。在WEB-INF/web.xml中進行Servlet的URL映射。
<servlet-mapping><servlet-name>MainAction</servlet-name><url-pattern>/main/*</url-pattern></servlet-mapping> ? ? ? ? 只要是以/main為開頭的任何URL都能請求此Servlet。如下:
? ? ? ? ? ? http://localhost:8080/web01/main/login.jsp
? ? ? ? ? ? http://localhost:8080/web01/main/info/add.do
? ? ? ? 同樣能你還能使用匹配擴展名模式映射方式,也可以響應多地址的請求。
<servlet-mapping><servlet-name>MainAction</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping> ? ? ? ? 以上配置中擴展名為action的任何請求均能被Servlet響應。如:
? ? ? ? ? ? http://localhost:8080/web01/login.action
? ? ? ? ? ? http://localhost:8080/web01/main/info/add.action
? ? ? ? 注意:你不能混合使用兩種匹配模式,否則會映射出錯,如/main/*.action這種是錯誤的混合模式。
三. 簡單實現表單提交功能
? ? ? ? 創建Web Project項目,項目名稱為TestServlet。項目結構如下圖所示:
? ? ? ? 在WebRoot文件夾下創建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+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href="<%=basePath%>"><title>火車票訂票系統</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><!-- 界面布局 --> <div align="center"><div class="style"><table width="1024" height="150" cellpadding="0" cellspacing="0" ><!-- 動態首頁訂票界面 同時獲取年月日和動態滾動消息 --><tr><td colspan="2"><img src="./images/logo.jpg" alt="logo" width="1024" height="149"></td></tr> <tr><td width="205" bgcolor="#b7d7ec"><p align="center"><!-- 注意:方法today.getYear()已經過時,需要添加1900 --><script language=JavaScript>today = new Date();function initArray(){this.length=initArray.arguments.length;for(var i=0;i<this.length;i++)this[i+1]=initArray.arguments[i]; }var d=new initArray("星期日","星期一","星期二","星期三","星期四", "星期五","星期六");document.write("<font color=##ff0000 style='font-size:12pt;font-family: 宋體'> ",today.getYear()+1900,"年",today.getMonth()+1,"月",today.getDate(),"日 ",d[today.getDay()+1],"</font>" );</script> </p> </td> <td width="819" bgcolor="#b7d7ec"><marquee direction="left" οnmοuseοver=this.stop() οnmοuseοut=this.start() scrollAmount=3 scrollDelay=100><FONT style="FONT-SIZE: 18px"color=blue>歡迎使用火車票訂票系統管理系統 ,如有不足,敬請指導!</FONT></marquee></td></tr></table></div><table width="100%" height="75%" border="0" align="center"><tr><td width="40%" height="20%">?</td><td width="20%" > <!-- 中間登錄部分布局 提交表單 配置web.xml --><form action="loginAction.do"><table width="500" height="80%" border="2" bordercolor="#12A0F5" bgcolor="#dfeaf1"><tr><td></td><td align="center"><br />系統管理員登錄 <br/><br/>用戶名:<input type="text" name="userid" size="19" maxlength="19" /><br/><br/>密?碼:<input type="password" name="password" size="20" maxlength="19" /><br /><br /><input type="submit" name="Submit" value="登錄"/>????<input type="reset" name="Submit" value="重置" /><br/> </td><td></td></tr></table></form></td><td width="40%"></td></tr><tr><td height="67" colspan="3"> <!-- 底部版權所有界面 --><TABLE class=wrapper border=0 cellSpacing=0 cellPadding=0 width="100%" align=center><TBODY><TR><TD style="LINE-HEIGHT: 150%" align="center"> <HR style="WIDTH: 96%; HEIGHT: 4px; COLOR: #02457c"><font size="2"> <SCRIPT language=javascript src=""></SCRIPT><!-- target=_blank開啟新的網頁 --><BR><A href="aboutme.jsp" target=_blank>關于我們</A> | <A href="wzsm.jsp">網站聲明</A><BR>版權所有©2014-2015 北京理工大學 Eastmount <BR>京ICP備10009636號 </font></TD></TR></TBODY></TABLE></td></tr></table></div></body> </html>? ? ? ? 此時運行Web網站,點擊Run As=》MyEclipse Server Application。如圖所示:
? ? ? ? 此時,輸入用戶名和密碼登錄效果如下圖所示:
? ? ? ? 然后在src中新建文件夾Servlet,新建HomePageAction.java文件,代碼如下:
package servlet;import java.io.IOException; import java.sql.*; //導入數據庫處理所有庫 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 系統登錄主頁處理表單 public class HomePageAction extends HttpServlet {private Connection cn=null; //定義數據庫連接對象private String driverName=null; //數據庫驅動器private String url=null; //數據庫地址URL//初始化方法,取得數據庫連接對象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("取得數據庫連接錯誤:"+e.getMessage());}}//處理GET請求方法public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{//取得用戶注冊表單提交的數據String userid=request.getParameter("userid");String password=request.getParameter("password");//判斷登錄賬號為空,則自動跳轉到注冊頁面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!");}//查詢數據庫和跳轉到登錄主界面try {//查詢數據庫操作//跳轉到主界面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("關閉數據庫錯誤:"+e.getMessage());}} }? ? ? ? 同時在WEB-INF文件夾web.xml文件中配置Servlet,代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><display-name></display-name> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 配置Servlet --><servlet><servlet-name>HomePageAction</servlet-name><servlet-class>servlet.HomePageAction</servlet-class><init-param><param-name>driveName</param-name><param-value>sun.jdbc.odbc.Jdbc0dbcDriver</param-value></init-param><init-param><param-name>url</param-name><param-value>jdbc:odbc:cityoa</param-value></init-param> </servlet><servlet-mapping><servlet-name>HomePageAction</servlet-name><url-pattern>/loginAction.do</url-pattern></servlet-mapping></web-app>? ? ? ? 最后新建success.java文件,跳轉后顯示的頁面。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href="<%=basePath%>"><title>驗證成功界面</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>界面表單提交跳轉成功 <br><a href="index.jsp">返回</a></body> </html>? ? ? ?顯示效果如下圖所示:
? ? ? ? 此時Servlet配置成功,而且表單跳轉功能也實現了。你可能遇到如下錯誤:
? ? ? ? 解決方案如下:
? ? ? ? 最后希望文章對你有所幫助,下一篇文章準備講述JSP網站的一種經典網站模型和MyEclipse數據庫配置相關知識。如果文章有不足或錯誤的地方,還請海涵!
? ? ? ??(By:Eastmount 2015-5-7 清晨4點 ??http://blog.csdn.net/eastmount/) ? ? ? ?
總結
以上是生活随笔為你收集整理的Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java+MyEclipse+Tomca
- 下一篇: Java+MyEclipse+Tomca