java web學(xué)習(xí)筆記(未完結(jié))

servlet

  • 什么是servlet?

    Servlet 是javaweb開發(fā)的基石,與平臺無關(guān)的服務(wù)器組件,它是運(yùn)行在Servlet容器/Web應(yīng)用服務(wù)器/Tomcat,負(fù)責(zé)客戶端進(jìn)行通信

Servlet的功能:

1、創(chuàng)建并返回基于客戶請求的動態(tài)HTML頁面。

2、與數(shù)據(jù)庫進(jìn)行通信

  • 如何使用Servlet?

Servlet本身是一組接口,自定義一個類,并且實現(xiàn)servlet接口,這個類就具備了接受客戶端請求以及做出響應(yīng)的功能。

瀏覽器不能直接訪問Servlet文件,只能通過映射的方式來間接訪問servlet,映射需要開發(fā)者手動配置,有兩種配置方式。

  • 基于xml文件的配置方式
<sevlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>servlet路徑</servlet-class>
</sevlet>

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/demo2</url-pattern>
</servlet-mapping>
  • 基于注解
@webServlet("/demo2")
public class HelloServlet implements Servlet{
    
}

Servlet 的生命周期

1、當(dāng)瀏覽器訪問Servlet的時候,Tomcat會查詢當(dāng)前servlet的實例化對象是否存在,如果不存在,則通過反射機(jī)制動態(tài)創(chuàng)建對象,如果存在,就直接執(zhí)行第3步。

2、調(diào)用init方法完成初始化操作。

3、調(diào)用service方法完成業(yè)務(wù)邏輯操作。

4、關(guān)閉Tomcat時,會調(diào)用destory方法,釋放當(dāng)前對象所占用的資源。

servlet 的生命周期方法:無參構(gòu)造函數(shù)、init、service、destory

1、無參構(gòu)造函數(shù)只調(diào)用一次,創(chuàng)建對象。

2、init只調(diào)用一次,初始化對象。

3、service調(diào)用多次,執(zhí)行業(yè)務(wù)方法。

4、destory只調(diào)用一次,卸載對象。

ServletConfig

該接口時用來描述Servlet的基本信息

getServletName() 返回 Servlet的名稱,全類名(帶著包名的全類名)

getInitParameter(String key) 獲取init參數(shù)的值(web.xml)

getInitParameterNames() 返回所有的initParameter的name值,一般用作遍歷初始化參數(shù)

getServletContext() 返回ServletContext對象,它是Servlet的上下文,整個Servlet的管理者

ServletConfig 和 ServletContext的區(qū)別:

ServletConfig作用于某個Servlet實例,每個Servlet都有對應(yīng)的ServletConfig,ServletContext作用于整個web應(yīng)用,一個web應(yīng)用對應(yīng)一個ServletContext,多個Servlet實例對應(yīng)一個ServletContext。

一個是局部對象,一個是全局對象。

Servlet的層次結(jié)構(gòu)

Servlet--->GenericServlet--->HttpServlet

Http請求又很多類型,常用得有四種:

GET讀取

POST保存

PUT修改

DELETE刪除

GenericServlet實現(xiàn)Servlet接口,同時為它得子類屏蔽了不常用的方法,字類只需要重寫service方法即可。

HTTPServlet繼承GenericServlet,根據(jù)請求類型進(jìn)行分發(fā)處理,Get進(jìn)去doGet方法,Post進(jìn)入doPOST方法。

開發(fā)者自定義的servlet類只需要繼承HttpServlet即可,重新doGet和doPost

package com.jlu.servlet;

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("/test")
public class TestServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("Get");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.getWriter().write("post");
    }
}

jsp

jsp本質(zhì)上就是servlet,jsp主要是負(fù)責(zé)與用戶交互,將最終的界面呈現(xiàn)給用戶,HTML+JS+CSS+JAVA的混合文件。

當(dāng)服務(wù)器接收到一個后綴是jsp的請求時,將該請求交給jsp引擎處理,每一個jsp頁面第一次被訪問的時候,jsp引擎會將它翻譯成一個Servlet文件,再由web容器調(diào)用Servlet完成響應(yīng)。

單純從開發(fā)的角度看,jsp就是在HTML中嵌入java程序。

