標籤:
前言
作為一個Java web開發人員,掌握sshi等架構是必要的技能,但是用多了架構也要回過頭來看看最土的,最原始的servlet。畢竟mvc架構(struts1/2,springmvc)都是源於它的。
搭建servlet項目
那麼首先要回憶servlet相關知識,不是去看書,最好最直接的辦法就是直接開啟IDE搭建個簡單的項目。
1.開啟IDE建立個web項目,一般來說只要你的IDE有裝jdk和tomcat就無需引入任何jar包了(不準備涉及任何資料庫操作)。
2.在WEB-INF下建立web.xml檔案,先把schema寫好,不知道怎麼寫直接網上複製一下。
3.開始寫servlet,具體來說就是寫個自己的XXServlet extends HttpServlet,並override兩個必要的方法doGet和doPost就可以了,有心的同學可以把service、destroy、init方法都簡單的實現下,最好在console列印下以便瞭解這些方法的執行順序。
4.寫好servlet後,要到剛才的web.xml中配置一下,也就是servlet+servlet-mapping,這步有個稍微要注意的就是servlet-mapping中的url-pattern,要知道什麼模式比對什麼樣的url。大概有三種:
①
完全符合,不解釋如:"/test/list.do"。
②
目錄匹配:也就是以*結尾的如:"/"或者"/*"或者"/test/*"。
③
擴充匹配:以*開頭的如:"*.do"。
還有一個要注意的就是load-on-startup這個值一般可以不寫,不寫的話,tomcat會在使用到的時候才去執行個體化,而寫一個大於0的數的話就會在tomcat啟動的時候就執行個體話,所以一般來說只有在tomcat啟動時候需要使用的servlet才寫,比如web.xml中預設配置的org.apache.catalina.servlets.DefaultServlet和org.apache.jasper.servlet.JspServlet這兩個servlet就是分別是1和3。
這種配置的麻煩在於每寫一個servlet就要來這邊配置一次,很是繁瑣。
5.開始寫jsp檔案,這裡一直有個糾結的地方,就是jsp檔案是放在webRoot下還是放在WEB-INF下面,其實,這是沒有規定的,放在WEB-INF下面比較安全,直接全路徑訪問是會報404錯誤的,放在WebRoot下面比較方便,安全方面就用filter去配置許可權。寫jsp的時候一般都知道要在頭部加上一句
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
這句話的意思就是當前頁面的上下文類型以及編碼格式,並且支援java。其他的和html就差不多了。
6.這幾步弄好就可以啟動項目了,相當簡單吧。
servlet和jsp的跳轉
一、從Jsp發送請求到servlet(比如request.getContextPath()值是/appname)
①、全路徑訪問,如:/appname/index.jsp
二、從servlet跳轉Jsp
①、request.getRequestDispatch("index.jsp").forword(req, res);//相對路徑
②、response.sendRedirect(requst.getContextPath() + "/index.jsp");//絕對路徑
參數傳遞以及EL運算式
一、jsp傳遞到servlet
①、url傳遞,如list.do?limit=10,servlet中通過request.getParamter("limit")擷取
②、form傳遞,servlet中也是通過request.getParamter("xx")擷取
二、servlet傳遞到jsp
①、request.setAttribute()
②、session.setAttribute()
三、jsp接收參數
①、<%= session.getAttribute()%>或<%= request.getAttribute()%>
②、EL運算式:如${info}。它會依次到page、request、session、application中尋找,找到則返回,找不回返回null。 <%@ page isELIgnored="true" %>可以啟用禁用el運算式,且預設是啟用的。
深入servlet和安全執行緒
servlet是單例多線程的,意思就是初始化(init:可以傳入ServletConfig對象,然後用getInitParamter擷取)一次之後,後面如果要使用它的服務(service),tomcat就會找到它來用而不會建立一個。那麼這就要求我們在實現servlet的時候注意安全執行緒的問題。當tomcat要銷毀(destroy)它的時候,注意在destroy裡釋放用到資源。
下面主要來說說怎麼保證servlet的安全執行緒。
①、首先一點init是tomcat執行的,它是單線程的,所以是安全執行緒的,所以只要考慮的是service();
②、service方法中如果只涉及到本地變數(也就是局部變數和參數),那麼就是安全執行緒的,為什麼這麼說:jvm的每個線程每執行一個方法就為該方法建立一個棧幀並壓入棧中,也就是說棧幀內的本地變數不是線程共用的,所以說安全執行緒。
③、如果service方法訪問(這裡的訪問是指有讀又有寫,如果只是僅僅讀了那麼完全不需要擔心安全執行緒問題)了這三種:servlet的成員變數、全域靜態變數、全域靜態資源(系統檔案之類的)等,就需要加上同步控制語句了(這裡不展開了。。。其實我自己也沒用過。。逃)。
④、destroy和init一樣,是單線程的,在伺服器重啟的時候或者長時間不用的時候,都會被銷毀。
<Java> 都快被忘掉的servlet