JavaWeb核心之Servlet 教學導航 教學目標 案例1、完成用戶登陸功能 案例2、記錄成功登陸系統的人次 教學方法 1、Servlet簡介 1.什麼是Servlet Servlet 運行在服務端的Java小程序,是sun公司提供一套規範(接口),用來處理客戶端請求、響應給瀏覽器的動態資源。但servlet的實質就是java代碼,經過java的API 動態的向客戶端輸出內容 servlet規範:包含三個技術點 1)servlet技術 2)filter技術---過濾器 3)listener技術---監聽器 2.Servlet快速入門 實現步驟: 1)建立類實現Servlet接口 2)覆蓋還沒有實現的方法---service方法 3)在web.xml進行servlet的配置 但在實際開發中,咱們不會直接去實現Servlet接口,由於那樣須要覆蓋的方法太多, 咱們通常建立類繼承HttpServlet 實現步驟: 1)建立類繼承HttpServlet類 2)覆蓋doGet和doPost 3)在web.xml中進行servlet的配置 畫圖描述整個訪問過程: 2、Servlet的API(生命週期) (1)Servlet接口中的方法 1)init(ServletConfig config) 什麼時候執行:servlet對象建立的時候執行 ServletConfig : 表明的是該servlet對象的配置信息 2)service(ServletRequest request,ServletResponse response) 什麼時候執行:每次請求都會執行 ServletRequest :表明請求 認爲ServletRequest 內部封裝的是 http請求的信息 ServletResponse :表明響應 認爲要封裝的是響應的信息 3)destroy() 什麼時候執行:servlet銷燬的時候執行 (2)HttpServlet類的方法 1)init() 2)doGet(HttpServletRequest request,HttpServletResponse response) 3)doPost(HttpServletRequest request,HttpServletResponse response) 4)destroy() (3)Servlet的生命週期(面試題) 1)Servlet什麼時候建立 默認第一次訪問servlet時建立該對象 2)Servlet什麼時候銷燬 服務器關閉servlet就銷燬了 3)每次訪問必然執行的方法 service(ServletRequest req, ServletResponse res)方法 問題:對XXXServlet進行了10次訪問,init(),destory(),service(),doGet(),doPost() 一共執行力多少次?request對象建立幾個?response建立幾個? 3、Servlet的配置 1.基本配置 其中url-pattern的配置方式: 1)徹底匹配 訪問的資源與配置的資源徹底相同才能訪問到 2)目錄匹配 格式:/虛擬的目錄../* *表明任意 3)擴展名匹配 格式:*.擴展名 注意:第二種與第三種不要混用 /aaa/bbb/*.abcd(錯誤的) 2.服務器啓動實例化Servlet配置 Servlet的什麼時候建立:默認第一次訪問時建立 爲何是默認? 當在servlet的配置時 加上一個配置 <load-on-startup> servlet對象在服務器啓動 時就建立 3.缺省Servlet 能夠將url-pattern配置一個/,表明該servlet是缺省的servlet 什麼是缺省的servlet? 當你訪問資源地址全部的servlet都不匹配時 , 缺省的servlet負責處理 其實,web應用中全部的資源的響應都是servlet負責,包括靜態資源 4.歡迎頁面 4、ServletContext對象 1.什麼是ServletContext對象 ServletContext表明是一個web應用的環境(上下文)對象,ServletContext對象 內部封裝是該web應用的信息,ServletContext對象一個web應用只有一個 問題:一個web應用有幾個servlet對象?----多個 ServletContext對象的生命週期? 建立:該web應用被加載(服務器啓動或發佈web應用(前提,服務器啓動狀 態)) 銷燬:web應用被卸載(服務器關閉,移除該web應用) 2.怎樣得到ServletContext對象 1)ServletContext servletContext = config.getServletContext(); 2)ServletContext servletContext = this.getServletContext(); 3.ServletContext的做用 (1)得到web應用全局的初始化參數 web.xml中配置初始化參數 經過context對象得到參數 (2)得到web應用中任何資源的絕對路徑(重要 重要 重要) 方法:String path = context.getRealPath(相對於該web應用的相對地址); (3)ServletContext是一個域對象(重要 重要 重要) 什麼是域對象?什麼是域? 存儲數據的區域就是域對象 ServletContext域對象的做用範圍:整個web應(全部的web資源均可以隨意向 servletcontext域中存取數據,數據能夠共享) 域對象的通用的方法: setAtrribute(String name,Object obj); getAttribute(String name); removeAttribute(String name);
我的總結:new--servlet---設置urlpattern(web.xml不用操做),servletcontext 3個功能 html
servlet簡介java
Servlet 運行在服務端(tomcat)的Java小程序,是sun公司提供一套規範(接口),用來處理客戶端請求、響應給瀏覽器的動態資源。但servlet的實質就是java代碼,經過java的API 動態的向客戶端輸出內容mysql
包含三個技術點:1.servlet 2filter技術--過濾器 3listener技術--監聽器web
快速入門:面試
1)建立類實現Servlet接口sql
2)覆蓋還沒有實現的方法---service方法數據庫
3)在web.xml進行servlet的配置apache
package com.heima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; public class QuickStartServlet implements Servlet { @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig arg0) throws ServletException { } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("qucikstartservlet running.."); HttpServletResponse response=(HttpServletResponse) arg1; response.getWriter().write("heihei"); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>web13</display-name> <servlet> <servlet-name>abc</servlet-name> <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>abc</servlet-name> <url-pattern>/qqqq</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
servlet的api小程序
1)init(ServletConfig config)api
什麼時候執行:servlet對象建立的時候執行(tomcat建立該對象)
ServletConfig : 表明的是該servlet對象的配置信息
<servlet> <servlet-name>abc</servlet-name> <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql///abc</param-value> </init-param> </servlet>
@Override public void init(ServletConfig config) throws ServletException { System.out.println("initing..."); //1.獲得servlet的name String servletName=config.getServletName(); System.out.println(servletName);//abc //2.得到該servlet的初始化參數 String initParameter=config.getInitParameter("url"); System.out.println(initParameter); //3.得到ServletContext對象 ServletContext servletContext=config.getServletContext(); }
2)service(ServletRequest request,ServletResponse response)
什麼時候執行:每次請求都會執行
ServletRequest :表明請求 認爲ServletRequest 內部封裝的是 http請求的信息
ServletResponse :表明響應 認爲要封裝的是響應的信息
3)destroy()
什麼時候執行:servlet銷燬的時候執行
1)Servlet什麼時候建立
默認第一次訪問servlet時建立該對象
2)Servlet什麼時候銷燬
服務器關閉servlet就銷燬了
3)每次訪問必然執行的方法
service(ServletRequest req, ServletResponse res)方法
servletrequest內部封裝的是http請求的信息
servletresponse表明響應認爲要封裝的是響應的信息
servlet的執行過程
servlet配置
1.基本配置
Servlet的什麼時候建立:默認第一次訪問時建立
爲何是默認?
當在servlet的配置時 加上一個配置 <load-on-startup> servlet對象在服務器啓動 時就建立
<servlet> <servlet-name>abc</servlet-name> <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql:///abc1</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>
數字表明優先級,越小優先級越高
3.缺省servlet
能夠將url-pattern配置一個/,表明該servlet是缺省的servlet
什麼是缺省的servlet?
當你訪問資源地址全部的servlet都不匹配時 , 缺省的servlet負責處理。 其實,web應用中全部的資源的響應都是servlet負責,包括靜態資源
自定義web.xml查找動態的url,動態查找不到, tomcat conf下的apache-tomcat-7.0.52\conf下的web.xml全局配置,查找靜態webapp下的靜態資源
<servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
DefaultServlet查找靜態資源,找出到輸出404
4.歡迎頁面
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
輸入http://localhost:8080/web13/,我的配置裏沒有動態默認配置,查找webap下的 index.html等文件。我的配置裏沒有歡迎頁面配置,則查找全局配置下的web。xml配置
HttpServlet
eclipse新建servlet對象,繼承HttpServlet,沒有service方法,查看源碼,查看繼承對象。doGet裏會調用service方法
用戶登陸功能實現
1.數據庫操做支持: mysql驅動,DBUtils,鏈接池(lib和xml)2 web.xml(url對應servlet對象) 3.servlet對象
package com.heima.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import com.heima.domain.User; import com.heima.utils.DataSourceUtils; public class loginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到用戶名和密碼 String username =request.getParameter("username"); String password=request.getParameter("password"); //2.驗證 QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource()); String sql="select * from user where username=? and password=?"; User user=null; try { user=runner.query(sql, new BeanHandler<User>(User.class),username,password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //3.根據返回結果 if(user!=null){ //成功 response.getWriter().write(user.toString()); }else{ //失敗 response.getWriter().write("wrong username or password"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
servletContex對象
什麼是servletContext:ServletContext表明是一個web應用的環境(上下文)對象,ServletContext對象 內部封裝是該web應用的信息,ServletContext對象一個web應用只有一個
問題:一個web應用有幾個servlet對象?----多個
ServletContext對象的生命週期?
建立:該web應用被加載(服務器啓動或發佈web應用(前提,服務器啓動狀 態))
銷燬:web應用被卸載(服務器關閉,移除該web應用)
如何得到servletContext
1)ServletContext servletContext = config.getServletContext();(通常不用)
2)ServletContext servletContext = this.getServletContext();
ServletContext的做用
1.得到web應用全局的初始化參數
web.xml中配置初始化參數
經過context對象得到參數值
方法:String path = context.getRealPath(相對於該web應用的相對地址);
什麼是域對象?什麼是域?
存儲數據的區域就是域對象
ServletContext域對象的做用範圍:整個web應(全部的web資源均可以隨意向 servletcontext域中存取數據,數據能夠共享)
域對象的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name)
package com.heima.servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ContextServert extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().write("doGet runing..."); //1.得到context對象 ServletContext context=this.getServletContext(); //1。初始化參數 String initParameter = context.getInitParameter("name"); System.out.println(initParameter); //2.得到 絕對路徑 String realPath_A = context.getRealPath("/a.txt"); // /目錄爲WebContent System.out.println(realPath_A); //3.域對象 存數據 context.setAttribute("name", "heiheihei"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
實現記錄用戶登陸次數功能
package com.heima.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import com.heima.domain.User; import com.heima.utils.DataSourceUtils; public class loginServlet extends HttpServlet { @Override public void init() throws ServletException { //zai context中存數據 int count=0; this.getServletContext().setAttribute("count", count); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到用戶名和密碼 String username =request.getParameter("username"); String password=request.getParameter("password"); //2.驗證 QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource()); String sql="select * from user where username=? and password=?"; User user=null; try { user=runner.query(sql, new BeanHandler<User>(User.class),username,password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //3.根據返回結果 if(user!=null){ //從context中取出count進行加運算 Integer count = (Integer)this.getServletContext().getAttribute("count"); count++; this.getServletContext().setAttribute("count", count); //用戶登陸成功 response.getWriter().write(user.toString()+"you are success login "+count); }else{ //失敗 response.getWriter().write("wrong username or password"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }