国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 大數(shù)據(jù)從入門到深入:JavaEE 之 動態(tài)網(wǎng)頁開發(fā)基礎(chǔ) JSP實戰(zhàn)優(yōu)化:Servlet基礎(chǔ)

大數(shù)據(jù)從入門到深入:JavaEE 之 動態(tài)網(wǎng)頁開發(fā)基礎(chǔ) JSP實戰(zhàn)優(yōu)化:Servlet基礎(chǔ)

時間:2023-09-21 09:12:01 | 來源:網(wǎng)站運(yùn)營

時間:2023-09-21 09:12:01 來源:網(wǎng)站運(yùn)營

大數(shù)據(jù)從入門到深入:JavaEE 之 動態(tài)網(wǎng)頁開發(fā)基礎(chǔ) JSP實戰(zhàn)優(yōu)化:Servlet基礎(chǔ):

第3章 JSP實戰(zhàn)優(yōu)化:Servlet基礎(chǔ)

3.1 Servlet概述

3.1.1 為什么需要Servlet

總結(jié)我們JSP控制器的寫法,把Java代碼寫到JSP中,雖然簡單方便但是編寫期間也有很多的 問題,比如:

1) JSP中的Java代碼不會報語法錯誤?

2) JSP中自動導(dǎo)包老是會忘記

3) 運(yùn)行報錯提示也不友好?

4) 用作控制器的JSP只是編寫Java代碼,但是我們的JSP還是希望能用在展示數(shù)據(jù)上?

所以綜上所述,我們此時就有了一個想法,JSP的控制器能不能用java類的形式進(jìn)行編寫呢?答 案是可以的

之前我們已經(jīng)說了JavaWEB的開發(fā)模式 有model1 和 model2 模式,那么現(xiàn)在我們就要拋棄 model1轉(zhuǎn)而投向model2開發(fā)了?

model1 和 model2的最大區(qū)別就是 model2 開發(fā)模式中控制器的代碼是完全寫在Java類中 的,而這個用作控制器的java類叫做Servlet?

3.1.2 什么是Servlet

Servlet是在服務(wù)器端運(yùn)行的Java程序,可以接收客戶端請求并做出 響應(yīng)

Servlet可以動態(tài)生成需要的數(shù)據(jù)對客戶端進(jìn)行響應(yīng)

3.1.3 JSP和Servlet的關(guān)系

根據(jù)JSP的運(yùn)行原理可知,JSP在運(yùn)行期間因為內(nèi)部包含java代碼需要編譯,所以最終JSP會被 編譯成一個class執(zhí)行,而JSP繼承于org.apache.jasper.runtime.HttpJspBase類,

而HttpJspBase又是繼承自HttpServlet的類,由此可以得出一個結(jié)論,就是JSP在運(yùn)行時會 被Web容器翻譯為一個Servlet

3.2 Servlet使用

3.2.1 簡單使用

假設(shè)我們現(xiàn)在完成有一個頁面登錄效果 :

輸入正確的用戶名密碼,提示登錄成功?

完成上面的效果我們需要完成以下幾步操作

1) 編寫需求頁面

登錄頁面 :

<%@ 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>用戶登錄</title></head><body> <div> <h1>servlet小案例:用戶登錄</h1> <form action="userlogin" method="post"> <p> 請輸入您的用戶名 :<input type="text" name="loginName" /> </p> <p> 請輸入您的密碼 : <input type="password" name="loginPass" /> </p> <p> <button type="submit">登錄</button> </p> </form> </div></body></html>登錄成功:

<%@ 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>登錄成功</title></head><body> <div> <marquee> <h1>恭喜,登錄成功!</h1> </marquee> </div></body></html>登錄失敗:

<%@ 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>登錄失敗</title></head><body> <div> <marquee> <h1>很遺憾,登錄失敗!</h1> </marquee> </div></body></html>2) 創(chuàng)建Servlet

