Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> servlet讀書筆記

servlet讀書筆記

編輯:關於Android編程

將Tomcat的common包下的lib下的jsp_api.jar,servlet_api.jar復制到JDK下的lib下,就可編譯servlet程序。將servlet編譯成class文件後移動到Tomcat的自建的myweb下的WEB-INF下的class裡粘上,然後再myweb下的web.xml中進行配置。

查看端口占用命令:NETSTAT -NAO, 查出占用端口的pid,然後在資源管理器中關閉該pid所對應的應用進程。

Servlet中設置字符集問題:

\

1.Servlet的生命周期:

A.生命全過程:

加載ClassLoader

實例化new

初始化init(ServletConfig)

處理請求servicedoGetdoPost

退出服務destroy()

B.只有一個對象

 

C.API中的過程

Init()//只執行一次,第一次初始化的時候

publicvoidinit(ServletConfigconfig)throwsServletException

 

Service()

Publicvoidservice(ServletRequestreg,ServletResponseres)throwsServletException,java.io.IOException

 

Destroy()//退出的時候

Publicvoiddestroy()\

 

2.cookies問題:

1.服務器可以向客戶端寫內容

2.只能是文本內容

3.客戶端可以阻止服務器寫入

4.只能拿自己webapp寫入的東西

5.Cookes分為兩種

A.屬於窗口/子窗口

B.屬於文本

6.一個servlet/jsp設置的cookies能夠被同一個路徑下面或是子路徑下面的servlet/jsp讀到(路徑=URL)(路徑!=真實文件路徑)

3.session的兩種實現方式:

1.通過cookies實現

2.通過URL重寫來實現

4.session規則:

1.如果浏覽器支持Cookie,創建Session的時候會把SessionID保存在Cookie裡。

2.如果不支持Cookie,必須自己編程使用URL重寫的方式實現Session。

Response.encodeURL()

1.轉碼

2.URL後面加入SessionID.

3Session不像Cookie擁有路徑訪問的問題

同一個application下的servlet/jsp可以共享同一個session,前提是同一個客戶端窗口。

5.服務器端的doGet方法,只有客戶端用get方式來訪問servlet的時候goGet方法才會被調用,即直接在URL中敲我們的地址,就是get方式。Post方式,只有在form裡面點提交,而且form的method是post,這種時候才是post方式。doGet方法中的第一個參數request封裝了從客戶端到服務器端的請求,第二個參數response是從服務器端返回給客戶端的那個對象的信息。

6.服務器常用的狀態碼及其對應的含義如下:

200:服務器響應正常。

304:該資源在上次請求之後沒有任何修改,這通常用於浏覽器的緩存機制,使用GET請求時尤其需要注意。

400:無法找到請求的資源。

401:訪問資源的權限不夠。

403:沒有權限訪問資源。

404:需要訪問的資源不存在。

405:需要訪問的資源被禁止。

407:訪問的資源需要代理身份驗證。

414:請求的URL太長。

500:服務器內部錯誤。