具體嵌入的方式有3種:

1、jsp腳本,執(zhí)行java邏輯代碼

<% java 代碼 %>

2、jsp聲明:定義java方法

<%! 
    聲明 java 方法   
 %>

3、jsp表達(dá)式:把java對象直接輸入出到HTML頁面中

<%= java變量 %>
<%!
  public String test(){
    return "Hello world";
  }
%>
<%
  String str = test();
%>

<%=str%>

實例:

<%
  List<String> names = new ArrayList<>();
  names.add("張三");
  names.add("李四");
  names.add("王五");
  List<Integer> age = new ArrayList<>();
  age.add(21);
  age.add(22);
  age.add(23);
%>
<table>
  <tr>
    <th>姓名</th>
    <th>年齡</th>
  </tr>

  <%
    for (int i= 0;i<names.size();i++){
  %>
    <tr>
      <td>
        <%=names.get(i) %>
      </td>
      <td>
        <%=age.get(i) %>
      </td>
    </tr>
  <%
    }
  %>
</table>

運(yùn)行結(jié)果

[圖片上傳失敗...(image-70e518-1595999863396)]

瀏覽器當(dāng)中的源碼:

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <table>
    <tr>
      <th>姓名</th>
      <th>年齡</th>
    </tr>
      <tr>
        <td>
          張三
        </td>
        <td>
          21
        </td>
      </tr>
      <tr>
        <td>
          李四
        </td>
        <td>
          22
        </td>
      </tr>
      <tr>
        <td>
          王五
        </td>
        <td>
          23
        </td>
      </tr>
  </table>
  </body>
</html>

jsp的內(nèi)置對象9個

request : 表示一次請求,HttpServletRequest.

respond : 表示一次響應(yīng),HttpServletResponse。

pageContext :頁面上下文,獲取頁面信息,pageContext。

session :表示一次會話,保存用戶信息,httpsession.

application :表示當(dāng)前web應(yīng)用,全局對象,保存所有用戶共享信息,ServletContext。

config :當(dāng)前jsp對應(yīng)的Servlet 的ServletConfig對象,獲取當(dāng)前Servlet信息。

out :向瀏覽器輸出數(shù)據(jù),jspWriter。

page :當(dāng)前jsp對應(yīng)的Servlet對象,Servlet。

excerption :表示jsp頁面當(dāng)前發(fā)生的異常,Exception。

常用的是 request 、 response、session、application、pageContext

requst 常用方法:

1、String getParameter(String key) 獲取客戶端傳來的的數(shù)據(jù)

2、void setAttribute(String key,Object value) 通過鍵值對的形式保存數(shù)據(jù)。

3、Object getAttribute(String key) 通過key 取出 value。

4、RequestDispatcher getRequestDispatcher(String path) 返回一個RequestDispatcher 對象,該對象的forward 方法用于請求轉(zhuǎn)發(fā)。

5、String[] getparameterValues() 獲取客戶端傳來的多個同名參數(shù)。

6、void setCharacterEncoding(String charset) 中文亂碼時可以指定每一個請求的編碼。

以下為實例:

//這個是實現(xiàn)jsp間轉(zhuǎn)發(fā)功能的
    <h1>test</h1>
    <%
      String idstr = request.getParameter("id");//取出數(shù)據(jù),這是String類型的
        Integer id = Integer.parseInt(idstr);//把idstr轉(zhuǎn)成int類型
        id++;
        //將數(shù)據(jù)存入request中
        request.setAttribute("number",id);
        //將請求轉(zhuǎn)發(fā)給test2.jsp
        request.getRequestDispatcher("test2.jsp").forward(request,response);//還要把請求和響應(yīng)傳過去
    %>
<h1>test2</h1>
<%
    Integer number = (Integer)request.getAttribute("number");//取出value值并且轉(zhuǎn)化為Integer類型
%>
<%=number%>
<%
    String[] names = request.getParameterValues("name");//這是傳入多組values時,使用數(shù)組
%>
<%=Arrays.toString(names)%>

運(yùn)行圖:

[圖片上傳失敗...(image-2ae4d-1595999863397)]

HTTP請求狀態(tài)碼

200:正常

404:資源找不到

