ServletRequest和ServletResponse真實的類型是HttpServletRequst和HttpServletResponse,可將ServletRequest類型對象強制轉化成HttpServletRequest類型。
HttpServletRequest
- String getParameter(String name):獲取指定參數值。
實例
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
res.getWriter().print("hello!你的用戶名爲:"+username+",您的密碼爲:"+password);
}
web.xml配置
<servlet>
<servlet-name>BServlet</servlet-name>
<servlet-class>cn.my.servlet.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BServlet</servlet-name>
<url-pattern>/b_servlet</url-pattern>
</servlet-mapping>
結果
GenericServlet
是Servlet接口的 實現類,我們可以繼承GenericServlet來編寫自己的Servlet。
- 直接使用this.getInitParameter()方法,來獲取初始化參數。
- 直接使用this.getServletContext(),來獲取ServletContext對象。
- 要求:如果需要做初始化參數,不能再去覆蓋init(ServletConfig),而是去覆蓋GenericServlet直接提交的init()。
class MyGenericServlet extends GenericServlet{
public void service(ServletRequest request , ServletResponse response){
String p1=this.getInitParameter("p1");
//這個方法是GenericServlet自己提供的,他不是Servlet的生命週期方法。
//因爲在GenericServlet的init(ServletConfig)方法會調用init()方法。
//默認init()方法是沒有內容的。
public void init(){
System.out.println("servlet出生了");
}
}
實例
/**
* 如果希望添加初始化操作,那麼不要去覆蓋init(ServletConfig)方法,而是去覆蓋init()方法
* init()方法是GenericServlet提供的,他不是生命週期方法,它會被生命週期方法調用。
* @author green
*
*/
public class MyGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
String pp1=this.getInitParameter("pp1");//得到pp1的值
PrintWriter out=res.getWriter();
out.print(pp1);
}
}
web.xml配置
<servlet>
<servlet-name>MyGenericServlet</servlet-name>
<servlet-class>cn.my.servlet.MyGenericServlet</servlet-class>
<init-param>
<!--參數-->
<param-name>pp1</param-name>
<param-value>vv1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyGenericServlet</servlet-name>
<url-pattern>/generic_servlet</url-pattern>
</servlet-mapping>
HttpServlet
它是GenericServlet得到子類。
它是專注與HTTP請求的Servlet(我們這都是HTTP請求)。
在HttpServlet中只需要覆蓋doGet()或doPost()即可,不能再覆蓋service()方法。
public void servlet(ServletRequest request , ServletResponse response) {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
service(req,res);
}
public service(HttpServletRequest,HttpServletRespose response){
String method=request.getMethod();//獲取當前的請求方式,可能是GET也可能是POST
if(method.equals("GET"))
doGet(request,response);
else if(method.equals("POST"))
doPost(request,response);
}
public void doGet(ServletRequest request , ServletResponse response){
//向客戶端響應405狀態碼
}
public void doPost(ServletRequest request , ServletResponse response){
//向客戶端響應405狀態碼
}
doGet(0和doPost()都不是抽象的,也不是空方法,響應爲405,表示客戶端出錯。不覆蓋方法調用響應爲405.
servlet總結:
1、servlet是單例的
2、servlet是線程不安全的
3、<load-on-startup>
,指定當前servlet在服務器啓動時就創建實例,如果有多個servlet被指定爲服務器啓動即創建實例,那麼這個值就是用來指定創建的順序。
<servlet>
...
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
...
<load-on-startup>1</load-on-startup>
</servlet>
使用<load-on-startup>
的值進行排序,確定進行創建的順序,該值不能爲負。
4、<url-pattern>
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>cn.my.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/a_servlet</url-pattern>
<url-pattern>/b_servlet</url-pattern>
</servlet-mapping>
<!--
http://localhost:8080/day04_2/a_servlet
http://localhost:8080/day04_2/b_servlet
以上兩個都是在訪問AServlet這個類。
-->
<!-- ..........上面換個寫法.................-->
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/a_servlet</url-pattern>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 其中*就是通配符,它匹配所有字母。
http://localhost:8080/day04_2/sdf.do
http://localhost:8080/day04_2/a/b/csds.do-->
<url-pattern>/do/*</url-pattern>
可匹配訪問方式:
http://localhost:8080/day04_2/do/adc<url-pattern>/*</url-pattern>
什麼都匹配
注意:
- 一個類屬性名必須大於等於兩個字符,並且名稱的前兩個字符大小寫必須一致。
“*”
必須是兩頭,要麼是最前面,要麼最後,例如:/*.do,是錯誤的。<url-pattern>
中可以使用通配符開頭,或是“/”開頭。
web.xml文件繼承
完整的javaweb應用中都需要有web.xml。但我們不知道所有的web.xml文件都有一個共同的父文件,他在Tomcat的conf/web.xml路徑。
父web.xml
- 定義了一個defualt的servelt,這個servelt在資源找不到時執行,它會響應404頁面。
- 定義了一個jsp的sehrvlet。
- seddion的超時時間爲30分鐘。
- Mine類型。
- 還定義歡迎頁。index.html,index.htm,index.jsp