JavaWeb基礎(chǔ)之Servlet

B/S 架構(gòu):瀏覽器 / 服務(wù)器 耗啦。
C/S 架構(gòu):客戶端 / 服務(wù)器 哈打。

  • 修改Tomcat域名:
    • 第一步:可以通過修改Tomcat文件下的conf/server.xml文件斑粱,找到<Host>氧吐,里面有name屬性褪秀,可以自定義去修改空猜,如www.cwx.com,不要去修改<Engine>里的localhost绽慈,這是引擎不能亂動恨旱!
    • 第二步:在C盤下的windows/system32/drivers/etc/hosts文件下,添加127.0.0.1 www.cwx.com坝疼,保存后即可通過訪問http://www.cwx.com8080訪問Tomcat主頁面搜贤。

網(wǎng)站是如何訪問的?

  • 第一步:輸入一個域名钝凶,回車仪芒。
  • 第二步:檢查本機的C:\Windows\System32\drivers\etc\hosts文件中是否有這個域名映射。
    • 如果有:直接返回對應(yīng)的IP地址耕陷,這個地址中有我們需要訪問的web程序
    • 如果沒有:則會去DNS服務(wù)器里面去找掂名,找到的話就返回,找不到就返回找不到該網(wǎng)頁哟沫。

Tips:DNS服務(wù)器是全球范圍內(nèi)的域名管理服務(wù)器饺蔑。

  • http默認端口:80,https(安全的)默認端口:443
  • http1.0:客戶端可以與web服務(wù)器連接后南用,只能獲得一個web資源膀钠,在斷開連接。
  • http1.1:客戶端可以與服務(wù)器連接后裹虫,可以獲得多個web資源肿嘲。
  • 狀態(tài)碼:
    • 200:請求響應(yīng)成功。
    • 3xx:請求重定向(讓用戶重新定位到自己設(shè)置的地址)筑公。
    • 404:找不到網(wǎng)頁雳窟,403:被禁止。
    • 5xx:服務(wù)器代碼錯誤匣屡,502:網(wǎng)關(guān)錯誤封救。

Maven的核心思想:約定大于配置(有約束,不要去違反)

Servlet

  • 簡介:servlet是sun公司提供開發(fā)動態(tài)web的一門技術(shù)捣作。
  • Sun在這些API中提供了一個接口servlet誉结,想要開發(fā)一個Servlet程序,只需要完成兩個步驟:
    • 編寫一個類券躁,實現(xiàn)servlet接口
    • 把開發(fā)好的Java類部署到web服務(wù)器中
  • Sun公司提供了兩個默認的實現(xiàn)了servlet接口的類:HttpServlet惩坑,GenericServlet,我們可以直接繼承這個HttpServlet類也拜。要實現(xiàn)doGet()和doPost()方法以舒,兩方法之間可以互相調(diào)用,只是請求方式不一樣慢哈,業(yè)務(wù)邏輯是一樣的蔓钟。
  • 編寫Servlet的映射(在web.xml中)
    • 為什么需要映射:我們寫的是java程序,但是要通過瀏覽器訪問卵贱,而瀏覽器需要連接web服務(wù)器滥沫,所以我們需要在web服務(wù)器中注冊我們寫的Servlet侣集,還需要給他一個訪問路徑。
    <!-- 注冊servlet-->
    <servlet>
    <servlet-name>hello(要與下面的name一致才能被找到)</servlet-name>
    <servlet-class></servlet-class>
    </servlet>
    <!--Servlet的請求路徑-->
    <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern><!--這是請求的路徑兰绣,訪問該路徑才能實現(xiàn)自己寫的Servlet的功能-->
    </servlet-mapping>
    

Tips:這里寫路徑可以用*通配符肚吏,但是它前面不能加任何東西。只能寫*hello,不能寫成hello*狭魂。

Servlet原理

  • 流程:首先瀏覽器發(fā)送http請求,到web容器(相當于Tomcat服務(wù)器)中党觅,此時web容器會產(chǎn)生兩個對象request雌澄、response,這兩個對象會調(diào)用service(ServletRequest rq,ServletResponse rp)方法杯瞻,request會從service方法中拿到請求并把請求之后的響應(yīng)傳給response镐牺,web容器就會讀取響應(yīng)信息,讀到后就將信息響應(yīng)到瀏覽器魁莉。

ServletContext

web容器在啟動的時候睬涧,它會為每一個web程序都創(chuàng)建一個對應(yīng)的ServletContext對象,這個對象就代表了每個web應(yīng)用旗唁。這樣有什么作用畦浓?

  • 共享數(shù)據(jù)(不常用這種方法,經(jīng)常使用session等其他方式實現(xiàn)):我們在這個Servlet中保存的數(shù)據(jù)检疫,可以在另外一個Servlet中拿到(相當于每個web應(yīng)用都有一個小的ServletContext讶请,但是還有一個全局的ServletContext,這里面包含所有的數(shù)據(jù))屎媳。
public class helloServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletResponse resp,HttpServletRequest req ) throws  servletException, IOException {

      ServletContext context = this.getServletContext();
      String name = "cwx";
      context.setAttribute("name",name);//數(shù)據(jù)保存在ServletContext中夺溢,名字為name,值為cwx
  }

  @Override
  protected void doGet(HttpServletResponse resp,HttpServletRequest req ) throws  servletException, IOException {
      doGet(resp,req);
  }
}