400:請求類型不匹配

500:java程序拋出異常

response 常用方法:

1、sendRedirect(String path) 重定向,頁面之間的跳轉(zhuǎn)。

轉(zhuǎn)發(fā) getRequestDispatcher 和重定向 sendRedirect的區(qū)別:

轉(zhuǎn)發(fā)是將同一個請求傳給下一個頁面,重定向是創(chuàng)建一個新的請求傳給下一個頁面,之前的請求結(jié)束生命周期。

轉(zhuǎn)發(fā):同一個請求在服務(wù)器之間傳遞,地址欄不變,也叫服務(wù)器跳轉(zhuǎn)。

重定向:由客戶端發(fā)送一次新的請求來訪問跳轉(zhuǎn)后的目標(biāo)資源,地址欄改變,也叫客戶端跳轉(zhuǎn)。

如果兩個頁面之間需要通過request來傳值,則必須要轉(zhuǎn)發(fā),不能使用重定向。

用戶登陸,如果用戶名和密碼正確,則跳轉(zhuǎn)到首頁(轉(zhuǎn)發(fā)),并展示用戶名,否則重新回到登陸界面(重定向)。

Session

用戶會話

服務(wù)器無法識別每一次HTTP請求的出處(不知道來自于哪一個客戶端),它只會接受到一個請求信號,所以就存在一個問題:將用戶的響應(yīng)發(fā)送給其他人,必須有一種技術(shù)讓服務(wù)器知道請求來自哪里,這就是會話技術(shù)。

會話:就是客戶端和服務(wù)器之間發(fā)生的一系列連續(xù)的請求和響應(yīng)的過程,打開瀏覽器進(jìn)行操作到關(guān)閉瀏覽器的過程。

會話狀態(tài):指服務(wù)器和瀏覽器在會話過程中產(chǎn)生的狀態(tài)信息,借助于會話狀態(tài),服務(wù)器能夠把屬于同一次會話的一系列請求和響應(yīng)關(guān)聯(lián)起來。

實現(xiàn)會話有兩種方式:

  • session
  • cookie

屬于同一次會話的請求都有一個相同的標(biāo)識符,sessionID

session常用方法:

String getId() 獲取sessionID

void setMaxIactiveInterval(int interval) 設(shè)置session的失效時間,單位為秒。

int getMaxIactiveInterval() 獲取當(dāng)前session的失效時間

void invadate() 設(shè)置session立即失效

void setAttribute(String key ,Object value) 通過鍵值對的形式來儲存數(shù)據(jù)

Object getAttribute(String key) 通過鍵獲取對應(yīng)的數(shù)據(jù)

void removeAttribute(String key) 通過鍵刪除對應(yīng)的數(shù)據(jù)

Cookie

Cookie是服務(wù)端在HTTP響應(yīng)中附帶傳給瀏覽器的一個小文本文件,一旦瀏覽器保存在某個cookie,在之后的請求和響應(yīng)過程中,會將此cookie來回傳遞,這樣就可以通過Cookie這個載體完成客戶端和服務(wù)端的數(shù)據(jù)交互。

Cookie

  • 創(chuàng)建Cookie
Cookie cookie = new Cookie("name","tom");
response.addCookie(cookie);
  • 讀取Cookie
Cookie[] cookies = request.getCookie();
for(Cookie cookie:Cookies){
    out.write(cookie.getName()+":"+cookie.getValue()+"<br/>");
}

Cookie常用的方法

void setMaxAge(int age) 設(shè)置Cookie的有效時間,單位為秒

int getMaxAge() 獲取Cookie的有效時間

String getName() 獲取cookie的name

String getValue() 獲取Cookie的Value

session 和Cookie的區(qū)別

session: 保存在服務(wù)器

? 保存的數(shù)據(jù)是Object

? 會隨著會話的結(jié)束而銷毀

? 保存重要信息

Cookie:保存在瀏覽器

? 保存的數(shù)據(jù)是String類型

? 可以長期保存在瀏覽器中,與會話無關(guān)

? 保存不重要數(shù)據(jù)

存儲用戶信息:

session:setAttribute("name","admit") 存

? getAttribute("name") 取

