Java Web 從入門(mén)到"改行"(2)--Servlet簡(jiǎn)介

1.Servlet 簡(jiǎn)介:

JavaWeb應(yīng)用開(kāi)發(fā)的核心技術(shù)就是JSP涵但、Servlet與JavaBean。Servlet 作為 Java Web 應(yīng)用開(kāi)發(fā)的核心技術(shù)之一柄延,JSP 以及其他很多優(yōu)秀的Web框架【Struts2】都是基于 Servlet 實(shí)現(xiàn)的肃廓。

Servlet 的幾個(gè)特點(diǎn):

  • 1.Servlet(Java服務(wù)器端小程序,下面編寫(xiě)的MyServlet.java就是一個(gè)典型的Servlet)是用 Java 編寫(xiě)的平臺(tái)無(wú)關(guān)的服務(wù)器端小程序陈哑,運(yùn)行在 Servlet 的容器(如Tomact)中妻坝,其生命周期由容器管理伸眶。
  • 2.在Web開(kāi)發(fā)中經(jīng)常用到Servlet的抽象類HttpServlet,該抽象類的兩個(gè)對(duì)象HttpServletRequest刽宪、HttpServletResponse 與客戶進(jìn)行交互厘贼。
  • 3.Servlet經(jīng)常用作控制器,根據(jù)不同的請(qǐng)求圣拄,將處理的結(jié)果轉(zhuǎn)發(fā)給其它的組建嘴秸。
  • 4.自己編寫(xiě)的Servlet需要在web.xml中進(jìn)行配置。

1.1 Servlet的請(qǐng)求響應(yīng)時(shí)序:

當(dāng)Servlet被封裝到容器之后庇谆,首先調(diào)用 init() 方法進(jìn)行初始化岳掐,初始化后,調(diào)用service() 方法處理用戶的請(qǐng)求饭耳,并將處理的結(jié)果封裝到HttpServletResponse中返回給客戶串述,當(dāng)Servlet實(shí)例從容器中移除時(shí)調(diào)用destory() 。

Servlet請(qǐng)求響應(yīng)時(shí)序圖

1.2 Servlet的抽象類HttpServlet:

HttpServlet是Servlet的抽象類寞肖,HttpServlet 通過(guò)**HttpServletRequest纲酗、HttpServletResponse **兩個(gè)對(duì)象與客戶進(jìn)行交互。其中HttpServletRequest對(duì)象負(fù)責(zé)封裝存放Http請(qǐng)求的信息新蟆,HttpServletResponse對(duì)象負(fù)責(zé)封裝存放處理得到的響應(yīng)結(jié)果觅赊。
另外,Servlet容器啟動(dòng)加載Web應(yīng)用時(shí)琼稻,會(huì)為每個(gè)Web容器創(chuàng)建一個(gè)ServletContext對(duì)象茉兰,用于存放整個(gè)Web應(yīng)用的共享數(shù)據(jù),因此欣簇,我們可以把ServletContext對(duì)象看成Web應(yīng)用的共享內(nèi)存规脸。

1.HttpServletRequest 對(duì)象的常用方法:

  • getParameter("參數(shù)name值"): 獲取Http請(qǐng)求中的指定參數(shù)值。
  • setCharacter("utf-8"): 設(shè)置Http請(qǐng)求的編碼方式熊咽。
  • get Cookies(): 獲取Http請(qǐng)求的cookies值莫鸭。

其它更詳細(xì)的方法自己查唄

2.HttpServletResponse 對(duì)象的常用方法:

  • getWriter(): 返回一個(gè)PrintWriter對(duì)象。
  • setContentType("text/html"): 設(shè)置Http響應(yīng)的文本格式横殴。
  • setCharacterEncoding("utf-8"): 設(shè)置Http響應(yīng)頭的編碼方式被因。

其它更詳細(xì)的方法自己查唄

3.ServletContext對(duì)象的常用方法:

  • setAttribute(String arg0, Object arg1): 把對(duì)象和一個(gè)屬性進(jìn)行綁定,將這個(gè)對(duì)象存儲(chǔ)在ServletContext中
  • getAttribute(String arg0): 根據(jù)給定的屬性名返回所綁定的對(duì)象衫仑。

其它更詳細(xì)的方法自己查唄

1.3 創(chuàng)建一個(gè)HttpServlet實(shí)例:

在Java Web應(yīng)用開(kāi)發(fā)中梨与,創(chuàng)建一個(gè)HttpServlet一般遵循以下的步驟:

1.創(chuàng)建自己的Java類并繼承HttpServlet。
2.在Java類中重載HttpServlet的doGet文狱、doPost方法粥鞋。
3.編寫(xiě)表現(xiàn)層的JSP文件,并配置form表單中的 action=" " 瞄崇。
4.在WEB-INF中創(chuàng)建web.xml呻粹,并配置servlet壕曼。
5.啟動(dòng)Servlet容器,并生成Http請(qǐng)求進(jìn)行測(cè)試等浊。
6.獲取Http請(qǐng)求信息腮郊,進(jìn)行業(yè)務(wù)邏輯處理。
7.生成Http響應(yīng)結(jié)果筹燕,以流的形式輸出到客戶端瀏覽器或磁盤(pán)文件轧飞。

在Eclipse中的總體文件結(jié)構(gòu):

具體的代碼:
1.視圖層:index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <FORM name="form1" action="login" method="POST">
        請(qǐng)輸入姓名:
        <INPUT name="name" type="text">
        <INPUT name="submit" value="提交" type="submit">
    </FORM>
</body>
</html>

2.典型的Servlet:MyServlet.java

package ServletTest;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public MyServlet(){  //構(gòu)造函數(shù)
        super();
    }
    public void destroy(){//銷毀時(shí)調(diào)用
        super.destroy();
        System.out.println("destory()執(zhí)行了");
    }
    //處理Get方式提交過(guò)來(lái)的數(shù)據(jù)表單
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException,IOException{
        doPost(request,response);//直接調(diào)用doPost方法
    }
    //處理Post方式提交的數(shù)據(jù)表單
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException,IOException{
        response.setContentType("text/html");    //設(shè)置Http響應(yīng)的文檔類型
        response.setCharacterEncoding("UTF-8");   //設(shè)置響應(yīng)采用的編碼方式
        String name = request.getParameter("name");   //獲取提交的表單中name文本框值
        name = new String(name.getBytes("ISO-8859-1"),"utf-8");//將字符編碼轉(zhuǎn)換為utf-8
        PrintWriter out = response.getWriter();  //等到一個(gè)PrintWrite對(duì)象
        ServletContext context = getServletContext();   //得到整個(gè)Web的ServletContext對(duì)象
        int count =1;
        if(context.getAttribute("count")==null)   //如果是第一位訪問(wèn)者
        {
            context.setAttribute("count",new Integer(count));//設(shè)置計(jì)數(shù)器的初始值
            
        }else{
            count= Integer.parseInt(context.getAttribute("count").toString());//獲取當(dāng)前的count值
            count++;
            context.setAttribute("count",new Integer(count));//更新計(jì)數(shù)器的值
        }
        out.println(name+",你好硬萍!你是第"+count+"位訪問(wèn)者");
        out.flush();//強(qiáng)制性將當(dāng)前緩存中的內(nèi)容輸出
        out.close();//關(guān)閉輸出流耘子,清除當(dāng)前所有內(nèi)容
        
    }
    //本Servlet裝配到容器后自動(dòng)執(zhí)行初始化方法
    public void init() throws ServletException{
        System.out.println("init()執(zhí)行了");
    }

}


3.web.xml配置文件內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>ServletTest.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

運(yùn)行之后的結(jié)果:

2.預(yù)告

Servlet這一部分就寫(xiě)到這里,接下來(lái)會(huì)寫(xiě)有關(guān)SSH的部分卧斟,因?yàn)橄乱粋€(gè)Java Web項(xiàng)目的要用到SSH糠涛,就當(dāng)是跟大家一起復(fù)習(xí)一下吧援奢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忍捡,隨后出現(xiàn)的幾起案子集漾,更是在濱河造成了極大的恐慌,老刑警劉巖砸脊,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件具篇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凌埂,警方通過(guò)查閱死者的電腦和手機(jī)驱显,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞳抓,“玉大人埃疫,你說(shuō)我怎么就攤上這事『⒀疲” “怎么了栓霜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)横蜒。 經(jīng)常有香客問(wèn)我胳蛮,道長(zhǎng),這世上最難降的妖魔是什么丛晌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任仅炊,我火速辦了婚禮,結(jié)果婚禮上澎蛛,老公的妹妹穿的比我還像新娘抚垄。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布督勺。 她就那樣靜靜地躺著渠羞,像睡著了一般斤贰。 火紅的嫁衣襯著肌膚如雪智哀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天荧恍,我揣著相機(jī)與錄音瓷叫,去河邊找鬼。 笑死送巡,一個(gè)胖子當(dāng)著我的面吹牛摹菠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骗爆,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼次氨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了摘投?” 一聲冷哼從身側(cè)響起煮寡,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犀呼,沒(méi)想到半個(gè)月后幸撕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡外臂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年坐儿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宋光。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡貌矿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罪佳,到底是詐尸還是另有隱情逛漫,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布菇民,位于F島的核電站尽楔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏第练。R本人自食惡果不足惜阔馋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娇掏。 院中可真熱鬧呕寝,春花似錦、人聲如沸婴梧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至孽江,卻和暖如春讶坯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岗屏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工辆琅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人这刷。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓婉烟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暇屋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子似袁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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