讀取的方法操作這個類似烛谊,在另一個servlet中調(diào)用context.getAttribute("設(shè)置的名稱")

  • 獲取初始化參數(shù)(很少用
<!--配置一些web應(yīng)用初始化參數(shù)-->
<context-param>
<param-name>url</param-name>
<param-value>這是初始化的參數(shù)</param-value>
</context-param>
   protected void doGet(HttpServletResponse resp,HttpServletRequest req )  {

        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }
  • 請求轉(zhuǎn)發(fā)(一般我們會使用request方法轉(zhuǎn)發(fā)风响,而不用context.getRequestDispatcher("/xxx").forward(resp,req)方法,這里作為了解)丹禀。

Tips:轉(zhuǎn)發(fā)只是頁面變成了我們想要轉(zhuǎn)發(fā)的頁面状勤,URL地址不會變,重定向則會改變URL湃崩。

轉(zhuǎn)發(fā)和重定向的區(qū)別:例如荧降,A想獲得C的資源,但是A不能直接訪問到C攒读,這時A通知B自己的請求朵诫,B再獲得C資源,再給A薄扁,A只和B發(fā)生了交流這是轉(zhuǎn)發(fā)剪返。重定向是A要獲得C資源废累,先向B請求,B再通知A到C里拿資源脱盲,A和B和C都發(fā)生了交流邑滨,這是重定向。

  • 讀取資源文件
    • Properties文件
    • 在java目錄下新建properties(需要在pom文件<build>中設(shè)置掃描的路徑)
    • 在resources目錄下新建properties(不需要在<bulid>中設(shè)置钱反,默認有的)

發(fā)現(xiàn):這些properties文件都被打包到了同一個路徑下:classes掖看,我們俗稱這個路徑為classpath(類路徑);

  //例子: 通過ServletContext獲得properties資源文件
  protected void doGet(HttpServletResponse resp,HttpServletRequest req )  {

        ServletContext context = this.getServletContext();
        InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties")//將文件變成流面哥,想要獲得文件就必須通過流來連接
        Properties propertie = new Properties();
        propertie.load(in);
        ptopertie.getProperty("name");//獲得文件里name的值
    }

中文亂碼的問題

  • 后臺寫的數(shù)據(jù)有中文哎壳,傳到頁面上出現(xiàn)亂碼
    //這里是在實現(xiàn)Servlet類的類中寫的,主要是記住哪兩個方法
    response.setContextType("text/html");
    response.setCharacterEncoding("utf-8");
    
  • 請求的數(shù)據(jù)中有中文尚卫,傳到后臺出現(xiàn)亂碼
    request.setCharacterEncoding("utf-8");
    

HttpServletResponse(響應(yīng))

  • 下載文件:
    1.獲取文件下載的路徑 归榕,下載的文件名是啥?
    2.讓瀏覽器支持下載我們的文件
    3.獲取下載文件的輸入流
    4.創(chuàng)Buffer建緩沖區(qū)吱涉,獲取OutputStream對象
    5.將FileOutputStream流寫入到buffer緩沖區(qū)
    6.使用OutputStream將緩沖區(qū)里的數(shù)據(jù)輸出到客戶端
        protected void doGet(HttpServletResponse resp,HttpServletRequest req )throws IOException {
    // 1.獲取文件下載的路徑 刹泄,下載的文件名是啥?
          String realPath = "文件的絕對地址";
          String fileName = realPath.substring(realPath.lastIndexOf("http://") + 1);//獲得文件名怎爵,通過獲得最后一個'/'后面的數(shù)據(jù)作為文件名
    // 2.讓瀏覽器支持下載我們的文件
          resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));//防止中文名出現(xiàn)亂碼
    //  3.獲取下載文件的輸入流
          FileInputStream in = new FileInputStream(realPath);
    //  4.創(chuàng)Buffer建緩沖區(qū)特石,獲取OutputStream對象
          int len=0;
          byte[] buffer = new byte[1024];
    //  5.將FileOutputStream流寫入到buffer緩沖區(qū),使用OutputStream將緩沖區(qū)里的數(shù)據(jù)輸出到客戶端
          ServletOutputStream out = new resp.getOutputStream();
          while ((len=in.read(buffer))!=-1){
              out.write(buffer,0,len);
          }
          in.close();
          out.close();
    
      }
    
  • 驗證碼功能
       protected void doGet(HttpServletResponse resp,HttpServletRequest req   )throws IOException {
    
          resp.setHeader("reflesh","3");//實現(xiàn)三秒刷新一次網(wǎng)頁
          //內(nèi)存中創(chuàng)建一個圖片,長80疙咸,寬20
          BufferImage image = new BufferImage(80,20,BufferImage.TYPE_INT_RBG);
          Graphics2D g = (Graphics2D ) image.getGraphics();//g 就相當于筆县匠,用于畫圖
          //設(shè)置圖片的顏色
          g.setColor(Color.white);
          //填充白色背景顏色
          g.fillRect(0,0,80,20);
          //給圖片寫數(shù)據(jù)
          g.setColor(Color.bule);
          g.setFont(new Font(null,Font.BLOD,20));
          g.draw(makeNum(),0,20);//開始畫數(shù)字
          //告訴瀏覽器用圖片方式打開
          resp.setContentType("image/jpg");
          //網(wǎng)站存在緩存,取消網(wǎng)站的緩存
          resp.setDateHeader("expries",-1);
          resp.setHeader("Cache-Control","no-cache");
          resp.setHeader("Pragma","no-cache");
          //把這個圖片寫入到瀏覽器中
          ImageIO.write(image,"圖片",resp.getOurputStream);
    }
        //生成四位隨機數(shù)方法
      private String makeNum(){
        Random random = new Random();
        String num = random.nextInt("9999")+"";//隨機生成四位數(shù)
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<4-random.length();i++){
              num.append("0");//當位數(shù)不夠使自動將0填滿      
      }
        num= sb.toString()+num;
      return num;
    }
    
  • 實現(xiàn)重定向
    • 常見場景:用戶登錄
    //實現(xiàn)重定向的原理
    /*
       resp.setHeader("Location","/xxx");//設(shè)置重定向的URL地址
       resp.setStatus(302);//設(shè)置重定向的狀態(tài)碼
     */
     resp.sendRedirect("/xxx");    //調(diào)用重定向的方法
    

HttpServletRequest(請求)

  • jsp中利用{pageContext.request.getContextPath()}獲得當前URL地址撒轮,req.getParmeter("名稱")獲得發(fā)送請求的參數(shù)req.getParmeterValues("名稱")獲得多個參數(shù)乞旦。