? 生命周期:服務(wù)端:只要web應(yīng)用重啟就銷毀,客戶端:只要瀏覽器關(guān)閉就銷毀。

? 退出登錄:session.invalidate()

Cookie :response.addCookie(new Cookie(name,"admit")) 存

生命周期:不隨服務(wù)端的重啟而銷毀,客戶端:默認(rèn)是只要關(guān)閉瀏覽器就銷毀,我們通過setMaxAge()方法設(shè)置有效期,一旦設(shè)置了有效期,則不隨瀏覽器的關(guān)閉而銷毀,而是由設(shè)置的時間來決定。

退出登錄:setMaxAge(0)

jsp內(nèi)置對象作用域

4個

page、 request、session、application

setAttribute、getAttribute

page作用域:對應(yīng)的內(nèi)置對象是pageContext

request作用域:對應(yīng)的內(nèi)置對象是 request

session 作用域: 對應(yīng)的內(nèi)置對象session

application作用域: 對應(yīng)的內(nèi)置對象是application

page< request< session < application

page 只在當(dāng)前頁面有效

request 在一次請求內(nèi)有效

session 在一次會話內(nèi)有效

application 對應(yīng)整個web應(yīng)用的

EL表達(dá)式

Expression Language表達(dá)式語言,替代jsp頁面中數(shù)據(jù)訪問時的復(fù)雜編碼,可以非常便捷地去取域?qū)ο?pageContext、request、session、application)中報存的數(shù)據(jù),提前時一定要先setAttribute,EL就相當(dāng)于在簡化getAttritube

${變量名} 變量名就是setAttritube 對應(yīng)的 key 值。

1、EL對于4種域?qū)ο蟮哪J(rèn)查找順序:

pageContext —> request —> session —> application

按照上述的順序進(jìn)行查找,找到立即返回,在application 中也無法找到,則返回 null

2、指定作用域進(jìn)行查找

pageContext :${pageScope.name}

request : ${requestScope.name}

session :${sessionScope.name}

application : ${applicationScope.name}

JSTL

jsp Standard Tag Library JSP 標(biāo)準(zhǔn)標(biāo)簽庫,jsp為開發(fā)者提供的一系列的標(biāo)簽,使用這些標(biāo)簽可以完成一些邏輯處理,比如循環(huán)遍歷集合,讓代碼更加簡介,不在出現(xiàn)jsp腳本穿插的情況。

實際開發(fā)中EL 和 JSTL結(jié)合起來使用,jstl側(cè)重于邏輯處理,EL負(fù)責(zé)展示數(shù)據(jù)

jstl 的使用

1、需要導(dǎo)入 jar 包 存放的位置 web / WEB-INF

2、在jsp頁面開始的地方導(dǎo)入jstl標(biāo)簽庫

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3、在需要使用的地方使用

<c:forEach items="${list}" var="user">
    <tr>
        <td>${user.age}</td>
        <td>${user.name}</td>
        <td>${user.score}</td>
        <td>${user.address}</td>
    </tr>
</c:forEach>

JSTL 優(yōu)點:

1、提供了同意的標(biāo)簽

2、可以用于編寫各種動態(tài)功能

  • 核心常用標(biāo)簽:

set 、out 、 remove 、 catch

set :向域?qū)ο笾刑砑訑?shù)據(jù)

<%
    request.setAttritube(key,value);
%>
    
  <c:set var="name" value="tom"></c:set>
      ${name}<%--存在pages當(dāng)中--%>

out : 輸出域?qū)ο笾械臄?shù)據(jù)

<c:set var ="name" value="tom"></c:set>
<c:out value ="${name}"></c:out>    第一種輸出
${name} 第二種輸出
區(qū)別:
當(dāng)沒有set的時候,${name} 顯示的為空,在客戶端上空白,但用標(biāo)簽<c:out value = "${name}" default= "未定義"></c:out>
可以設(shè)置他的默認(rèn)顯示值出來,這樣客戶可以知道什么回事。

remove :刪除域?qū)ο笾械臄?shù)據(jù)

<c:out value="${name}"></c:out>
<c:remove var="name" scope="page"></c:remove>  刪除操作
<hr>
<c:out value ="${name}" default="未定義"></c:out>

catch :捕獲異常信息

