上一節用Maven新建了web項目成功后,本文演示在此基礎上應用servlet。
從對tomcat服務器進行配置可的過程中可以知道,tomcat作為servlet容器運行,負責處理客戶請求,把請求傳送給servlet並把結果返回給客戶。
這里的servlet作用是處理該客戶請求的最終實體類。
servlet實際上是一個有規定接口,屬性和方法的java類,tomcat容器與servlet之間的接口是由servlet API定義好的,這個接口定義了tomcat容器在servlet上要調用的方法及傳遞給servlet的對象。
tomcat服務器會在啟動時,將在web.xml中配置好的servlet對象實例化,並加載到服務器的內存中,若接收到HTTP請求,服務器將調用相應的servlet對象來進行處理。
所有的servlet都必須實現javax.servlet.Servlet接口,但是我們在進行http協議相關的web開發時,一般直接通過繼承javax.servlet.HttpServlet類來實現。
1.首先修改pom.xml文件,添加servlet依賴
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.lei.demo</groupId> 5 <artifactId>maven-web-demo</artifactId> 6 <packaging>war</packaging> 7 <version>0.0.1-SNAPSHOT</version> 8 <name>maven-web-demo Maven Webapp</name> 9 <url>http://maven.apache.org</url> 10 <dependencies> 11 <!-- JUnit配置 --> 12 <dependency> 13 <groupId>junit</groupId> 14 <artifactId>junit</artifactId> 15 <version>3.8.1</version> 16 <scope>test</scope> 17 </dependency> 18 <!-- 添加Servlet --> 19 <dependency> 20 <groupId>javax.servlet</groupId> 21 <artifactId>servlet-api</artifactId> 22 <version>3.1-b02</version> 23 <scope>provided</scope> 24 </dependency> 25 </dependencies> 26 <build> 27 <finalName>maven-web-demo</finalName> 28 </build> 29 </project>
修改完保存后,項目會從Maven倉庫中自動添加servlet-api-3.1-b02.jar包的引用,如果倉庫中沒有,會自動下載。操作步驟如下:
簡單說下:source folder和folder區別。因為本人在創建source folder的時候,總是莫名其妙的創建不了,或創建一個source folder結果它就跑到folder里面去了。(好像是一個bug來着,若你也出現同樣的問題,請在創建source folder中以source folder,folder,package不同的形式來創建它。)
source folder :存放java源代碼的文件夾,當然也包括一些package文件夾,還可以包含其他文件. 項目構建后,source folder里面的java自動編譯成class文件到相應的bin文件夾中,其他文件也會移到到相應的目錄下.
folder :里面可以放入任何文件.包括java源文件,jar文件,其他文件(例如,圖片,聲音等).在此我說明一下,如果里面含有java源文件,不管程序是否 正 確,eclipse都不會報錯,把它們當做普通文件處理.但是項目如果要使用這里面的文件,情況就不同了.
(很多要在Java中訪問的文件可以放在src下或者便於區分新建特定名字的source folder目錄放在下面,這樣的會隨着編譯自動將java文件被編譯到default output folder路徑下面(若你重新設置了output folder文件路徑,則編譯到新設置的路徑文件下),而不是java類型的文件,則是直接拷貝過去,這一切對於開發者都是透明的。需要注意的是,無論是使用默認或修改了的putput folder,在myeclipse工作目錄中都以不可見的形式存在,當然你可以在文件夾中找到它)
2.新建一個Servlet
在source folder下的src/main/java下創建一個com.sulei.demo包,包下創建一個ServletDemo類。
一個servlet從產生到結束的流程如下:
a. servlet容器創建servlet的一個實例,在需要該servlet處理的請求到時觸發。
b.容器調用該實例的init()方法。
c. 如果容器對該servlet有請求,則調用此實例的service()方法。(注意是service而不是servlet)
d. 容器在銷毀本實例前調用它的destroy()方法,並還進行垃圾收集。
所以servlet生命周期常常被定義為:加載,實例化,初始化,處理客戶請求和銷毀。一旦清清了一個servlet,就沒有辦法阻止容器執行一個完整的生命周期了。
servlet類代碼如下:
1 package com.sulei.demo; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * Servlet implementation class ServletDemo 11 */ 12 public class ServletDemo extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 public ServletDemo() { 16 super(); 17 } 18 //doGet方法處理GET類型的請求 19 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 doPost(request, response); 21 } 22 //doPost處理POST類型的請求 23 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 request.setCharacterEncoding("UTF-8"); 25 response.setContentType("text/html;charset=utf-8"); 26 27 String action = request.getParameter("action"); 28 if("login_input".equals(action)) { 29 request.getRequestDispatcher("login.jsp").forward(request , response); 30 } else if("login".equals(action)) { 31 String name = request.getParameter("name"); 32 String password = request.getParameter("password"); 33 34 System.out.println("name->" + name + ",password->" + password); 35 } 36 } 37 38 }
3.修改web.xml配置文件
web.xml配置文件的內容為:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 3 <javaee:display-name>Archetype Created Web Application</javaee:display-name> 4 <servlet> 5 <javaee:description></javaee:description> 6 <javaee:display-name>ServletDemo</javaee:display-name> 7 <servlet-name>ServletDemo</servlet-name> 8 <servlet-class>com.sulei.demo.ServletDemo</servlet-class> 9 </servlet> 10 <servlet-mapping> 11 <servlet-name>ServletDemo</servlet-name> 12 <url-pattern>/demo</url-pattern> 13 </servlet-mapping> 14 </web-app>
4.創建index.jsp
jsp文件內容如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <p>用Maven創建web項目,測試Servlet</p> 11 <a href="demo?action=login_input">登錄(demo?action=login_input)</a> 12 </body> 13 </html>
5.創建login.jsp
jsp文件內容如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <form action="demo?action=login" method="post"> 11 Name:<input type="text" name="name" /> 12 Password:<input type="password" name="password" /> 13 14 <input type="submit" value="登錄" /> 15 </form> 16 </body> 17 </html>
擴展內容:JSP是基於servlet的擴展,實際上JSP編譯后就是servlet文件,不過使用jsp技術使得網頁開發變得更加方便而已。
servlet中只能通過out.println()語句輸出HTML語法。
JSP網頁是傳統的HTML文件中加入java程序片段和JSP標簽構成的,servlet/JSP容器收到客戶端的請求時,首先執行網頁中的程序代碼,然后把結果以HTML格式響應給客戶端。
現在效果圖如下:(注意jsp文件存放的位置都是存放在webapp文件夾下)
6.運行代碼:右鍵單擊工程名稱-->run as -->myeclipse service application--> tomcat 7 .x-->ok
各步驟截圖如下:
a.進入index頁面
b.進入login頁面
c.在窗口可以看到運行java程序獲取jsp頁面的name和password結果