java學習筆記:tomcat,servlet,http

java學習筆記:tomcat,servlet,http

 

Tomcat服務器&servlet入門程序
----
一、tomcat服務器
1.B/S 和C/S交互模型相同點和不同點:
相同點:
1_都是基於請求-響應交互模型,即:
瀏覽器(客戶端) 向 服務器發送 一個 請求。
服務器 向 瀏覽器(客戶端)回送 一個 響應 。
2_必須先有請求 再有響應
3_請求和響應成對出現
不同點:
1_實現C/S模型需要用戶在自己的操作系統安裝各種客戶端軟件(百度網盤、騰訊QQ等);實現B/S模型,只需要用戶在操作系統中安裝瀏覽器即可。
注:B/S模型可以理解爲一種特殊C/S模型。

2.tomcat官網:http://tomcat.apache.org
查看本地端口使用情況:netstat -nao

3.在IntelliJ IDEA的工程中配置tomcat服務器
1_新建一個web工程
2_Run-->Edit Configurations-->+-->Tomcat Server-->Local
3_Name: tomcat8; 在Server標籤頁點擊"Configure",選本機上tomcat所在的路徑。
4_再點擊"Configure",將name改成tomcat8。

4.創建web項目
1_File-->New-->Project,在彈出的新窗口中,選Java Enterprise, Java EE version選Java EE 5, 在Additional Libraries and Frameworks裏勾選Web Application, Versions選2.5。點擊Next按鈕,給module name一個名字即可,如day02。
2_選中項目名(如day02),Run-->Edit Configurations,在彈出的新窗口中,切換到Deployment標籤頁,點擊+,選中這個day02,Application context選好目錄。

二、Servlet
1.Servlet 運行在服務端的Java小程序,是sun公司提供一套規範,用來處理客戶端請求、響應給瀏覽器的動態資源。
但servlet的實質就是java代碼,通過java的API動態的向客戶端輸出內容

2.查閱JavaEE手冊(幫助文檔)閱讀Servlet規範:
javax.servlet
根據文檔總結,書寫servlet一個三個步驟:
1)創建一個class實現servlet接口
2)重寫service方法
3)創建的類必須在web.xml文件中做配置
爲什麼要做配置?
答:必須將請求路徑和java程序的對應關係建立起來。

3.servlet與普通的java程序的區別
1_必須實現servlet接口
2_必須在servlet容器(服務器)中運行
3_servlet程序可以接收用戶請求參數以及向瀏覽器輸出數據

4.代碼實現servlet的步驟
1_在工程下創建cn.itcast.web包,在包下創建一個類實現 Servlet接口
2_實現service方法
3_在web.xml中配置書寫好的servlet

5.servlet2.5代碼實現
//file name: DemoServlet.java
package cn.itcast.web;

import javax.servlet.*;
import java.io.IOException;

public class DemoServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {}

    @Override
    public ServletConfig getServletConfig(){
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("第一個servlet程序");
    }

    @Override
    public String getServletInfo(){
        return null;
    }

    @Override
    public void destroy(){}
}

//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>cn.itcast.web.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
</web-app>


6.Servlet3.0實現Hello world例子
(1)Servlet2.5與Servlet3.0的區別
Servlet3.0相較於Servlet2.5:
新增了一些註解,簡化的javaweb代碼開發,可以省略web.xml配置文件 支持異步處理(多線程技術) 支持可
插性特性(書寫的代碼編譯後生成的class文件可以直接部署到其他項目的,自動加載執行)

(2)代碼實現Servlet3.0步驟(註解配置servlet演示)
1_創建JavaEE6(含6)以上的工程
2_創建servlet,在@WebServlet註解中添加urlPatterns = "/hello",作爲請求路徑

(3)註解開發servlet代碼演示
1_創建JavaEE6(含6)以上的工程:New-->Project-->Java Enterprise,選Java EE 6,勾選Web Application, Versions選3.0,不勾選Create web.xml
代碼:
//file name: HelloServlet.java
package cn.itcast.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

//name = "HelloServlet": servlet名稱,相當於web.xml的<servlet-name>
//urlPatterns = "/hello": servlet的訪問路徑,相當於<url-pattern>
@WebServlet(name = "HelloServlet", urlPatterns = "/hello")
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {}

    @Override
    public ServletConfig getServletConfig(){
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("HelloServlet執行...");
    }

    @Override
    public String getServletInfo(){
        return null;
    }

    @Override
    public void destroy(){}
}