<c:catch var="error">
    <%
         int a = 100/0 ;
    %>
</c:catch>
${error}

未定義 java.lang.ArithmeticException: / by zero

  • 條件標(biāo)簽 :if choose
<c:set var="num1" value="1"></c:set>
<c:set var="num2" value="2"></c:set>
<c:if test="${num>num2}">ok</c:if>
<c:if test="${num1<num2}">fail</c:if>
<hr>
<c:choose>
   <c:when test="${num2>num1}">ook</c:when>
   <c:otherwise>fail</c:otherwise>
</c:choose>
  • 迭代標(biāo)簽 :forEach
<%
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");
    list.add("g");
    request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" begin="2" end="4" step="2" varStatus="sta">
    ${sta.count}、${str}
</c:forEach>

格式化標(biāo)簽庫常用標(biāo)簽

<%
request.setAttribute("date",new Date());
%>
${date}
<hr>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
<fmt:formatNumber value="123.2586" maxFractionDigits="2" maxIntegerDigits="3"></fmt:formatNumber>

函數(shù)標(biāo)簽庫常用標(biāo)簽

<%
    request.setAttribute("info","java,cpp,python");
%>
${fn:contains(info, "python")}<br><%-- 判斷字符串中是否存在此字符--%>
${fn:startsWith(info, "java")}<br> <%--判斷是否從Java開始--%>
${fn:endsWith(info, "cpp")}<br>   <%--判斷是否以cpp結(jié)尾--%>
${fn:indexOf(info, "va")}<br>
${fn:substring(info, 2,3 )} <br>
${fn:split(info, ",")[0]}-${fn:split(info, ",")[1]}

過濾器

Filter

功能:

  • 用來攔截傳入的請求和傳出的響應(yīng)
  • 修改活以某種方式處理正在客戶端和服務(wù)端之間交換的數(shù)據(jù)流

如何使用?

與Servlet類似,F(xiàn)ilter 是Java WEB提供的一個接口,開發(fā)者只需要自定義一個類似并且實現(xiàn)該接口即可。

public class CharacterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);//類似重定向
    }
    @Override
    public void destroy() {
    }
}

web.xml

<filter>
    <filter-name>Charcater</filter-name>
    <filter-class>com.JLUZH.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Charcater</filter-name>
    <url-pattern>/test</url-pattern>
     <url-pattern>/login</url-pattern>
</filter-mapping>

注意:doFilter 方法種處理完業(yè)務(wù)邏輯之后,必須添加 filterChain.doFilter(servletRequest,servletResponse); 否則 請求/響應(yīng)無法向后傳遞,一直停留在過濾器中。

Filter 的生命周期

當(dāng)Tomcat 啟動時,通過反射機(jī)制調(diào)用Filter 的無參構(gòu)造函數(shù)創(chuàng)建實例化對象,同時調(diào)用 init 方法實現(xiàn)初始化,doFilter 方法調(diào)用多次,當(dāng)Tomcat 服務(wù)關(guān)閉時,調(diào)用 destory 來銷毀 Filter 對象。

無參構(gòu)造函數(shù):只調(diào)用一次,當(dāng)Tomca 啟動時調(diào)用(Filter 一定要進(jìn)行配置)

init方法:只調(diào)用一次,當(dāng) Filter 的實例化對象創(chuàng)建完成之后調(diào)用

doFilter :調(diào)用多次,訪問Filter 的業(yè)務(wù)邏輯都寫在 Filter 中

destory :只調(diào)用一次,Tomcat 關(guān)閉時調(diào)用。

同時配置多個Filter ,F(xiàn)ilter 的調(diào)用順序是由 web.xml 中的配置順序決定的,寫在上面的配置先調(diào)用,因為web.xml 是從上到下的順序讀取的。

也可以通過注解的方式來簡化web.xml 中的配置

filter>
        <filter-name>Charcater</filter-name>
        <filter-class>com.JLUZH.filter.CharacterFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Charcater</filter-name>
        <url-pattern>/test</url-pattern>
    </filter-mapping>

等于

@WebFilter("/test")
public class CharacterFilter implements Filter {
    }

實際開發(fā)中 Filter 的使用場景:

1、統(tǒng)一處理中文亂碼。

