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)]