Cookie、Session

  • Session(會話):用戶打開一個瀏覽器题山,點擊了很多超鏈接兰粉,訪問了多個web資源,關(guān)閉瀏覽器顶瞳,這個過程可稱之為會話玖姑,會話是服務(wù)器技術(shù),數(shù)據(jù)存儲在服務(wù)端慨菱。
    • 服務(wù)器會為每一個用戶(瀏覽器)創(chuàng)建一個Session焰络,只要瀏覽器沒關(guān)Session就存在,例如:用戶登錄某個網(wǎng)站后符喝,不論訪問哪個頁面都會顯示用戶處于登錄狀態(tài)闪彼,說明Session保存了用戶信息。
    • 獲得session:Session session = req.getSession()
    • 添加session:session.setArttribute(name,object)
    • 設(shè)置session的有效時間:在<session-config>中的<session-timeout>設(shè)置(web.xml中)。
    • 銷毀session:session.removeAttribute("name");session.invalidate();
  • Cookie:客戶端技術(shù)畏腕,數(shù)據(jù)只會存儲在客戶端缴川。
  //舉例:在客戶端設(shè)置一個cookie記錄上次訪問網(wǎng)站的時間
  protected void doGet(HttpServletResponse resp,HttpServletRequest req   )throws IOException {
    Cookie[] cookies = req.getCookies();
    if(cookies!=null){
      resp.getWriter().print("你上一次訪問的時間是:");
    for(int i=0; i<cookies.length(); i++){
          Cookie cookie=cookies[i];
    if(cookie.getName().equals("lastLoginTime")){
        long lastLoginTime = long.parseLong(cookie.getValue());
        Date date = new Date(lastLoginTime);
        resp.getWriter().print(date.toLocaleString());//將時間類型轉(zhuǎn)換為字符串類型
          }
       }
     }else
        {
       resp.getWriter().print("這是你第一次訪問該網(wǎng)站!");
        }
      //服務(wù)器給客戶端響應(yīng)一個cookie
    Cookie cookie =new Cookie("lastLoginTime",System.currentTimeMillis()+"")//cookie只能存字符串類型描馅!
    //設(shè)置cookie的一天有效時間
    cookie.setMaxage(24*60*60);
    resp.addCookie(cookie);//response 響應(yīng)給客戶端
}
  • 一個網(wǎng)站cookie是否存在上限把夸?
    1.一個web站點可以給瀏覽器發(fā)送多個cookie,最多存放為20個铭污。
    2.整個瀏覽器最多存放300個cookie
    3.每個cookie限制大小為4kb
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恋日,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘹狞,更是在濱河造成了極大的恐慌谚鄙,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁绒,死亡現(xiàn)場離奇詭異,居然都是意外死亡烤黍,警方通過查閱死者的電腦和手機知市,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來速蕊,“玉大人嫂丙,你說我怎么就攤上這事」嬲埽” “怎么了跟啤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唉锌。 經(jīng)常有香客問我隅肥,道長,這世上最難降的妖魔是什么袄简? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任腥放,我火速辦了婚禮,結(jié)果婚禮上绿语,老公的妹妹穿的比我還像新娘秃症。我一直安慰自己,他們只是感情好吕粹,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布种柑。 她就那樣靜靜地躺著,像睡著了一般匹耕。 火紅的嫁衣襯著肌膚如雪聚请。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天泌神,我揣著相機與錄音良漱,去河邊找鬼舞虱。 笑死,一個胖子當著我的面吹牛母市,可吹牛的內(nèi)容都是我干的矾兜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼患久,長吁一口氣:“原來是場噩夢啊……” “哼椅寺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒋失,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤返帕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篙挽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆萤,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年铣卡,在試婚紗的時候發(fā)現(xiàn)自己被綠了链韭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡煮落,死狀恐怖敞峭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝉仇,我是刑警寧澤旋讹,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站轿衔,受9級特大地震影響沉迹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜害驹,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一胚股、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裙秋,春花似錦琅拌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枷恕,卻和暖如春党晋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工未玻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灾而,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓扳剿,卻偏偏與公主長得像旁趟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庇绽,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容