1. 創(chuàng)建 com.hnxy.controller 包 當(dāng)然如果感覺controller難寫的話可以創(chuàng)建com.hnxy.web

2. 在創(chuàng)建好的包上右鍵選擇 "new"-->"other"

3. 彈出的框中選擇servlet

4. 給Servlet起個名字,我們這里叫做UserLoginAction 代表是用戶登錄的控制器 Action 代表 動作,這里指代控制器

4. 主要是填寫一些Servlet的描述信息,因為怎么說Servlet也是一個小程序,所以此處可以填寫 一些程序的描述信息

5. 但是此處需要注意的是URL mappings 這個選項,此處一定要和頁面action的地址保持一 致,這樣JSP才能通過提交標(biāo)簽的action地址找到這個servlet,這個servlet才能處理請求

6. 選擇創(chuàng)建servlet的時候保留哪些方法,我們此處只保留doGet 和 doPost方法,因為這兩個方 法一個幫助我們處理get請求 一個幫助我們處理post請求

這樣一個Servlet就創(chuàng)建好了

package com.hnxy.controller;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class UserLoginAction11 */public class UserLoginAction extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}稍加修改就可以使用了

package com.hnxy.controller;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 用戶登錄的控制器 * @author My * */public class UserLoginAction extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 設(shè)定編碼 request.setCharacterEncoding("UTF-8"); // 獲取頁面數(shù)據(jù) String loginName = request.getParameter("loginName"); String loginPass = request.getParameter("loginPass"); // 業(yè)務(wù)判斷 if("admin".equals(loginName)&&"admin".equals(loginPass)){ request.getRequestDispatcher("success.jsp").forward(request, response); }else{ response.sendRedirect("error.jsp"); } }}3) 調(diào)試運(yùn)行

失敗的時候

成功的時候

3.2.2 Servlet群組體系

1) Servlet的結(jié)構(gòu) :

我們用的HttpServlet是繼承自GenericServlet并且實現(xiàn)了Servlet 和 ServletConfig接口?專門 用來處理HTTP請求的一種控制器?

此處我們來看下這些個接口與抽象類的主要方法:

1) servlet接口: 定義了一個servlet標(biāo)準(zhǔn),它告訴開發(fā)者什么樣的類才能稱之為是servlet程序, 所以servlet接口定義了一些servlet必要的方法

我們的HttpServlet幫助我們實現(xiàn)了原始servlet的所有方法,所以我們在用servlet的時候就不 用再實現(xiàn)這些方法了,很開心

2) servletConfig 接口 : 在Servlet初始化過程中獲取配置信息,一個Servlet只有一個 ServletConfig對象,它的常用方法有

3) GenericServlet抽象類 : 提供了Servlet與ServletConfig接口方法的默認(rèn)實現(xiàn)(service( )方 法除外)

4) HttpServlet抽象類 : 繼承自GenericServlet,處理HTTP協(xié)議的請求和響應(yīng)

3.2.3 Servlet運(yùn)行原理

一個servlet的主要執(zhí)行步驟

詳細(xì)解釋 :

首先tomcat開啟,運(yùn)行我們的web應(yīng)用

訪問登錄頁面 http://127.0.0.1:8080/javaweb_class3_tp1/

① 當(dāng)點擊登錄按鈕的時候tomcat會創(chuàng)建request對象向服務(wù)器地址發(fā)起一次請求
服務(wù)器地址
http://127.0.0.1:8080/javaweb_class3_tp1/userlogin
攜帶數(shù)據(jù)
loginName=admin loginPass=admin
當(dāng)我將form改成get請求
就可以具體看到
http://127.0.0.1:8080/javaweb_class3_tp1/userlogin?loginName=admin&loginPass=admin

② tomcat需要接收這個請求進(jìn)行解析
怎么解析呢?
http://127.0.0.1:8080 確定是哪臺tomcat接收 javaweb_class3_tp1 確定那個webapp處理這個請求
userlogin 這是客戶端制定需要服務(wù)端那個服務(wù)來處理這個請求
這里有一個問題,我們有這個服務(wù)么?答案是有的!請打開項目的WEB-INF文件夾里面有一個 web.xml文件