2、屏蔽敏感詞。

@WebFilter("/test")
public class WordFilter implements Filter {
    //將”敏感詞“ 替換成 ***
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        String value = servletRequest.getParameter("value");
        value= value.replaceAll("敏感詞","***");//這里替換之后需要用setAttritube方法來重新存vaule
        servletRequest.setAttribute("value",value);//否則結(jié)果是沒替換成功
        filterChain.doFilter(servletRequest,servletResponse);
    }

}


@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       String value= (String) req.getAttribute("value");//還是用getAttritube 來取
        System.out.println("Servlet"+value);
    }
}

3、控制資源的訪問(如:下載資源前需要登陸)

以下案例用session判斷是否登陸,未登陸則跳轉(zhuǎn)login頁面,登陸了就download頁面

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/download.jsp")
public class downFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //Filter中沒有g(shù)etsession方法,所以就轉(zhuǎn)為HttpServlet
        HttpServletRequest request = (HttpServletRequest) servletRequest;//子類
        HttpServletResponse response =(HttpServletResponse) servletResponse;
        HttpSession session = request.getSession();
        String name=(String) session.getAttribute("name");
        if (name==null){
            //未登陸
          response.sendRedirect("/login.jsp");
        }else{
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
}

文件上傳下載

  • 上傳:

待復(fù)習(xí)

  • 下載
//設(shè)置響應(yīng)方式
resp.setContentType("application/x-msdownload");//啟用下載方式
//設(shè)置下載之后的文件名
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
//上面的都死寫死的
OutputStream outputStream = resp.getOutputStream();
String path = req.getServletContext().getRealPath("file/"+fileName);
InputStream inputStream = new FileInputStream(path);
int temp =0;
while((temp=inputStream.read())!=-1){
    outputStream.write(temp);
}//用字節(jié)流讀,大多數(shù)類型文件都可以
inputStream.close();
outputStream.close();

Ajax

Asynchronous JavaScript And Xml

Ajax 不是新的的編程語言,指的是一種交互方式,異步加載,客戶端和服務(wù)器的數(shù)據(jù)交互更新在局部頁面的技術(shù),不需要刷新整一個頁面(局部刷新)

優(yōu)點:

1、局部刷新,效率更高

2、用戶體驗好

基于JQuery的Ajax

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            var btn = $("#btn");
            btn.click(function () {
                $.ajax({
                    url:'/test',
                    type:'post',
                    data:'id=1',
                    dataType:'text',
                    success :function (data) {
                        var text = $("#text");
                        text.before("<span>"+data+"</span><br>")
                    }
                });

            })
        })
    </script>
</head>
<body>
        <input id="text"  type="text"><br>
        <input id="btn" type="submit" value="提交">
</body>
</html>

不能用表單提交請求,改用jQuery方式動態(tài)綁定事件來提交。

Servlet 不能跳轉(zhuǎn)到j(luò)sp ,只能將數(shù)據(jù)返回

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("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String id = req.getParameter("id");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String str = "hello world";
        resp.getWriter().write(str)
 //        req.setAttribute("str",str);
//        req.getRequestDispatcher("test.jsp").forward(req,resp);//這里不能跳轉(zhuǎn),不然就會顯示多一個輸入框和提交按鈕
    }
}

傳統(tǒng)的WEB 數(shù)據(jù)交互 VS AJAX數(shù)據(jù)交互

  • 客戶端請求的方式不同:

傳統(tǒng),瀏覽器發(fā)送同步請求(form ,a)

AJAX,異步引擎對象發(fā)送異步請求

  • 服務(wù)器響應(yīng)的方式不同

傳統(tǒng),響應(yīng)一個完整jsp頁面(視圖)

AJAX,響應(yīng)需要的數(shù)據(jù)

  • 客戶端處理的方式不同:

傳統(tǒng):需要等待服務(wù)器完成響應(yīng)并且重新加載整個頁面之后,用戶才能進(jìn)行后后續(xù)的操作

AJAX:動態(tài)更新頁面中局部內(nèi)容,不影響用戶的其他操作

AJAX原理

[圖片上傳失敗...(image-c9b35f-1595999863397)]

基于JQuery 的AJAX語法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容