欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Servlet從入門到精通(超級詳細!)

 更新時間:2022年03月31日 09:50:12   作者:cgblpx皮皮霞  
在JavaWeb項目中,處理請求和發(fā)送響應的過程是由一種叫做Servlet 的程序來完成的,并且 Servlet 是為了解決實現(xiàn)動態(tài)頁面而衍生的東西,下面這篇文章主要給大家介紹了關于Servlet從入門到精通的相關資料,需要的朋友可以參考下

概述

Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立于平臺和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成 動態(tài)Web內(nèi)容。這個過程為:

1,客戶端發(fā)送請求至服務器端

2,服務器將請求信息發(fā)送至 Servlet

3,Servlet 生成響應內(nèi)容并將其傳給服務器。響應內(nèi)容動態(tài)生成,通常取決于客戶端的請求

4,服務器將響應返回給客戶端

Servlet 看起來像是通常的 Java 程序。Servlet 需要導入特定的屬于 Java Servlet API 的包。

Servlet有三種實現(xiàn)方式:實現(xiàn)Servlet接口, 繼承抽象類GenericServlet, 繼承HttpServlet

入門案例

創(chuàng)建Servlet程序

選中src-右鍵-New-Create New Servlet-輸入Servlet類的名字和包名-ok

package cn.tedu.test;
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 = "MyServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向瀏覽器響應指定內(nèi)容
        response.getWriter().write("hello servlet");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);//調(diào)用doPost()
    }
}

注解方式配置Servlet程序

1,直接在Servlet類上加一個注解就可以了

//Servlet程序想要別瀏覽器訪問,使用@WebServlet規(guī)定了瀏覽器的訪問方式
@WebServlet("/hello/Servlet1")

2,打開瀏覽器直接訪問這個Servlet就可以了

http://localhost:8080/hello/Servlet1

配置文件方式配置Servlet程序(提供web.xml)

在Servlet3.0版本中,被@WebServlet注解代替,如:@WebServlet("/myservlet")括號中,就可以規(guī)定訪問方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--這是Servlet程序的核心配置文件,IDEA不會自動幫我們配置,只能自己來配置的,主要是規(guī)定瀏覽器的訪問方式-->
    <servlet>
        <servlet-name>myservlet</servlet-name>
        <!--Servlet類的全路徑-->
        <servlet-class>cn.tedu.test.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <!--規(guī)定了瀏覽器的訪問方式-->
        <url-pattern>/myservlet</url-pattern>
    </servlet-mapping>
</web-app>

測試

你寫個HTML網(wǎng)頁測試也可以的

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form action="http://localhost:8080/cgbservletjava01_war_exploded/a/b/x" method="post">
			<input type="text" name="username">
			<br>
			<input type="submit" value="提交">
		</form>
	</body>
</html>

Servlet的繼承結(jié)構(gòu)

Servlet的生命周期

Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。以下是 Servlet 重要階段遵循的過程:

1,初始化階段 調(diào)用init()方法

2,響應客戶請求階段 調(diào)用service()方法

3,終止階段 調(diào)用destroy()方法

最后,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

init() 方法

init 方法被設計成只調(diào)用一次。它在第一次創(chuàng)建 Servlet 時被調(diào)用,在后續(xù)每次用戶請求時不再調(diào)用。因此,它是用于一次性初始化,Servlet 創(chuàng)建于用戶第一次調(diào)用對應于該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啟動時被加載。
當用戶調(diào)用一個 Servlet 時,就會創(chuàng)建一個 Servlet 實例,每一個用戶請求都會產(chǎn)生一個新的線程,適當?shù)臅r候移交給 doGet 或 doPost 方法。init() 方法簡單地創(chuàng)建或加載一些數(shù)據(jù),這些數(shù)據(jù)將被用于 Servlet 的整個生命周期。

service() 方法

它是Servlet的核心,每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調(diào)用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數(shù)。在HttpServlet中已存在Service()方法。

service() 方法會檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當?shù)臅r候調(diào)用 doGet、doPost、doPut,doDelete 等方法,service() 方法由容器調(diào)用,您只需要根據(jù)來自客戶端的請求類型來重寫 doGet() 或 doPost() 即可。

doGet() 和 doPost() 方法是每次服務請求中最常用的方法。

doGet() 方法

GET 請求來自于一個 URL 的正常請求,或者來自于一個未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。

doPost() 方法

POST 請求來自于一個特別指定了 METHOD 為 POST 的 HTML 表單,它由 doPost() 方法處理。

destroy() 方法

destroy() 方法只會被調(diào)用一次,在 Servlet 生命周期結(jié)束時被調(diào)用。destroy() 方法可以讓您的 Servlet 關閉數(shù)據(jù)庫連接、停止后臺線程、把 Cookie 列表或點擊計數(shù)器寫入到磁盤,并執(zhí)行其他類似的清理活動。在調(diào)用 destroy() 方法之后,servlet 對象被標記為垃圾回收。

Request

概述

Request對象用來解析請求參數(shù),當瀏覽器訪問服務器時,攜帶著一些請求參數(shù),可以通過Servlet提供的Request對象提供的API來解析請求參數(shù)
請求對象有兩個:

ServletRequest
httpServletRequest

常用的方法:

getParameter("參數(shù)名")--根據(jù)參數(shù)名獲取參數(shù)的值
getParameterValues()--獲取到所有參數(shù)的值并存入數(shù)組
setCharacterEncoding()--設置請求的字符編碼方式
getCharacterEncoding()--返回字符編碼方式
setAttribute(String,Object)    存儲此請求中的屬性
getAttribute(String name)    返回指定屬性的屬性值

測試

前端HTML程序

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<a href="http://localhost:8080/cgbservletjava01_war_exploded/FormServlet?name=張三&addr=北京">點我提交get數(shù)據(jù)</a>
		
		<form action="http://localhost:8080/cgbservletjava01_war_exploded/FormServlet" method="post">
			用戶名:
			<input type="text" name="username">
			<br />
			愛好:
			<input type="checkbox" name="hobby" value="籃球"/>籃球
			<input type="checkbox" name="hobby" value="足球"/>足球
			<input type="checkbox" name="hobby" value="乒乓球"/>乒乓球
			<br />
			<input type="submit" value="提交">
		</form>
	</body>
</html>

后端java程序

package cn.tedu.req;

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;
import java.util.Arrays;

@WebServlet(name = "FormServlet")
public class FormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //請求參數(shù)中,包含中文時,post必須配置
//        request.setCharacterEncoding("utf-8");
        //獲取請求參數(shù)
        //方式1:根據(jù)參數(shù)名獲取一個值
        String name = request.getParameter("username");
        System.out.println("name = " + name);
        //方式2:根據(jù)參數(shù)名獲取所有值,并返回數(shù)組
        String[] likes = request.getParameterValues("hobby");
        System.out.println("hobby = " + Arrays.toString(likes));
        //給瀏覽器做出響應
        response.getWriter().print("dopost..success!");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String addr = request.getParameter("addr");
        System.out.println("doget..."+name+addr);
    }
}

請求轉(zhuǎn)發(fā)

概述

請求轉(zhuǎn)發(fā)是服務器內(nèi)部資源的一種跳轉(zhuǎn)方式,即當瀏覽器發(fā)送請求訪問服務器中的某一個資源時,該資源將請求轉(zhuǎn)交給另外一個資源進行處理的過程,就叫做請求轉(zhuǎn)發(fā),具有以下特點:

1,請求轉(zhuǎn)發(fā)整個過程是一次請求、一次響應

2,請求轉(zhuǎn)發(fā)前后,瀏覽器地址欄地址不會發(fā)生變化(瀏覽器–訪問–>A–轉(zhuǎn)發(fā)–>B,地址欄地址始終指向A的地址)

3,請求轉(zhuǎn)發(fā)前后的request對象是同一個

4,轉(zhuǎn)發(fā)前后的兩個資源必須屬于同一個Web應用,否則將無法進行轉(zhuǎn)發(fā)

5,使用代碼: request.getRequestDispatcher(訪問目的資源的路徑).forward(request,response);

6,也可以使用 setAttribute()/getAttribute()來驗證

測試過程

Response

概述

Response是代表Http響應信息的對象,其中將會封裝服務器要發(fā)送給瀏覽器的響應信息,將response對象作為參數(shù)傳遞給service方法,在service方法處理請求的過程中,可以將要發(fā)送給瀏覽器的數(shù)據(jù),先寫入response對象中,在service方法執(zhí)行完后,服務器負責從response對象中獲取到響應信息,再按照http響應信息的格式組織成響應消息,發(fā)送給瀏覽器。

常用的方法:

setContentType("參數(shù)名")--設置響應的字符編碼方式
sendRedirect()--完成重定向
getOutputStream()--獲取字節(jié)輸出流
getWriter()--獲取字符輸出流
setHeader("Access-Control-Allow-Origin", "*"); --專門用來解決跨域問題

測試

package cn.tedu.resp;

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 = "RespServlet")
public class RespServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //響應數(shù)據(jù)中包含中文,會亂碼,用以下代碼指定編碼,緩沖字符輸出流內(nèi)部有一個緩沖區(qū),這個緩沖區(qū)的默認字符集是ISO-8859-1
        response.setContentType("text/html;charset=utf-8");
        //給瀏覽器響應數(shù)據(jù)
        response.getWriter().write("你好123");
    }
}

重定向

概述

當瀏覽器向服務器發(fā)送請求訪問某一個資源A時,資源A在響應時通知瀏覽器需要再進一步請求才能獲取到對應的資源,瀏覽器再次向服務器發(fā)送請求訪問資源B,最終是由資源B響應瀏覽器要獲取的數(shù)據(jù),這個過程叫做重定向,具有以下特點:

1,重定向前后是兩次請求、兩次響應

2,重定向前后,瀏覽器地址欄地址會發(fā)生變化(因為兩次請求都是通過瀏覽器發(fā)起,瀏覽器知道這個跳轉(zhuǎn)過程,因此地址欄地址會發(fā)生變化)。

3,重定向前后的request對象不是同一個 (因此重定向前后是兩次請求,服務器根據(jù)兩次請求會創(chuàng)建兩個request對象,因此request對象不是同一個)

4,重定向前后的兩個資源可以來自不同的Web應用,甚至可以是來自不同的虛擬主機或者服務器。

5,使用代碼: response.sendRedirect(“重定向到資源的路徑”);

測試

觀察,一開始是訪問A資源,服務器內(nèi)部重定向后,地址欄已經(jīng)變成了B資源的訪問方式了.是兩次請求兩次響應

package cn.tedu.resp;

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 = "RedirectServlet")
public class RedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向的地址,可以隨意設置,不是必須在同一工程中
 //response.sendRedirect("http://localhost:8080/cgbservletjava01_war_exploded/RespServlet");
        response.sendRedirect("https://www.baidu.com/");
    }
}

擴展:在web工程里使用Servlet程序 在IDEA里創(chuàng)建一個web工程

File-New-Project-選Java Enterprise并勾選右側(cè)的Web Application-next-輸入工程名稱-Finish

整理web工程目錄結(jié)構(gòu)

修改資源輸出位置

修改jar包存放位置

配置Tomcat服務器

略,詳情見Tomcat服務器的內(nèi)容

擴展案例

創(chuàng)建前端網(wǎng)頁

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
		<script src="https://unpkg.com/vue/dist/vue.js"></script>
		<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
		<script src="https://unpkg.com/element-ui/lib/index.js"></script>
		<link rel="stylesheet" >
	</head>
	<body>
		<div id="app">
			<el-button type="danger" @click="get()">點我</el-button>
			
			<el-input v-model="name"></el-input>
			<el-input v-model="id"></el-input>
		</div>
		<script>
			new Vue({
				el:"#app",
				data(){
					return{
						name:'',
						id:''
					}
				},
				methods:{
					get(){
						// axios.get("http://localhost:8080/axios/t3?id=10&name=jack").then(
						axios.get("http://localhost:8080/axios/t3",{
							params:{
								id:10,
								name:'jack'
							}
						}).then(
							a=>{
								console.log(a);
								console.log(a.data);
								this.id=a.data.id;
								this.name=a.data.name;
							}
						)
					}
				}
			})
		</script>
	</body>
</html>

創(chuàng)建Servlet程序

package cn.tedu.cgb2110boot03.test;

import com.alibaba.fastjson.JSON;

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("/axios/t3")
public class ServletT3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(111);
                response.setHeader("Access-Control-Allow-Origin", "*");
        String id = request.getParameter("id");
        String name = request.getParameter("name");
//        {"id":"10","name":"jack"}
//        "{\"id\":\"10\",\"name\":\"jack\"}"
        String json="{\"id\":\""+id+"\",\"name\":\""+name+"\"}";
        response.getWriter().write(json);
    }
}

總結(jié)

到此這篇關于Servlet從入門到精通的文章就介紹到這了,更多相關Servlet入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • druid多數(shù)據(jù)源配置+Datasurce動態(tài)切換方式

    druid多數(shù)據(jù)源配置+Datasurce動態(tài)切換方式

    這篇文章主要介紹了druid多數(shù)據(jù)源配置+Datasurce動態(tài)切換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入

    java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入

    這篇文章主要為大家詳細介紹了java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Spring事務失效的8大原因詳解

    Spring事務失效的8大原因詳解

    這篇文章主要介紹了Spring事務失效的8大原因詳解,這里以 MySQL 為例,其 MyISAM 引擎是不支持事務操作的,InnoDB 才是支持事務的引擎,一般要支持事務都會使用 InnoDB,需要的朋友可以參考下
    2023-09-09
  • 精通Java泛型的使用與原理

    精通Java泛型的使用與原理

    針對利用繼承來實現(xiàn)通用程序設計所產(chǎn)生的問題,泛型提供了更好的解決方案,本文詳細的介紹了Java泛型的使用與原理,感興趣的可以了解一下
    2022-03-03
  • spring?boot自帶的page分頁問題

    spring?boot自帶的page分頁問題

    這篇文章主要介紹了spring?boot自帶的page分頁問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java多線程實例

    Java多線程實例

    本文給大家介紹java多線程實例,對java多線程知識感興趣的朋友參考下吧
    2015-11-11
  • Java如何在臨界區(qū)中避免競態(tài)條件

    Java如何在臨界區(qū)中避免競態(tài)條件

    這篇文章主要介紹了Java如何在臨界區(qū)中避免競態(tài)條件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 利用MultipartFile實現(xiàn)文件上傳功能

    利用MultipartFile實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了利用MultipartFile實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    這篇文章主要給大家介紹了關于JDK安裝與配置(包含二個或多個JDK的同時安裝)的相關資料,對于Java學習者來說,一臺電腦拿到手肯定要配置JDK,但是對于新手來說還是容易出錯,需要的朋友可以參考下
    2023-10-10
  • Maven聚合開發(fā)實例詳解

    Maven聚合開發(fā)實例詳解

    這篇文章主要介紹了Maven聚合開發(fā)實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論