雙擊打開

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>javaweb_class3_tp1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>UserLoginAction</display-name> <servlet-name>UserLoginAction</servlet-name> <servlet-class>com.hnxy.controller.UserLoginAction</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserLoginAction</servlet-name> <url-pattern>/userlogin</url-pattern> </servlet-mapping></web-app>簡單了解一下什么是XML?

XML 指可擴(kuò)展標(biāo)記語言(eXtensible Markup Language)。

XML 被設(shè)計用來傳輸和存儲數(shù)據(jù)。

XML 很重要,也很容易學(xué)習(xí)。

HTML其實就是一種特殊的XML

這個XML在我們的項目中主要負(fù)擔(dān)一個web項目的配置工作,比如上面的web.xml中就對我們的web項目進(jìn) 行了一些配置

比如

<!-- webapp的項目名稱 --><display-name>javaweb_class3_tp1</display-name>


<!-- webapp的歡迎頁面 也就是說如果訪問 http://127.0.0.1:8080/javaweb_class3_tp1 沒有指定要訪問的JSP的話 tomcat會默認(rèn)跳轉(zhuǎn)到下面存在的一個頁面中去 --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file></welcome-file-list>上面的都是不重要的 下面才是重要的

<servlet> <description></description> <display-name>UserLoginAction</display-name> <servlet-name>UserLoginAction</servlet-name> <servlet-class>com.hnxy.controller.UserLoginAction</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserLoginAction</servlet-name> <url-pattern>/userlogin</url-pattern> </servlet-mapping>這個是我們UserLoginAction這個Servlet的核心配置部分,不知道大家還有沒有印象剛才我們 通過頁面請求已經(jīng)分析到

客戶端要請求 http://127.0.0.1:8080 這臺tomcat 里面的 javaweb_class3_tp1 這個webapp 處理這個請求

并且還指定了需要 javaweb_class3_tp1這個webapp中的 userlogin 這個服務(wù)來處理請求

那么我們觀察一下 userlogin 是不是和 servlet配置中的

<servlet-mapping>

<servlet-name>UserLoginAction</servlet-name>

<url-pattern>/userlogin</url-pattern>

</servlet-mapping>

這段里面的 <url-pattern>/userlogin</url-pattern> 是保持一致的,這樣頁面提交的userlogin這個請求就被UserLoginAction攔截并處理

那么UserLoginAction有是個啥呢?我們再往上看

<servlet>

<description></description>

<display-name>UserLoginAction</display-name>

<servlet-name>UserLoginAction</servlet-name>

<servlet-class>com.hnxy.controller.UserLoginAction</servlet-class>

</servlet>

servlet-mapping中的 UserLoginAction 和 servlet中的<servletname>UserLoginAction</servlet-name>又互相匹配

匹配上了之后我們觀察

<servlet-class>com.hnxy.controller.UserLoginAction</servlet-class>

這句話,這句話是一個類的全限定名稱,我們知道JVM運(yùn)行期間可以通過類名反射生成這個類的實例,

③④⑤ 所以你現(xiàn)在要請求這個類,那么tomcat就會根據(jù)你的頁面請求 userlogin 到 web.xml 中找到相應(yīng)的 servletmapping 標(biāo)簽下的 url-pattern 與之匹配

匹配上之后再根據(jù)servletname找到具體的servlet 然后根據(jù)servlet-class創(chuàng)建這個servlet的 實例(對象)

創(chuàng)建了這個對象之后,tomcat會根據(jù)你頁面的請求方式來調(diào)用這個servlet對象的doGet() 或者 doPost()方法來處理這個業(yè)務(wù)?

⑥ 具體的servlet對象在處理完這個業(yè)務(wù)之后然后保存結(jié)果,最后在轉(zhuǎn)發(fā)或者重定向到下一個 頁面 完成這次轉(zhuǎn)發(fā)與請求的工作