7.在servlet中response.getWritert().println("
");想讓這個
以html的格式在浏覽器中解析,如果浏覽器無法以html的格式解析,可以在代碼中輸入response.setContentType("text/html;charset=gb2312");來告訴浏覽器以html的格式解析。

 

韓順平視頻筆記

\

\

\

\

\

\

\

 

 

 

修改session的存在時間(這裡是按秒來計算):

 

 

\

\

\

\

\

\

\

\

\

\

 

\

\

\

\

請求轉發與重定向

(1).請求轉發

servlet類的對象可以使用javax.servlet.RequestDispatcher.forward()方法來轉發它所收到的HTTP請求。如果當前Servlet組件要把請求轉發給一個JSP組件,例如index.jsp。可以執行如下代碼:

String url = "index.jsp";

RequestDispatcher rd = request.getRequestDispatcher(url);

rd.forward(request, response);

 

在jsp頁面中,可以使用標簽來轉發請求,執行代碼如下:

對於請求轉發,轉發的源組件和目標組件共享request范圍內的共享數據。

 

(2).URL重定向

URL重定向類似於請求轉發,但也有一些重要的區別。主要區別有一下兩個方面:  

1.Web組件可以將請求重定向到任意一個URL,而不僅僅是同一應用上下文中的URL。但最初請求的內容(例如POST參數)丟失了,這是因為服務器與重定向請示的過程無關,這與請求轉發的情況是一樣的。

2.重定向的源組件和目標組件之間不共用同一個HttpServletRequest對象,因此不能共享request范圍內的共享數據。

 

URL重定向可以直接通過操作HTTP頭來完成,但首選方式還是使用javax.servlet.ServletResponse.sendRediect.這個方法的唯一參數就是重定向的目標URL。如果當前應用的Servlet組件要把請求轉發給URL“http://www.baidu.com”,可以執行如下代碼: String url = "http://www.baidu.com"; response.sendRediect(url);     線程安全——Servlet的非線程安全 眾所周知,Servelt並不是線程安全的,它存在著一定的線程安全隱患,因為Servlet只會有一個實例,當多個用戶請求同一個Servlet時,Tomcat就會啟動多線程執行Servlet的代碼,所以一旦開發人員設計不當,就會釀成非常嚴重的後果。看下面例子; public class TestServelt extends HttpServlet{ private String name; //定義一個公共的私有變量   public void doGet(HttpServeltRequest request, HttpServletResponse response) throws ServeltException, IOException{ doPost(request, response); }   public void doPost(HttpServeltRequest request, HttpServletResponse response) throws ServeltException, IOException{ name = request.getParameter("name"); //獲取name參數 try{ Thread.sleep(10000); //讓線程沉睡10秒鐘。 }catch(InterruptedException e){ e.printStackTrace(); } response.getWriter().println("獲取的name參數為:" + name); //輸出信息 }   } 上面程序初看起來沒有什麼問題,而且單個用戶測試的時候程序都是正常的,但是當多個用戶同時執行這個servlet的時候,問題就來了,在10秒內分別用兩個不同的用戶訪問這個Servlet。 在十秒之內在兩個不同的浏覽器上同時輸入: http://localhost:8080/3.18/servlet/TestServlet?name=wgh //應該輸出:name = wgh http://localhost:8080/3.18/servlet/TestServlet?name=mingri //應該輸出:name = mingri 輸出結果為: name = mingri name = mingri 從運行結果可以看出,兩次訪問獲取的name參數都為“mingri”,第一個請求的name參數已經被第二個請求的name參數所覆蓋,這就意味著程序中出現了致命的問題。 為什麼會出現這樣的結果呢?由於有兩個用戶同時訪問這個Servlet,Tomcat就創建了兩個線程來執行這個servlet,由於TestServlet?name=wgh 的請求先執行,所以當第二個請求TestServlet?name=mingri執行的時間,name 參數就覆蓋了第一個請求的參數,因此,Servlet並不是線程安全的,不當的設計可能會造成數據的不同步。 解決上述代碼數據不同步最好的辦法就是不要定義共有的私有變量,最好把變量分配到doGet()方法和doPost()方法中。例如改造後的doPost()方法的代碼如下: public void doPost(HttpServeltRequest request, HttpServletResponse response) throws ServeltException, IOException{ response.setCharacterEncoding("GB2312"); String name = request.getParameter("name"); //獲取name參數 try{ Thread.sleep(10000); }catch(InterruptedException e){ e.printStackTrace(); } response.getWriter().println("獲取的name參數為:" + name); //輸出信息 }     tomcat技巧——常用優化技巧 使用tomcat發布應用的時候,如果程序的並發量小,系統並不會出現問題,但是當並發量大的時候,就會占用系統的大量資源,從而造成系統反應緩慢,由於不了解原因程序員還在程序中查找問題,殊不知服務器調優才是一個正確的解決之道。 在進行調優之前,先找到Tomcat安裝目錄中的子目錄conf,打開web.xml,修改下面的代碼即可: calssName="org.apache.coyote.tomcat4.CoyoteConnector" port="8080" minProcessors="5" maxThreads="75" enableLookups="true" acceptCount="10" debug="0" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useURIValidationHack="false" /> 1.線程控制 Tomcat通過線程池響應用戶的並發訪問,例如,用戶並發數量大約在1000左右。那麼可以設置minProcessors="1000" maxProcessors="1000", 將線程最大和最小設置為一樣後,線程池不會再釋放空閒的線程,當訪問量增加的時候,服務器也不會再消耗系統資源去創建新的線程。 2.屏蔽DNS查詢 關閉該屬性只需修改enableLoopups=“false”.Web應用程序可以通過Web容器提供的getRemoteHost()方法獲得訪問用戶的IP地址和名稱,它是通過IP地址與DNS服務器反查用戶的名字實現的,在一定程度上浪費了Web容器資源,可以關閉該屬性。 3.設置最大連接數 該屬性並不好設置,高了會造成系統消耗大量資源去切換線程,低了會不能滿足用戶的並發需求。設置這個值前最好對系統的實際情況做一下調研。一般情況下,可以將其設置為maxProcessors的1.5倍,修改acceptCount這個屬性即可。 4.設置網絡超時 為了保證用戶不會因為超時而斷開連接,可以將這個屬性設置長一些,一般connection Timeout="30000"就可以了,其屬性設置過長反而會浪費系統資源,設置為0會造成一定的系統隱患。   如何防止重復提交:(頁面提交速度比較慢時用戶不停提交) 1.token攔截器: 2.post提交方式 3.url後面加一個new Date()或者一個隨機數;     servlet中文亂碼問題的解決方法:(get和post提交方式的處理方式不同) get請求: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request的處理方法 String username = request.getParameter("username"); username = new String(username.getBytes("ISO8859-1"),"UTF-8");   //response的處理方法(兩種方法) response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;utf-8"); //推薦   }   post請求: public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); //response的處理方法 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;utf-8");//推薦   }     以後寫form表單等時不要直接寫項目名稱,而用如下方式:
<form aciton="${pageContext.request.contextPath}/LoginServlet" method="post">

<input type="text" name="username"/></br>

<input type="password" nam="password"/></br>

<input type="submit" value="提交"/>

</form>

 

用${pageContext.request.contextPath}來取得項目名稱,以防項目名稱有變。  

1.用eclipse開發時上傳文件的相對路徑問題(害我花了一天時間):request.getSession().getServletContext().getRealPath("\\")+"saveFile\\"


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved