後端開發:【JavaWeb開發之Servlet的兩種配置方式】

1、What.

Servlet 爲什麼物?兩種配置方式是什麼?
複製代碼

Servlet狹義指的就是一個叫作「Servlet」的接口,廣義指實現了這個接口的Java程序,運行在服務端,用來處理任何類型的請求、擴展基於HTTP協議的Web服務器。 兩種配置方式爲XML標籤式和註解式。java

2、Why.

編寫Servlet爲何還要配置?
複製代碼

當咱們要開發編寫一個針對請求的處理類,只實現Servlet接口是不行的。就像你造的酒很香,可是客人不知道去哪買同樣。這是你要貼出標語、路標做爲指示說明。相似的,你編寫的「香噴噴」的Servlet實現類,也要配置說明下(「打個廣告」),讓外來的請求可以找到對應的處理類。git

3、How.

兩種方式如何配置?
複製代碼

知識點其實很少,但爲了讓咱們學習知識更有興趣,咱們每練習一個Demo應該給它賦予一個場景需求。 本次Demo練習,咱們用兩種配置方式作一個Servlet相關的查看兌獎號碼的例子。github

(一)XML標籤式配置.

在Servlet 3.0版本以前,Servlet的配置說明只能經過在WEB-INF 目錄下的web.xml文件中添加標籤的形式。web

<web-app>
      <servlet>
        <!--servlet的暱稱、代號,共下文中的引用-->
		<servlet-name>CheckNumber</servlet-name>

        <!--servlet對應的類文件,包名+類名-->
		<servlet-class>com.breaker.servlet.CheckServlet</servlet-class>

        <!--servlet內部的初始化參數,非必需配置-->
		<init-param>
			<param-name>user</param-name>
			<param-value>Breaker93</param-value>
		</init-param>
		<init-param>
			<param-name>my_jianshu_url</param-name>
			<param-value>http://www.jianshu.com/u/187408ee66d4</param-value>
		</init-param>

		<!--通知Servlet容器(「tomcat」)在啓動的時候初始化建立該Servlet的實例,非必需配置 -->
		<load-on-startup>1</load-on-startup>

	</servlet>


	<servlet-mapping>

        <!--爲代號爲「CheckNumber」的Servlet設置瀏覽器訪問地址(要與上文中的Serlet
        的代號名稱一致,不然會找不到的),
        例如http://192.168.0.100:8080/DemoProject/checkNumber -->
		<servlet-name>CheckNumber</servlet-name>

        <!--此處的名稱與servlet-name的值無關,隨便設置的,
                  只爲了瀏覽器中請求方便 -->
		<url-pattern>/checkNumber</url-pattern>

	</servlet-mapping>
</web-app>
複製代碼

此種配置中的Servlet實現類是這樣編寫的:瀏覽器

//HttpServlet繼承了GenericServlet類,GenericServlet繼承了Servlet接口,
//他們都是Servlet API提供,非我的編寫的;因此CheckServlet是間接實現的Servlet接口。
public class CheckServlet extends HttpServlet{
	
    //處理get請求,在此方法內編寫處理邏輯。
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("個人簡書連接:"+getServletConfig().getInitParameter("my_jianshu_url"));
		String[] number=req.getParameterValues("number");
		for(int i=0;i<7;i++){
			System.out.print(number[i]);
		}
		System.out.println("---------");
		String[] awardNum=new String[7];
		Random random=new Random();
		for(int i=0;i<7;i++){			
			awardNum[i] = random.nextInt(10)+"";
			System.out.print(awardNum[i]);
		}
		System.out.println("------");
		
		int count = 0,max = 0,position = 0;
		for(int i= 0;i<awardNum.length;i++){
			if(awardNum[i].equals(number[i])){
				count++;
				if (count>max) {
					position=i;
					max=count;
				}
			}else{
				count=0;
			}
		}
		req.setAttribute("number", number);
		req.setAttribute("awardNum", awardNum);
		req.setAttribute("bool", "");
		req.setAttribute("begin",8 );
		req.setAttribute("end", 8);
		String[] result = {"六等獎","五等獎","四等獎","三等獎","二等獎","一等獎"};
		if(max >1){
			req.setAttribute("bool", true);
			req.setAttribute("result","恭喜你中了" +result[max-2]);
			req.setAttribute("begin", position-max+1);
			req.setAttribute("end", position);
		}
		RequestDispatcher dispatcher = req.getRequestDispatcher("/showResult.jsp"); 
		dispatcher.forward(req, resp); 
	}
	//處理post請求,在此方法內編寫處理邏輯。
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
		System.out.println("doPost() executed");
	}
	
}
複製代碼

Jsp頁面中是這樣請求的Servlet:tomcat

//checkNumber 與<url-pattern>/checkNumber</url-pattern>對應一致才能請求到;
//此種請求等同於action="http://127.0.0.1:8080/DemoProject/checkNumber"
<form  action="checkNumber">
	...
    ...	