總結(jié) :
這個過程中需要有幾個地方大家注意

<servlet> <description></description> <display-name>UserLoginAction</display-name> <servlet-name>UserLoginAction</servlet-name> <servlet-class>com.hnxy.controller.UserLoginAction</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserLoginAction</servlet-name> <url-pattern>/userlogin</url-pattern> </servlet-mapping>每個servlet都有一個這個的配置,需要注意的是:

1. <url-pattern>/userlogin</url-pattern> 配置的是頁面form表單中action的 地址,注意此處需要加/攔截

為什么呢

仔細(xì)觀察我們的提交地址

http://127.0.0.1:8080/javaweb_class3_tp1/userlogin

2. <servlet-class>com.hnxy.controller.UserLoginAction</servlet-class>

這個配置servlet類的全限定名稱,這樣java才能反射生成這個類的對象 調(diào)用這個類中的doGet() 或者doPost()方法

3. 關(guān)于XML配置我們以后會詳細(xì)說,此處我們需要注意的就是一個webapp項目 都有一個XML配置文件,這里面做一些XML的配置工作

4. 一個類如果能稱之為是一個Servlet小程序的話必須滿足兩點 : 一個是繼承 HttpServlet 另外一個就是要在XML中配置這個servlet

5. 那么有的同學(xué)就會問了,有沒有什么簡單的Servlet配置方案呢? 當(dāng)然有! 如果想簡單配置,可以刪掉web.xml中的servlet配置

在servlet類上配置 @WebServlet("/form表單中action的名字")

這樣一個servlet就生效了,這個叫做注解配置

Java 注解

注解基礎(chǔ)知識點

定義:注解(Annotation),也叫元數(shù)據(jù)。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特 性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的 前面,用來對這些元素進(jìn)行說明,注釋。

作用分類:

①編寫文檔:通過代碼里標(biāo)識的元數(shù)據(jù)生成文檔【生成文檔doc文檔】

② 代碼分析:通過代碼里標(biāo)識的元數(shù)據(jù)對代碼進(jìn)行分析【使用反射】

③編譯檢查:通過代碼里標(biāo)識的元數(shù)據(jù)讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】

JAVA注解

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行 基本編譯時檢查。注解是以‘@注解名’在代碼中存在的,根據(jù)注解參數(shù)的個數(shù),我們可以將注解分 為:標(biāo)記注解、單值注解、完整注解三類。它們都不會直接影響到程序的語義,只是作為注解(標(biāo)識) 存在,我們可以通過反射機(jī)制編程實現(xiàn)對這些元數(shù)據(jù)(用來描述數(shù)據(jù)的數(shù)據(jù))的訪問。另外,你可以在 編譯時選擇代碼里的注解是否只存在于源代碼級,或者它也能在class文件、或者運(yùn)行時中出現(xiàn) (SOURCE/CLASS/RUNTIME)。

元數(shù)據(jù)的作用

如果要對于元數(shù)據(jù)的作用進(jìn)行分類,還沒有明確的定義,不過我們可以根據(jù)它所起的作用,大致可分為 三類:

編寫文檔:通過代碼里標(biāo)識的元數(shù)據(jù)生成文檔。

代碼分析:通過代碼里標(biāo)識的元數(shù)據(jù)對代碼進(jìn)行分析。

編譯檢查:通過代碼里標(biāo)識的元數(shù)據(jù)讓編譯器能實現(xiàn)基本的編譯檢查

說白了 注解即使在將普通類標(biāo)記成特殊功能的一種Java標(biāo)記技術(shù),所以 注解 XML 其實都是一回事,只不 過注解會更簡單,注解也是我們后期主要學(xué)習(xí)的一種技術(shù),此處大家只需要知道注解如何標(biāo)記一個servlet就 可以了!



關(guān)鍵詞:基礎(chǔ),實戰(zhàn),入門,數(shù)據(jù),深入,動態(tài)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