一、Applet是由Java語言編寫的小應用程序,能夠包含在HTML頁面中,用<applet></applet>來標記。javascript
二、Applet工做原理css
當瀏覽器遇到<applet></applet>這樣的標籤的時候,就會處理Applet程序,但前提是瀏覽器是支持Java的。html
當用戶訪問這樣的網頁的時候,Applet應用程序是被下載到客戶的本地計算機內的,而後再執行。java
Applet具備設計精美用戶界面的優點。web
Applet有很大的安全限制。小程序
三、Servlet是在服務器上運行的小程序,而Applet是隨着網頁一塊兒打包到客戶端,在客戶端上執行。因爲是在服務器端運行,因此能夠用java語言來實現,在通訊量大的狀況下,javaServlet的執行速度是快於CGI(公共網關接口)的。瀏覽器
四、最先支持Servlet的是JSP,後來不少技術都支持了Servlet API接口,Servlet能夠交互式地瀏覽和修改數據。安全
五、Servlet的實現過程服務器
客戶端發送請求到服務器端;session
服務器將請求發給Servlet;
Servlet生成相應內容並將響應內容發送給服務器;
服務器將響應返回給客戶端。
六、Servlet只初始化一次,由於只有一個對象。
七、Servlet和Applet的相同的和不一樣點:相同點是他們都不是獨立的應用程序,沒有main()主函數,它們都是被另外的程序(容器)調用的,不一樣點是Servet沒有圖形用戶界面,在服務器端運行,而Applet有很好的圖形用戶界面而且與瀏覽器在客戶端運行。
八、Servlet和CGI:前者比後者有更好的性能、移植性和經濟性。
九、Servlet常見的容器:Apache、Websphere等等,提供Servlet功能的服務器叫Servlet容器。容器比如是桌面應用程序對於的操做系統同樣。
十、Servlet與JSP:Servlet是一句一句地輸出HTML語句,而JSP像PHP,ASP那樣是鑲嵌型的語言。Servlet方便與寫業務層,而JSP方便於寫表現層。通常,JSP只用於寫表現層的東西,而業務層的東西用javaBean來寫。能夠說JSP是Servlet的替代方案,但通常的學習者仍是須要從Servlet開始學,而後學JSP,最後是JSP+BEAN。
十一、Servlet能夠方便地對Web中的HTTP請求進行處理,Servlet主要用於處理各類業務邏輯。Servlet主要應用與B/S結構的開發中。一般狀況下咱們編寫的Servlet對象都繼承於HttpServlet。
十二、建立Servlet有兩種方法:一是建立一個Java類,而後實現Servlet接口或者繼承於Servlet接口的實現類(HttpServlet)來實現;另外一種是經過IDE集成開發環境。繼承HttpServlet實現的Servlet對象重寫了HttpServlet類中的部分方法。
1三、建立Servlet後還須要對其進行配置,目的是將建立的Servlet註冊到Servlet容器之中,以方便Servlet容器對Servlet的調用。Servlet3.0及之後版本中能夠在web.xml和註解中配置。前者須要本身配置,後者在Eclipse下自動完成配置。前者以下:
<!--註冊Servlet--> <servlet> <!--Servlet描述信息--> <description>This is my first Servlet</description> <!--Servlet的名稱--> <servlet-name>FirstServlet</servlet-name> <!--Servlet類的完整類名--> <servlet-class>com.joeshine.FirstServlet</servlet-class> </servlet> <!--Servlet映射--> <servlet-mapping> <!--Servlet名稱--> <servlet-name>FirstServlet</servlet-name> <!--訪問URL地址--> <url-pattern>/FirstServlet</url-pattern> </servlet-mapping>
1四、在Servlet中實現頁面轉發:利用RequestDispatcher接口實現。該接口有兩個方法:
forward()方法:用於將請求轉發到服務器上的另外一個資源,能夠是Servlet、JSP或HTML;
include()方法:用於把服務器上的另外一個資源(Servlet,JSP,HTML)包含到響應中。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
RequestDispatcher requestdispatcher=request.getRequestDispatcher("main.jsp");
requestdispatcher.forward(request, response);
}
1五、用Servlet處理表單數據
ServletFormDeal.java文件
1 package com.joeshine; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Servlet implementation class ServletFormDeal 13 */ 14 @WebServlet("/ServletFormDeal") 15 public class ServletFormDeal extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 18 /** 19 * @see HttpServlet#HttpServlet() 20 */ 21 public ServletFormDeal() { 22 super(); 23 // TODO Auto-generated constructor stub 24 } 25 26 /** 27 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 28 */ 29 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 // TODO Auto-generated method stub 31 request.setCharacterEncoding("UTF-8"); //設置請求編碼,防止中文亂碼 32 String person=request.getParameter("person"); //獲取留言人 33 String content=request.getParameter("content"); //獲取留言內容 34 response.setContentType("text/html;charset=utf-8");//設置內容類型 35 PrintWriter out=response.getWriter(); //建立輸出流 36 out.println("<html><head><title>獲取留言信息</title></head><body>"); 37 out.println("留言人: "+person+"<br><br>"); 38 out.println("留言內容:"+content+"<br><br>"); 39 out.println("<a href='index.jsp'>返回</a>"); 40 out.println("</body></html>"); 41 out.close(); //關閉輸出流 42 } 43 44 }
index.jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用Servlet處理表單信息</title> </head> <body> <form name="form1" method="post" action="ServletFormDeal"> 留言人: <input type="text" name="person"><br><br> 留言內容:<textarea name="content" rows="6" cols="30" ></textarea><br><br> <input type="submit" name="submit1" value="提交"> <input type="reset" name="submit2" value="重置"> </form> </body> </html>
1六、Servlet過濾器:它和Servlet十分類似,是針對客戶端(瀏覽器)請求資源而言的。它主要是將客戶端(瀏覽器)的請求進行過濾後轉交給下一個資源。其實質上就是在Web應用服務器上的Web應用組件,用於攔截客戶端(瀏覽器)和目標資源的請求。過濾器能夠有多個構成過濾器鏈,經過層次請求轉交後達到目標資源,而後層層響應傳到客戶端。
1七、過濾器的核心對象:過濾器的對象都放在javax.servlet包中,Filter接口對象、FilterConfig接口對象、FilterChain接口對象。每個過濾器都要直接或間接地實現Filter接口對象,其包括三個方法init()初始化過濾器、doFilter()對請求進行過濾處理、destroy()銷燬方法;FilterConfig對象由Servlet容器實現,主要用於獲取過濾器中的配置信息,其有四個方法;FilterChain接口對象也由Servlet容器實現,其只有一個方法,就是將過濾後的請求傳遞給下一個過濾器。
1八、過濾器的建立和配置,相似於Servlet
1 package com.joeshine; 2 //過濾器的建立和配置 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.annotation.*; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.annotation.WebFilter; 12 13 /** 14 * Servlet Filter implementation class FirstFilter 15 */ 16 /*過濾器的配置代碼,filterName屬性是指定Servlet過濾器名,urlPatterns屬性用於指定哪些URL應用該過濾器, 17 ,若是全部頁面均使用則設爲"/*",iniParams屬性用於指定初始化參數。這些屬性不是必須的,能夠在須要的時候選擇使用 18 */ 19 @WebFilter(filterName="/FirstFilter", 20 urlPatterns={"/*"}, 21 initParams={@WebInitParam(name="mood",value="awake")}) 22 public class FirstFilter implements Filter { 23 24 /** 25 * Default constructor. 26 */ 27 public FirstFilter() { 28 // TODO Auto-generated constructor stub 29 } 30 31 /** 32 * @see Filter#destroy() 33 */ 34 public void destroy() { 35 // TODO Auto-generated method stub 36 } 37 38 /** 39 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 40 */ 41 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 42 // TODO Auto-generated method stub 43 // place your code here,放置過濾器代碼的地方 44 45 // pass the request along the filter chain 46 chain.doFilter(request, response); 47 } 48 49 /** 50 * @see Filter#init(FilterConfig) 51 */ 52 public void init(FilterConfig fConfig) throws ServletException { 53 // TODO Auto-generated method stub 54 } 55 56 }
1九、使用過濾器實現網站訪問次數的功能
CountFilter.java
1 package com.joeshine; 2 //建立CountFilter類過濾器,實現javax.servlet.FilterJiek ,用於實現統計網站訪問人數 3 import java.io.IOException; 4 import javax.servlet.annotation.*; 5 import javax.servlet.ServletContext; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.annotation.WebFilter; 12 13 /** 14 * Servlet Filter implementation class Filter 15 */ 16 //在過濾器配置信息裏初始化count計數器參數,保證過濾器編譯後count還能夠更改 17 @WebFilter(filterName="/Filter", 18 urlPatterns="/index.jsp", 19 initParams={ 20 @WebInitParam(name="count",value="3000") 21 }) 22 public class CountFilter implements javax.servlet.Filter { 23 24 /** 25 * Default constructor. 26 */ 27 //定義一個計數器變量 28 private int count; 29 public CountFilter() { 30 // TODO Auto-generated constructor stub 31 } 32 33 /** 34 * @see Filter#destroy() 35 */ 36 public void destroy() { 37 // TODO Auto-generated method stub 38 } 39 40 /** 41 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 42 */ 43 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 44 // TODO Auto-generated method stub 45 //doFilter方法攔截客戶端的請求 46 // place your code here 47 //計數器自加運算 48 count++; 49 //用FiterConfig的獲取過濾器 50 ServletContext context=request.getServletContext(); 51 //未來訪數量值放入ServletContext中 52 context.setAttribute("count", count); 53 //向下傳遞過濾器 54 // pass the request along the filter chain 55 chain.doFilter(request, response); 56 } 57 58 /** 59 * @see Filter#init(FilterConfig) 60 */ 61 public void init(FilterConfig fConfig) throws ServletException { 62 // TODO Auto-generated method stub 63 //獲取初始化參數 64 String param=fConfig.getInitParameter("count"); 65 //將字符串轉換爲Int型 66 count=Integer.valueOf(param); 67 } 68 69 }
index.jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h2> 歡迎光臨,<br> 您是本站的第【<%=application.getAttribute("count") %> 】位訪客! </h2> </body> </html>
20、Servlet監聽器:Servlet監聽器和Servlet過濾器的不少特性是一致的,甚至與過濾器的不少概念也是一致的。監聽器的做用是堅挺Web容器的有效期事件,所以它是由容器管理的。Servlet和JSP中有8個Listener接口和6個Event類。功能是監聽因爲Web應用中狀態改變而引發的Servlet容器產生的相應事件,而後接受並處理這些事件。
2一、Servlet監聽器分爲幾大類
1) Servlet上下文監聽能夠監聽ServletContex對象
ServletContextListener接口:該接口存放在javax.servlet包中,主要監聽ServletContext對象的建立和刪除,它提供兩個方法,參數是Event類,稱爲「Web應用程序的生命週期方法」。
ServletAttributeListener接口:存放在javax.servlet包中,主要監聽ServletContext屬性的增長、刪除、修改。該接口提供了三個方法,參數是Event類。
2) HTTP會話監聽:主要用於監聽信息。4個接口可使用。
HttpSessionListener接口:用於監聽HTTP會話的建立、銷燬。提供了兩個方法,參數是HttpSessionEvent類。
HttpSessionActivationListener接口:用於監聽HTTP會話active、passivate的狀況。提供了三個方法,參數是HttpSessionBindingEvent類,該類有三個方法。
HttpBindingListener接口:用於監聽HTTP會話中對象的綁定信息,它是惟一一個不須要在web.xml中設定Listener的。提供兩個方法,參數是HttpSessionBindingEvent類。
HttpSessionAttributeListener接口:用於監聽HTTP會話中屬性的設置請求。提供兩種方法,參數是HttpSessionEvent類。
3) HTTP請求監聽:監聽客戶端的請求,一旦能夠在監聽程序中獲取客戶端的請求,就能夠對請求統一處理。
ServletRequestListener接口:提供了兩個方法;
ServletRequestAttributeListener接口:提供了三種方法。
2二、Servlet監聽器實例:統計在人數
UserInfoList.java
1 package com.joeshine; 2 3 import java.util.Vector; 4 5 public class UserInfoList { 6 private static UserInfoList user = new UserInfoList(); 7 private Vector<String> vector = null; 8 9 /* 10 * 利用private調用構造函數, 防止被外界產生新的instance對象 11 */ 12 public UserInfoList() { 13 this.vector = new Vector<>(); 14 } 15 16 /* 外界使用的instance對象 */ 17 public static UserInfoList getInstance() { 18 return user; 19 } 20 21 /* 增長用戶 */ 22 public boolean addUserInfo(String user) { 23 if (user != null) { 24 this.vector.add(user); 25 return true; 26 } else { 27 return false; 28 } 29 } 30 31 /* 獲取用戶列表 */ 32 public Vector<String> getList() { 33 return vector; 34 } 35 36 /* 移除用戶 */ 37 public void removeUserInfo(String user) { 38 if (user != null) { 39 vector.removeElement(user); 40 } 41 } 42 }
UserInfoTrace.java類
1 package com.joeshine; 2 3 import javax.servlet.http.HttpSessionBindingEvent; 4 5 public class UserInfoTrace implements 6 javax.servlet.http.HttpSessionBindingListener { 7 private String user; 8 private UserInfoList container = UserInfoList.getInstance(); //得到UserInfoList類的對象 9 10 public UserInfoTrace() { 11 user = ""; 12 } 13 14 // 設置在線監聽人員 15 public void setUser(String user) { 16 this.user = user; 17 } 18 19 // 獲取在線監聽 20 public String getUser() { 21 return this.user; 22 } 23 //當Session有對象加入時執行的方法 24 public void valueBound(HttpSessionBindingEvent arg0) { 25 System.out.println("[ " + this.user + " ]上線"); 26 } 27 //當Session有對象移除時執行的方法 28 public void valueUnbound(HttpSessionBindingEvent arg0) { 29 System.out.println("[ " + this.user + " ]下線"); 30 if (user != "") { 31 container.removeUserInfo(user); 32 } 33 } 34 }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用戶登陸</title> <script language="javascript"> function checkEmpty(form) { for (i = 0; i < form.length; i++) { if (form.elements[i].value == "") { alert("表單信息不能爲空"); return false; } } } </script> <style type="text/css"> section { margin:0 auto auto auto; /*設置外邊距*/ width:363px; /*設置頁面寬度*/ clear:both; /*設置兩側均不能夠有浮動內容*/ background-image:url(images/login.png); /*設置背景圖片*/ height:224px; /*設置高度*/ } form{ padding-left: 80px; /*設置左內邊距*/ padding-top: 120px; /*設置上內邊距*/ } body{ margin: 0px; } </style> </head> <body> <section> <form name="form" method="post" action="showuser.jsp" onSubmit="return checkEmpty(form)"> <input type="text" name="user"> <input type="submit" name="Submit" value="登陸"> </form> </section> </body> </html>
logout.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %> <% session.invalidate(); out.println("<script>parent.location.href='index.jsp';</script>"); %>
showUser.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <%@ page import="com.mingrisoft.*"%> <% UserInfoList list = UserInfoList.getInstance();//得到UserInfoList類的對象 UserInfoTrace ut = new UserInfoTrace();//建立UserInfoTrace類的對象 request.setCharacterEncoding("UTF-8");//設置編碼爲UTF-8,解決中文亂碼 String name = request.getParameter("user"); //獲取輸入的用戶名 ut.setUser(name); //設置用戶名 session.setAttribute("list", ut); list.addUserInfo(ut.getUser()); //添加用戶到UserInfo類的對象中 session.setMaxInactiveInterval(30);//設置Session的過時時間爲30秒 %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>在線用戶列表</title> <style type="text/css"> section { margin:0 auto auto auto; /*設置外邊距*/ width:311px; /*設置頁面寬度*/ clear:both; /*設置兩側均不能夠有浮動內容*/ background-image:url(images/listbg.png); /*設置背景圖片*/ height:254px; /*設置高度*/ } textarea{ border: none; /*設置不顯示邊框*/ background-color: #FDF7E9; /*設置背景顏色*/ margin-left: 20px; margin-top: 100px; padding: 0px; /*設置內邊距*/ } body{ margin: 0px; /*設置外邊距*/ } </style> </head> <body> <section> <div> <textarea rows="10" cols="34"><% Vector vector = list.getList(); if (vector != null && vector.size() > 0) { for (int i = 0; i < vector.size(); i++) { out.println(vector.elementAt(i)); } } %> </textarea> </div> </section> </body> </html>
2三、編寫一個字符編碼過濾器,使得全部的表單數據輸入支持中文,並編寫一個Servlet類輸出request獲取的數據。實例爲添加圖書信息並輸出:
index.jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>首頁</title> <style type="text/css"> ul{ list-style:none; } li{ padding:4px; } </style> </head> <body> <!-- 實現圖書信息的添加,並建立字符編碼過濾器,避免中文亂碼 --> <form name="form" method="post" action="AddServlet"> <ul> <li>圖書編號:<input type="text" name="id"></li> <li>圖書名稱:<input type="text" name="name"></li> <li>價 格:<input type="text" name="price"></li> <li>做 者:<input type="text" name="author"></li> <li><input type="submit" name="submit" value="添加"></li> </ul> </form> </body> </html>
CharactorFilter.java類(字符編碼過濾器)
1 package com.joeshien; 2 //建立字符編碼過濾器類CharactorFilter 3 import java.io.IOException; 4 import javax.servlet.annotation.*; 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.annotation.WebFilter; 12 13 /** 14 * Servlet Filter implementation class CharactorFilter 15 */ 16 @WebFilter(filterName="/CharactorFilter", 17 urlPatterns={"/*"}, 18 initParams={ 19 @WebInitParam(name="encoding",value="UTF-8") 20 }) 21 public class CharactorFilter implements Filter { 22 String encoding=null; //定義字符編碼字符串變量 23 /** 24 * Default constructor. 25 */ 26 public CharactorFilter() { 27 // TODO Auto-generated constructor stub 28 } 29 30 /** 31 * @see Filter#destroy() 32 */ 33 public void destroy() { 34 // TODO Auto-generated method stub 35 encoding=null; 36 } 37 38 /** 39 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 40 */ 41 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 42 // TODO Auto-generated method stub 43 // place your code here 44 if(encoding!=null) //判斷字符編碼是否爲空 45 { 46 //設置請求的編碼格式 47 request.setCharacterEncoding(encoding); 48 //設置響應response的編碼 49 response.setContentType("text/html; charset="+encoding); 50 } 51 // pass the request along the filter chain 52 chain.doFilter(request, response); 53 } 54 55 /** 56 * @see Filter#init(FilterConfig) 57 */ 58 public void init(FilterConfig fConfig) throws ServletException { 59 // TODO Auto-generated method stub 60 encoding=fConfig.getInitParameter("encoding"); //獲取初始化參數 61 } 62 63 }
AddServlet.java(增長圖書信息的Servlet類)
1 package com.joeshien; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Servlet implementation class AddServlet 13 */ 14 @WebServlet("/AddServlet") //配置SERVLET 15 public class AddServlet extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 18 /** 19 * @see HttpServlet#HttpServlet() 20 */ 21 public AddServlet() { 22 super(); 23 // TODO Auto-generated constructor stub 24 } 25 26 /** 27 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 28 */ 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 // TODO Auto-generated method stub 31 doPost(request,response); //處理GET請求 32 } 33 34 /** 35 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 36 */ 37 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 // TODO Auto-generated method stub 39 PrintWriter out=response.getWriter(); //獲取PrintWriter 40 String id=request.getParameter("id"); //獲取圖書編號 41 String name=request.getParameter("name"); //獲取圖書名稱 42 String price=request.getParameter("price"); //獲取圖書價格 43 String author=request.getParameter("author"); //獲取圖書做者 44 out.print("<h2>圖書信息添加成功</h2>"); //輸出圖書信息 45 out.print("圖書編號:"+id+"<br><br>"); 46 out.print("圖書名稱:"+name+"<br><br>"); 47 out.print("價 格:"+price+"<br><br>"); 48 out.print("做 者:"+author); 49 out.flush(); 50 out.close(); 51 } 52 53 }