</form>
複製代碼

(二)註解式.

在Servlet 3.0版本以後,WEB-INF路徑下的web.xml文件再也不是必需的,但一般仍是建議保留。提供的註解(annotation),使得再也不須要在web.xml文件中進行Servlet的部署描述,簡化開發流程。bash

開發Servlet 3.0的程序須要必定的環境支持。Servlet3是Java EE6規範的一部分,Tomcat須要Tomcat7才支持Java EE6,Tomcat7須要使用JDK6。服務器

直接在Servlet實現類裏配置:app

//HttpServlet繼承了GenericServlet類,GenericServlet繼承了Servlet接口,
//他們都是Servlet API提供,非我的編寫的;因此CheckServlet是間接實現的Servlet接口。

/*@WebServlet將一個繼承於javax.servlet.http.HttpServlet的類定義爲Servlet組件。
*&emsp;  @WebServlet有不少的屬性:
*&emsp;  asyncSupported:   聲明Servlet是否支持異步操做模式。
*&emsp;&emsp;description:&emsp;&emsp;  Servlet的描述。
*&emsp;&emsp;displayName:     Servlet的顯示名稱。
*&emsp;&emsp;initParams:        Servlet的init參數。
*&emsp;&emsp;name:&emsp;&emsp;&emsp;&emsp;    Servlet的名稱。
*&emsp;&emsp;urlPatterns:&emsp;&emsp;  Servlet的訪問URL。
*&emsp;&emsp;value:&emsp;&emsp;&emsp;       Servlet的訪問URL。
*
*&emsp;&emsp;Servlet的訪問URL是Servlet的必選屬性,能夠選擇使用urlPatterns或者value定義。
*   例如:@WebServlet(name="AnnotationServlet",value="/AnnotationServlet")。
*
*&emsp;&emsp;也能夠定義多個URL訪問:
*&emsp;&emsp;如@WebServlet(name="AnnotationServlet",urlPatterns={"/AnnotationServlet","/AnnotationServlet2"})
*&emsp;&emsp;或者@WebServlet(name="AnnotationServlet",value={"/AnnotationServlet","/AnnotationServlet2"})
*/
@WebServlet(name="CheckNumber",urlPatterns={"/checkNumber"},initParams= {@WebInitParam(name = "my_jianshu_url", value = "http://www.jianshu.com/u/187408ee66d4")},loadOnStartup = 1)
public class CheckServlet extends HttpServlet{
	
    //處理get請求,在此方法內編寫處理邏輯。
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("個人簡書連接:"+getServletConfig().getInitParameter("my_jianshu_url"));
		String[] number=req.getParameterValues("number");
		for(int i=0;i<7;i++){
			System.out.print(number[i]);
		}
		System.out.println("---------");
		String[] awardNum=new String[7];
		Random random=new Random();
		for(int i=0;i<7;i++){
			
			awardNum[i] = random.nextInt(10)+"";
			System.out.print(awardNum[i]);
		}
		System.out.println("------");
		
		int count = 0,max = 0,position = 0;
		for(int i= 0;i<awardNum.length;i++){
			if(awardNum[i].equals(number[i])){
				count++;
				if (count>max) {
					position=i;
					max=count;
				}
			}else{
				count=0;
			}
		}
		req.setAttribute("number", number);
		req.setAttribute("awardNum", awardNum);
		req.setAttribute("bool", "");
		req.setAttribute("begin",8 );
		req.setAttribute("end", 8);
		String[] result = {"六等獎","五等獎","四等獎","三等獎","二等獎","一等獎"};
		if(max >1){
			req.setAttribute("bool", true);
			req.setAttribute("result","恭喜你中了" +result[max-2]);
			req.setAttribute("begin", position-max+1);
			req.setAttribute("end", position);
		}
		RequestDispatcher dispatcher = req.getRequestDispatcher("/showResult.jsp"); 
		dispatcher.forward(req, resp); 
	}
	//處理post請求,在此方法內編寫處理邏輯。
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
		System.out.println("doPost() executed");
	}
	
}
複製代碼

4、Summary.

  • 兩種配置方式不要混用,避免出現同時配置@WebServlet註解標記和web.xml中等標籤的現象。
  • 兩種配置方式比較: XML配置形式,在須要修改Servlet的配置信息(好比初始化參數的值)時,只需在服務器訪問目錄直接修改web.xml文件而不須要修改java文件而後再從新編譯成class文件; 可是當web.xml文件中出現大量的Servlet配置時,就會顯得冗雜,而註解方式讓配置更方便、簡練。

本節Demo源碼GitHub下載: https://github.com/Breaker-93/Demo0923breaker_Servlet.git 如有疑問、請留言。dom

相關文章
相關標籤/搜索