三、Servlet的體系結構
1.Servlet的體系結構概述
javax.servlet
Interface Servlet//定義所有servlet都必須實現的方法。
要實現此接口,可以編寫一個擴展javax.servlet.GenericServlet的一般servlet或者編寫一個擴展javax.servlet.http.HttpServlet的HTTP servlet.

問題一、可以直接實現接口創建servlet,爲什麼官方建議繼承GenericServlet?
答:GenericServlet類本已經實現接口的部分方法。程序員只需要關注service方法的開發。

問題二、官方文檔建議可以繼承的servlet有兩個。那麼,選擇哪一個更好呢?
答:在GenericServlet描述中,如果處理http相關請求和響應,選擇使用httpservlet.

由上圖可知在servlet接口規範下,官方推薦使用繼承的方式,繼承GenericServlet 或者HttpServlet來實現接口,
那麼我們接下來再去查看一下這兩個類的API:
閱讀上圖API可知,GenericServlet 是一個類,它簡化了servlet的開發,已經提供好了一些servlet接口所需的方
法,我們開發者只需要重寫service方法即可

2.使用GenericServlet 創建servlet:
1_創建一個類
2_繼承GenericServlet
3_重寫service方法
代碼:
package cn.itcast.web;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(name = "GenericDemoServlet", urlPatterns = "/generic")
public class GenericDemoServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("GenericDemoServlet執行...");
    }
}

雖然,GenericServlet已經簡化了servlet開發,但是我們平時開發程序需要按照一種互聯網傳輸數據的協議來開發
程序——http協議,因此,sun公司又專門提供了HttpServlet,來適配這種協議下的開發。
HttpServlet:是一個類實現了servlet接口。如果你需要書寫java小程序,可以繼承這個類。書寫小程序必須重寫方法doGet和doPost.
閱讀上圖的API可知,繼承HttpServlet,我們需要重寫doGet、doPost等方法中一個即可,根據Http不同的請求,
我們需要實現相應的方法。

3.我們來使用HttpServlet創建servlet:
1_創建一個類
2_繼承HttpServlet
3_重寫doGet方法
代碼:
//file name: HttpDemoServlet.java
package cn.itcast.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "HttpDemoServlet", urlPatterns = "/http")
public class HttpDemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        System.out.println("HttpDemoServlet執行...");
    }
}


通過以上兩個API閱讀,同學們注意一個細節HttpServlet是GenericServlet的子類,它增強了GenericServlet一些
功能,因此,在後期使用的時候,我們都是選擇繼承HttpServlet來開發servlet程序。
雖然目前開發servlet的選擇繼承類,已經確定,但是另一個問題一直還在我們頭腦中,那就是我們學的這些瀏覽
器、服務器、servlet等,到底是如何運行的?
那麼接下來,我們來看看servlet的運行原理。
通過上述流程圖我們重點需要掌握如下幾個點:
1_Servlet對象是由服務器創建
2_request與response對象也是由tomcat服務器創建
3_request對象封裝了瀏覽器過來的所有請求信息,response對象代表了服務器的響應信息。

四、Servlet生命週期
1.使用步驟
1_創建LifeCircleServlet初始化
2_複寫init、service、destroy方法
3_訪問servlet測試初始化LifeCircleServlet
4_關閉服務器測試銷燬LifeCircleServlet
演示代碼:
package cn.itcast.web;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

@WebServlet(name = "LifeCircleServlet", urlPatterns = "/life")
public class LifeCircleServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("LifeCircleServlet初始化……");
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("LifeCircleServlet執行……");
    }

    @Override
    public void destroy(){
        super.destroy();
        System.out.println("LifeCircleServlet銷燬……");
    }
}


====
HTTP
----
區分:GET/POST向服務器發起請求區別? 安全,數據量大小,傳輸數據方式
1_GET不安全 POST安全
2_由於GET方式受瀏覽器地址欄約束,所以傳輸的數據量比POST少.
  PS:協議本身沒有約束GET比POST少
3_數據向服務端傳輸的位置不同
GET包含在請求行的請求路徑之後傳遞到服務端    
www.ab.com?name=tom&age=18&sex=nan
  POST方式包含在請求體發送到服務端了
name=tom&age=18&sex=nan
PS(只有通過POST請求向服務端通過表單傳遞數據的時候纔有請求體)

請求體作用:存放客戶端向服務端傳遞的數據
username=tom&userage=18&password=1234


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章