日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb基础学习笔记

發布時間:2024/1/23 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb基础学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tomcat

Web 應?服務器:Tomcat、Jboos、Weblogic、Jetty

  • 安裝 Tomcat
    1、官?下載壓縮?件。https://tomcat.apache.org/download-90.cgi

    2、解壓縮。
    bin:存放各個平臺下啟動和停? Tomcat 服務的腳本?件。
    conf:存放各種 Tomcat 服務器的配置?件。
    lib:存放 Tomcat 服務器所需要的 jar。
    logs:存放 Tomcar 服務運?的?志。
    temp:Tomcat 運?時的臨時?件。
    webapps:存放允許客戶端訪問的資源(Java 程序)。
    work:存放 Tomcat 將 JSP 轉換之后的 Servlet ?件。

IDEA 集成 Tomcat

1、創建 Java Web ?程。






Servlet

  • 什么是 Servlet?
    Servlet 是 Java Web 開發的基?,與平臺?關的服務器組件,它是運?在 Servlet 容器/Web 應?服務
    器/Tomcat,負責與客戶端進?通信。
    Servlet 的功能:
    1、創建并返回基于客戶請求的動態 HTML ??。
    2、與數據庫進?通信。
  • 如何使? Servlet?
    Servlet 本身是?組接?,?定義?個類,并且實現 Servlet 接?,這個類就具備了接受客戶端請求以及
    做出響應的功能。
package com.southwind.servlet; import javax.servlet.*; import java.io.IOException; public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponseservletResponse) throws ServletException, IOException {String id = servletRequest.getParameter("id");System.out.println("我是Servlet,我已經接收到了客戶端發來的請求,參數是"+id);servletResponse.setContentType("text/html;charset=UTF-8");servletResponse.getWriter().write("客戶端你好,我已接收到你的請求");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {} }

瀏覽器不能直接訪問 Servlet ?件,只能通過映射的?式來間接訪問 Servlet,映射需要開發者?動配
置,有兩種配置?式。

  • 基于 XML ?件的配置?式。
<servlet><servlet-name>hello</servlet-name><servlet-class>com.southwind.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/demo2</url-pattern> </servlet-mapping>
  • 基于注解的?式。
@WebServlet("/demo2") public class HelloServlet implements Servlet {}

上述兩種配置?式結果完全?致,將 demo2 與 HelloServlet 進?映射,即在瀏覽器地址欄中直接訪問
demo 就可以映射到 HelloServlet。

Servlet 的?命周期

1、當瀏覽器訪問 Servlet 的時候,Tomcat 會查詢當前 Servlet 的實例化對象是否存在,如果不存在,
則通過反射機制動態創建對象,如果存在,直接執?第 3 步。
2、調? init ?法完成初始化操作。
3、調? service ?法完成業務邏輯操作。
4、關閉 Tomcat 時,會調? destory ?法,釋放當前對象所占?的資源。
反射機制:(如下圖)

Servlet 的?命周期?法:?參構造函數、init、service、destory
1、?參構造函數只調??次,創建對象。
2、init 只調??次,初始化對象。
3、service 調? N 次,執?業務?法。
4、destory 只調??次,卸載對象。

ServletConfig

該接?是?來描述 Servlet 的基本信息的。
getServletName() 返回 Servlet 的名稱,全類名(帶著包名的類名)
getInitParameter(String key) 獲取 init 參數的值(web.xml)

getInitParameterNames() 返回所有的 initParamter 的 name 值,?般?作遍歷初始化參數
getServletContext() 返回 ServletContext 對象,它是 Servlet 的上下?,整個 Servlet 的管理者。
ServletConfig 和 ServletContext 的區別:
ServletConfig 作?于某個 Servlet 實例,每個 Servlet 都有對應的 ServletConfig,ServletContext 作?
于整個 Web 應?,?個 Web 應?對應?個 ServletContext,多個 Servlet 實例對應?個
ServletContext。
?個是局部對象,?個是全局對象。

Servlet 的層次結構

Servlet ====> GenericServlet ====> HttpServlet
HTTP 請求有很多種類型,常?的有四種:

GET 讀取
POST 保存
PUT 修改
DELETE 刪除

GenericServlet 實現 Servlet 接?,同時為它的?類屏蔽了不常?的?法,?類只需要重寫 service ?
法即可。
HttpServlet 繼承 GenericServlet,根據請求類型進?分發處理,GET 進? doGET ?法,POST 進?
doPOST ?法。
開發者?定義的 Servlet 類只需要繼承 HttpServlet 即可,重新 doGET 和 doPOST。

package com.southwind.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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.getWriter().write("GET");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.getWriter().write("POST");} }

JSP

JSP 本質上就是?個 Servlet,JSP 主要負責與?戶交互,將最終的界?呈現給?戶,
HTML+JS+CSS+Java 的混合?件。
當服務器接收到?個后綴是 jsp 的請求時,將該請求交給 JSP 引擎去處理,每?個 JSP ??第?次被訪
問的時候,JSP 引擎會將它翻譯成?個 Servlet ?件,再由 Web 容器調? Servlet 完成響應。
單純從開發的?度看,JSP 就是在 HTML 中嵌? Java 程序。
具體的嵌??式有 3 種:
1、JSP 腳本,執? Java 邏輯代碼

<% Java代碼 %>

2、JSP 聲明:定義 Java ?法

<%!聲明 Java ?法 %>

3、JSP 表達式:把 Java 對象直接輸出到 HTML ??中

<%=Java變量 %> <%!public String test(){return "HelloWorld"; } %> <% String str = test(); %> <%=str%>

JSP內置對象 9 個

1、request:表示?次請求,HttpServletRequest。
2、response:表示?次響應,HttpServletResponse。
3、pageContext:??上下?,獲取??信息,PageContext。
4、session:表示?次會話,保存?戶信息,HttpSession。
5、application:表示當前 Web 應?,全局對象,保存所有?戶共享信息,ServletContext。
6、config:當前 JSP 對應的 Servlet 的 ServletConfig 對象,獲取當前 Servlet 的信息。
7、out:向瀏覽器輸出數據,JspWriter。
8、page:當前 JSP 對應的 Servlet 對象,Servlet。
9、exception:表示 JSP ??發?的異常,Exception。
常?的是 request、response、session、application、pageContext

request 常??法:
1、String getParameter(String key) 獲取客戶端傳來的參數。
2、void setAttribute(String key,Object value) 通過鍵值對的形式保存數據。(服務端內部傳遞參數)
3、Object getAttribute(String key) 通過 key 取出 value。
4、RequestDispatcher getRequestDispatcher(String path) 返回?個 RequestDispatcher 對象,該對象的 forward ?法?于請求轉發。
5、String[] getParameterValues() 獲取客戶端傳來的多個同名參數。
6、void setCharacterEncoding(String charset) 指定每個請求的編碼。

HTTP 請求狀態碼

200:正常
404:資源找不到
400:請求類型不匹配
500:Java 程序拋出異常

response 常??法:
1、sendRedirect(String path) 重定向,??之間的跳轉。
轉發 getRequestDispatcher 和重定向 sendRedirect 的區別:
轉發是將同?個請求傳給下?個??,重定向是創建?個新的請求傳給下?個??,之前的請求結束?
命周期。
轉發:同?個請求在服務器之間傳遞,地址欄不變,也叫服務器跳轉。
重定向:由客戶端發送?次新的請求來訪問跳轉后的?標資源,地址欄改變,也叫客戶端跳轉。
如果兩個??之間需要通過 request 來傳值,則必須使?轉發,不能使?重定向。
?戶登錄,如果?戶名和密碼正確,則跳轉到??(轉發),并且展示?戶名,否則重新回到登陸??
(重定向)。

Session

?戶會話
服務器?法識別每?次 HTTP 請求的出處(不知道來?于哪個終端),它只會接受到?個請求信號,所
以就存在?個問題:將?戶的響應發送給其他?,必須有?種技術來讓服務器知道請求來?哪,這就是
會話技術。
會話:就是客戶端和服務器之間發?的?系列連續的請求和響應的過程,打開瀏覽器進?操作到關閉瀏
覽器的過程。
會話狀態:指服務器和瀏覽器在會話過程中產?的狀態信息,借助于會話狀態,服務器能夠把屬于同?次會話的?系列請求和響應關聯起來。
實現會話有兩種?式:

  • session
  • cookie

屬于同?次會話的請求都有?個相同的標識符,sessionID

session 常?的?法:
String getId() 獲取 sessionID
void setMaxInactiveInterval(int interval) 設置 session 的失效時間,單位為秒
int getMaxInactiveInterval() 獲取當前 session 的失效時間
void invalidate() 設置 session ?即失效
void setAttribute(String key,Object value) 通過鍵值對的形式來存儲數據
Object getAttribute(String key) 通過鍵獲取對應的數據
void removeAttribute(String key) 通過鍵刪除對應的數據

Cookie

Cookie 是服務端在 HTTP 響應中附帶傳給瀏覽器的?個??本?件,?旦瀏覽器保存了某個 Cookie,
在之后的請求和響應過程中,會將此 Cookie 來回傳遞,這樣就可以通過 Cookie 這個載體完成客戶端
和服務端的數據交互。

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

Cookie 常?的?法
void setMaxAge(int age) 設置 Cookie 的有效時間,單位為秒
int getMaxAge() 獲取 Cookie 的有效時間
String getName() 獲取 Cookie 的 name
String getValue() 獲取 Cookie 的 value

Session 和 Cookie 的區別

session:保存在服務器
保存的數據是 Object
會隨著會話的結束?銷毀
保存重要信息
cookie:保存在瀏覽器
保存的數據是 String
可以?期保存在瀏覽器中,?會話?關
保存不重要信息

存儲?戶信息:
session

setAttribute("name","admin") //存 getAttribute("name") //取

?命周期:服務端:只要 WEB 應?重啟就銷毀,客戶端:只要瀏覽器關閉就銷毀。
退出登錄:session.invalidate()

cookie

response.addCookie(new Cookie(name,"admin")) //存Cookie[] cookies = request.getCookies(); //取 for (Cookie cookie:cookies){if(cookie.getName().equals("name")){out.write("歡迎回來"+cookie.getValue());} }

?命周期:不隨服務端的重啟?銷毀,客戶端:默認是只要關閉瀏覽器就銷毀,我們通過 setMaxAge()
?法設置有效期,?旦設置了有效期,則不隨瀏覽器的關閉?銷毀,?是由設置的時間來決定。
退出登錄:setMaxAge(0)

JSP 內置對象作?域

4個
page、request、session、application
setAttribute、getAttribute
page 作?域:對應的內置對象是 pageContext。
request 作?域:對應的內置對象是 request。
session 作?域:對應的內置對象是 session。
application 作?域:對應的內置對象是 application。

page < request < session < application

page 只在當前??有效。
request 在?次請求內有效。
session 在?次會話內有效。
application 對應整個 WEB 應?的。

  • ?站訪問量統計
<%Integer count = (Integer) application.getAttribute("count");if(count == null){count = 1;application.setAttribute("count",count);}else{count++;application.setAttribute("count",count);} %> 您是當前的第<%=count%>位訪客

EL 表達式

Expression Language 表達式語?,替代 JSP ??中數據訪問時的復雜編碼,可以?常便捷地取出域對
象(pageContext、request、session、application)中保存的數據,前提是?定要先 setAttribute,
EL 就相當于在簡化 getAttribute
${變量名} 變量名就是 setAttribute 對應的 key 值。

1、EL 對于 4 種域對象的默認查找順序:

pageContext ====> request ====> session ====> application

按照上述的順序進?查找,找到?即返回,在 application 中也?法找到,則返回 null

2、指定作?域進?查找
pageContext:${pageScope.name}
request:${requestScope.name}
session:${sessionScope.name}
application:${applicationScope.name}

數據級聯:

<% // pageContext.setAttribute("name","page"); // request.setAttribute("name","request"); // session.setAttribute("name","session"); // application.setAttribute("name","application");User user = new User(1,"張三",86.5,new Address(1,"?寨"));System.out.println(user.toString());pageContext.setAttribute("user",user); %><table><tr><th>編號</th><th>姓名</th><th>成績</th><th>地址</th></tr><tr><td>${user.id}</td><td>${user.name}</td><td>${user.score}</td><td>${user.address}</td></tr></table>

${user[“id”]}

EL 執?表達式:

${num1&&num2} && || ! < > <= <= == && and || or ! not == eq != ne < lt > gt <= le >= ge empty //變量為 null,?度為0的String,size為0的集合


JSTL

JSP Standard Tag Library JSP 標準標簽庫,JSP 為開發者提供的?系列的標簽,使?這些標簽可以完成
?些邏輯處理,?如循環遍歷集合,讓代碼更加簡潔,不再出現 JSP 腳本穿插的情況。
實際開發中 EL 和 JSTL 結合起來使?,JSTL 側重于邏輯處理,EL 負責展示數據。

JSTL 的使?
1、需要導? jar 包(兩個 jstl.jar standard.jar)存放的位置 web/WEB-INF
2、在 JSP ??開始的地?導? JSTL 標簽庫

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

3、在需要的地?使?

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

JSTL 優點:
1、提供了統?的標簽
2、可以?于編寫各種動態功能

  • 核?標簽庫常?標簽:

set、out、remove、catch

set:向域對象中添加數據

<%requset.setAttribute(key,value) %> <c:set var="name" value="tom" scope="request"></c:set> ${requestScope.name} <% User user = new User(1,"張三",66.6,new Address(1,"科技路")); request.setAttribute("user",user); %> ${user.name} <hr/> <c:set target="${user}" property="name" value="李四"></c:set> ${user.name}

out:輸出域對象中的數據

<c:set var="name" value="tom"></c:set> <c:out value="${name}" default="未定義"></c:out>

remove:刪除域對象中的數據

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

catch:捕獲異常

<c:catch var="error"><%int a = 10/0;%> </c:catch> ${error}
  • 條件標簽:if choose
<c:set var="num1" value="1"></c:set> <c:set var="num2" value="2"></c:set> <c:if test="${num1>num2}">ok</c:if> <c:if test="${num1<num2}">fail</c:if> <hr/> <c:choose><c:when test="${num1>num2}">ok</c:when><c:otherwise>fail</c:otherwise> </c:choose>
  • 迭代標簽:forEach
<c:forEach items="${list}" var="str" begin="2" end="3" step="2" varStatus="sta">${sta.count}、${str}<br/> </c:forEach>

格式化標簽庫常?的標簽:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><% request.setAttribute("date",new Date()); %> <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"> </fmt:formatDate><br/> <fmt:formatNumber value="32145.23434" maxIntegerDigits="2" maxFractionDigits="3"></fmt:formatNumber>

函數標簽庫常?的標簽:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><% request.setAttribute("info","Java,C"); %> ${fn:contains(info,"Python")}<br/> ${fn:startsWith(info, "Java")}<br/> ${fn:endsWith(info, "C")}<br/> ${fn:indexOf(info, "va")}<br/> ${fn:replace(info, "C","Python")}<br/> ${fn:substring(info, 2, 3)}<br/> ${fn:split(info, ",")[0]}-${fn:split(info, ",")[1]}

過濾器 Filter

功能:
1、?來攔截傳?的請求和傳出的響應。
2、修改或以某種?式處理正在客戶端和服務端之間交換的數據流。
如何使??
與使? Servlet 類似,Filter 是 Java WEB 提供的?個接?,開發者只需要?定義?個類并且實現該接?
即可。

package com.southwind.filter; import javax.servlet.*; import java.io.IOException; public class CharacterFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, seservletResponse, FilterChain filterChain) throws IOException, ServletException{servletRequest.setCharacterEncoding("UTF-8");filterChain.doFilter(servletRequest,servletResponse);} }

web.xml 中配置 Filter

<filter><filter-name>charcater</filter-name><filter-class>com.southwind.filter.CharacterFilter</filter-class> </filter> <filter-mapping><filter-name>charcater</filter-name><url-pattern>/login</url-pattern><url-pattern>/test</url-pattern> </filter-mapping>

【注意】:doFilter ?法中處理完業務邏輯之后,必須添加filterChain.doFilter(servletRequest,servletResponse);
否則請求/響應?法向后傳遞,?直停留在過濾器中。

Filter 的?命周期

當 Tomcat 啟動時,通過反射機制調? Filter 的?參構造函數創建實例化對象,同時調? init ?法實現
初始化,doFilter ?法調?多次,當 Tomcat 服務關閉的時候,調? destory 來銷毀 Filter 對象。
?參構造函數:只調??次,當 Tomcat 啟動時調?(Filter ?定要進?配置)
init ?法:只調??次,當 Filter 的實例化對象創建完成之后調?
doFilter:調?多次,訪問 Filter 的業務邏輯都寫在 Filter 中
destory:只調??次,Tomcat 關閉時調?。

同時配置多個 Filter,Filter 的調?順序是由 web.xml 中的配置順序來決定的,寫在上?的配置先調
?,因為 web.xml 是從上到下順序讀取的。

<filter><filter-name>my</filter-name><filter-class>com.southwind.filter.MyFilter</filter-class> </filter> <filter-mapping><filter-name>my</filter-name><url-pattern>/login</url-pattern> </filter-mapping> <filter><filter-name>charcater</filter-name><filter-class>com.southwind.filter.CharacterFilter</filter-class> </filter> <filter-mapping><filter-name>charcater</filter-name><url-pattern>/login</url-pattern><url-pattern>/test</url-pattern> </filter-mapping>

1、MyFilter
2、CharacterFilter

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

<filter><filter-name>my</filter-name><filter-class>com.southwind.filter.MyFilter</filter-class> </filter> <filter-mapping><filter-name>my</filter-name><url-pattern>/login</url-pattern> </filter-mapping>

等于

@WebFilter("/login") public class MyFilter implements Filter {}

Filter 的使?場景

實際開發中 Filter 的使?場景:
1、統?處理中?亂碼。
2、屏蔽敏感詞。

package com.southwind.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/test") public class WordFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("UTF-8");//將"敏感詞"替換成"***"String name = servletRequest.getParameter("name");name = name.replaceAll("敏感詞","***");servletRequest.setAttribute("name",name);filterChain.doFilter(servletRequest,servletResponse);} } package com.southwind.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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = (String) req.getAttribute("name");System.out.println("servlet:"+name);} }

3、控制資源的訪問權限。

package com.southwind.filter; 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 DownloadFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {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);}} }

?件上傳下載

  • JSP
    1、input 的 type 設置為 file
    2、form 表單的 method 設置 post,get 請求會將?件名傳給服務端,?不是?件本身
    3、form 表單的 enctype 設置 multipart/form-data,以?進制的形式傳輸數據
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><form enctype="multipart/form-data" action="/upload" method="post"><input name="desc" type="text"/><br/><input name="text" type="file"/><br/><input type="submit" value="上傳"/></form> </body> </html>
  • Servlet
    fileupload 組件可以將所有的請求信息都解析成 FileIteam 對象,可以通過對 FileItem 對象的操作完成上傳,?向對象的思想。
package com.southwind.servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; 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.*; import java.util.List; @WebServlet("/upload") public class UploadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// //通過輸?流獲取客戶端傳來的數據流// InputStream inputStream = req.getInputStream();// Reader reader = new InputStreamReader(inputStream);// BufferedReader bufferedReader = new BufferedReader(reader);// //通過輸出流將數據流輸出到本地硬盤// //獲取?件夾的絕對路徑// String path = req.getServletContext().getRealPath("file/copy.txt");// OutputStream outputStream = new FileOutputStream(path);// Writer writer = new OutputStreamWriter(outputStream);// BufferedWriter bufferedWriter = new BufferedWriter(writer);// String str = "";// while((str = bufferedReader.readLine())!=null){// System.out.println(str);// bufferedWriter.write(str);// }// bufferedWriter.close();// writer.close();// outputStream.close();// bufferedReader.close();// reader.close();// inputStream.close();try {DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);List<FileItem> list = servletFileUpload.parseRequest(req);for(FileItem fileItem : list){if(fileItem.isFormField()){String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8");System.out.println(name+":"+value);}else{String fileName = fileItem.getName();long size = fileItem.getSize();System.out.println(fileName+":"+size+"Byte");InputStream inputStream = fileItem.getInputStream();// Reader reader = new InputStreamReader(inputStream);// BufferedReader bufferedReader = new BufferedReader(reader);String path = req.getServletContext().getRealPath("file/"+fileName);OutputStream outputStream = new FileOutputStream(path);// Writer writer = new OutputStreamWriter(outputStream);// BufferedWriter bufferedWriter = new BufferedWriter(writer);int temp = 0;while((temp = inputStream.read())!=-1){outputStream.write(temp);}// bufferedWriter.close();// writer.close();outputStream.close();// bufferedReader.close();// reader.close();inputStream.close();System.out.println("上傳成功");}}} catch (FileUploadException e) {e.printStackTrace();}} }

?件下載

package com.southwind.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.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @WebServlet("/download") public class DownloadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String type = req.getParameter("type");String fileName = "";switch (type){case "png":fileName = "1.png";break;case "txt":fileName = "test.txt";break;}//設置響應?式resp.setContentType("application/x-msdownload");//設置下載之后的?件名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);}inputStream.close();outputStream.close();} }

Ajax

Asynchronous JavaScript And XML:異步的 JavaScript 和 XML
AJAX 不是新的編程,指的是?種交互?式,異步加載,客戶端和服務器的數據交互更新在局部??的
技術,不需要刷新整個??(局部刷新)
優點:
1、局部刷新,效率更?
2、?戶體驗更好

【注】:同步:(打電話);異步:(發微信)

基于 jQuery 的 A JAX:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title><script type="text/javascript" src="js/jquery-3.3.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="button" value="提交"/> </body> </html>

不能?表單提交請求,改? jQuery ?式動態綁定事件來提交。
Servlet 不能跳轉到 JSP,只能將數據返回

package com.southwind.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 {@Overrideprotected 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);} }

傳統的 WEB 數據交互 VS AJAX 數據交互

  • 客戶端請求的?式不同:
    傳統:瀏覽器發送同步請求 (form、a)
    AJAX:異步引擎對象發送異步請求
  • 服務器響應的?式不同:
    傳統:響應?個完整 JSP ??(視圖)
    AJAX:響應需要的數據
  • 客戶端處理?式不同:
    傳統:需要等待服務器完成響應并且重新加載整個??之后,?戶才能進?后續的操作
    AJAX:動態更新??中的局部內容,不影響?戶的其他操作

AJAX 原理

基于 jQuery 的 AJAX 語法

$.ajax({屬性})
常?的屬性參數:
url:請求的后端服務地址
type:請求?式,默認 get
data:請求參數
dataType:服務器返回的數據類型,text/json
success:請求成功的回調函數
error:請求失敗的回調函數
complete:請求完成的回調函數(?論成功或者失敗,都會調?)

JSON

JavaScript Object Notation,?種輕量級數據交互格式,完成 js 與 Java 等后端開發語?對象數據之間
的轉換。
客戶端和服務器之間傳遞對象數據,需要? JSON 格式。

package com.southwind.entity; public class User {private Integer id;private String name;private Double score;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}public User(Integer id, String name, Double score) {this.id = id;this.name = name;this.score = score;} } User user = new User(1,"張三",96.5) var user = {id:1,name:"張三",score:96.5 } package com.southwind.servlet; import com.southwind.entity.User; import net.sf.json.JSONObject; 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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {User user = new User(1,"張三",96.5);//將 Java 對象轉為 JSON 格式resp.setCharacterEncoding("UTF-8");JSONObject jsonObject = JSONObject.fromObject(user);resp.getWriter().write(jsonObject.toString());} } <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title><script type="text/javascript" src="js/jquery-3.3.1.min.js"></script><script type="text/javascript">$(function(){var btn = $("#btn");btn.click(function(){$.ajax({url:'/test',type:'post',dataType:'json',success:function(data){$("#id").val(data.id);$("#name").val(data.name);$("#score").val(data.score);}});});})</script> </head> <body>編號:<input id="id" type="text"/><br/>姓名:<input id="name" type="text"/><br/>成績:<input id="score" type="text"/><br/><input id="btn" type="button" value="提交"/> </body> </html>

AJAX的簡單應用

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title><script type="text/javascript" src="js/jquery-3.3.1.min.js"></script><script type="text/javascript">$(function(){//修改省份$("#province").change(function () {var id = $(this).val();$.ajax({url:"/location",type:"POST",data:"id="+id+"&type=province",dataType:"JSON",success:function(data){var content = "";var cities = data.cities;for(var i=0;i<cities.length;i++){content += "<option>"+cities[i]+"</option>";}$("#city").html(content);content = "";var areas = data.areas;for(var i=0;i<areas.length;i++){content += "<option>"+areas[i]+"</option>";}$("#area").html(content);}});});//修改城市$("#city").change(function(){var id = $(this).val();$.ajax({url:"/location",type:"POST",data:"id="+id+"&type=city",dataType:"JSON",success:function(data){var content = "";for(var i=0;i<data.length;i++){content += "<option>"+data[i]+"</option>";}$("#area").html(content);}});});});</script> </head> <body>省:<select id="province"><option value="陜?省">陜?省</option><option value="河南省">河南省</option><option value="江蘇省">江蘇省</option></select>市:<select id="city"><option value="?安市">?安市</option><option value="寶雞市">寶雞市</option><option value="渭南市">渭南市</option></select>區:<select id="area"><option>雁塔區</option><option>蓮湖區</option><option>新城區</option></select> </body> </html> package com.southwind.entity; import java.util.List; public class Location {private List<String> cities;private List<String> areas;public List<String> getCities() {return cities;}public void setCities(List<String> cities) {this.cities = cities;}public List<String> getAreas() {return areas;}public void setAreas(List<String> areas) {this.areas = areas;} } package com.southwind.servlet; import com.southwind.entity.Location; import net.sf.json.JSONArray; import net.sf.json.JSONObject; 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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @WebServlet("/location") public class LocationServlet extends HttpServlet {private static Map<String, List<String>> cityMap;private static Map<String,List<String>> provinceMap;static {cityMap = new HashMap<>();List<String> areas = new ArrayList<>();//?安areas.add("雁塔區");areas.add("蓮湖區");areas.add("新城區");cityMap.put("?安市",areas);//寶雞areas = new ArrayList<>();areas.add("陳倉區");areas.add("渭賓區");areas.add("新城區");cityMap.put("寶雞市",areas);//渭南areas = new ArrayList<>();areas.add("臨渭區");areas.add("?新區");cityMap.put("渭南市",areas);//鄭州areas = new ArrayList<>();areas.add("鄭州A區");areas.add("鄭州B區");cityMap.put("鄭州市",areas);//洛陽areas = new ArrayList<>();areas.add("洛陽A區");areas.add("洛陽B區");cityMap.put("洛陽市",areas);provinceMap = new HashMap<>();List<String> cities = new ArrayList<>();cities.add("?安市");cities.add("寶雞市");cities.add("渭南市");provinceMap.put("陜?省",cities);cities = new ArrayList<>();cities.add("鄭州市");cities.add("洛陽市");cities.add("開封市");provinceMap.put("河南省",cities);cities = new ArrayList<>();cities.add("南京市");cities.add("蘇州市");cities.add("南通市");provinceMap.put("江蘇省",cities);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String type = req.getParameter("type");resp.setCharacterEncoding("UTF-8");String id = req.getParameter("id");switch (type){case "city":List<String> areas = cityMap.get(id);JSONArray jsonArray = JSONArray.fromObject(areas);resp.getWriter().write(jsonArray.toString());break;case "province":List<String> cities = provinceMap.get(id);String city = cities.get(0);List<String> cityAreas = cityMap.get(city);Location location = new Location();location.setCities(cities);location.setAreas(cityAreas);JSONObject jsonObject = JSONObject.fromObject(location);resp.getWriter().write(jsonObject.toString());break;}} }

JDBC

Java DataBase Connectivity 是?個獨?于特定數據庫的管理系統,通?的 SQL 數據庫存取和操作的公
共接?。
定義了?組標準,為訪問不同數據庫提供了統?的途徑。

JDBC 體系結構

JDBC 接?包括兩個層?:

  • ?向應?的 API,供程序員調?
  • ?向數據庫的 API,供?商開發數據庫的驅動程序

JDBC API
提供者:Java 官?
內容:供開發者調?的接?
java.sql 和 javax.sql

  • DriverManager 類
  • Connection 接?
  • Statement 接?
  • ResultSet 接?

DriverManager
提供者:Java 官?
作?:管理不同的 JDBC 驅動
JDBC 驅動
提供者:數據庫?商
作?:負責連接不同的數據庫

JDBC 的使?

1、加載數據庫驅動,Java 程序和數據庫之間的橋梁。
2、獲取 Connection,Java 程序與數據庫的?次連接。
3、創建 Statement 對象,由 Connection 產?,執? SQL 語句。
4、如果需要接收返回值,創建 ResultSet 對象,保存 Statement 執?之后所查詢到的結果。

package com.southwind.test; import java.sql.*; import java.util.Date; public class Test {public static void main(String[] args) {try {//加載驅動Class.forName("com.mysql.cj.jdbc.Driver");//獲取連接String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url,user,password);// String sql = "insert into student(name,score,birthday) values('李四',78,'2019-01-01')";// String sql = "update student set name = '李四'";// String sql = "delete from student";// Statement statement = connection.createStatement();// int result = statement.executeUpdate(sql);String sql = "select * from student";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){Integer id = resultSet.getInt("id");String name = resultSet.getString(2);Double score = resultSet.getDouble(3);Date date = resultSet.getDate(4);System.out.println(id+"-"+name+"-"+score+"-"+date);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e){e.printStackTrace();}} }

PreparedStatement

Statement 的?類,提供了 SQL 占位符的功能
使? Statement 進?開發有兩個問題:
1、需要頻繁拼接 String 字符串,出錯率較?。
2、存在 SQL 注?的?險。
SQL 注?:利?某些系統沒有對?戶輸?的信息進?充分檢測,在?戶輸?的數據中注??法的 SQL
語句,從?利?系統的 SQL 引擎完成惡意?為的做法。

String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"; String user = "root"; String password = "root"; Connection connection = DriverManager.getConnection(url,user,password); String username = "lisi"; String mypassword = "000"; String sql = "select * from t_user where username = ? and password = ?"; System.out.println(sql); PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,username); preparedStatement.setString(2,mypassword); ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()){System.out.println("登錄成功"); }else{System.out.println("登錄失敗"); } } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e){e.printStackTrace(); }

數據庫連接池

JDBC 開發流程

  • 加載驅動(只需要加載?次)
  • 建?數據庫連接(Connection)
  • 執? SQL 語句(Statement)
  • ResultSet 接收結果集(查詢)
  • 斷開連接,釋放資源

數據庫連接對象是通過 DriverManager 來獲取的,每次獲取都需要向數據庫申請獲取連接,驗證?戶
名和密碼,執?完 SQL 語句后斷開連接,這樣的?式會造成資源的浪費,數據連接資源沒有得到很好的重復利?。(栗子:就像是你每次打一個電話都要買一個手機,打完一個電話就把手機扔了,很浪費,為什么我們不一直使用第一次買的手機一直打電話呢?)

可以使?數據庫連接池解決這?問題。
數據庫連接池的基本思想就是為數據庫建??個緩沖池,預先向緩沖池中放??定數量的連接對象,當需要獲取數據庫連接的時候,只需要從緩沖池中取出?個對象,?完之后再放回到緩沖池中,供下?次請求使?,做到了資源的重復利?,允許程序重復使??個現有的數據庫連接對象,?不需要重新創
建。
當數據庫連接池中沒有空閑的連接時,新的請求就會進?等待隊列,等待其他線程釋放連接。

數據庫連接池實現

JDBC 的數據庫連接池使? javax.sql.DataSource 接?來完成的,DataSource 是 Java 官?提供的接
?,使?的時候開發者并不需要??來實現該接?,可以使?第三?的?具,C3P0 是?個常?的第三
?實現,實際開發中直接使? C3P0 即可完成數據庫連接池的操作。
1、導? jar 包
傳統?式拿到的 Connection:com.mysql.cj.jdbc.ConnectionImpl@557caf28
C3P0 拿到的 Connection:com.mchange.v2.c3p0.impl.NewProxyConnection@4988d8b8
2、代碼實現

package com.southwind.test; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; public class DataSourceTest {public static void main(String[] args) {try {//創建C3P0ComboPooledDataSource dataSource = new ComboPooledDataSource();dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");dataSource.setUser("root");dataSource.setPassword("root");Connection connection = dataSource.getConnection();System.out.println(connection);//還回到數據庫連接池中connection.close();} catch (PropertyVetoException e) {e.printStackTrace();} catch (SQLException e){e.printStackTrace();}} }


實際開發,將 C3P0 的配置信息定義在 xml ?件中,Java 程序只需要加載配置?件即可完成數據庫連接
池的初始化操作。
1、配置?件的名字必須是 c3p0-config.xml
2、初始化 ComboPooledDataSource 時,傳?的參數必須是 c3p0-config.xml 中 named-config 標簽的 name 屬性值

<?xml version="1.0" encoding="UTF-8"?> <c3p0-config><named-config name="testc3p0"><!-- 指定連接數據源的基本屬性 --><property name="user">root</property><property name="password">root</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/library?useUnicode=true&amp;characterEncoding=UTF-8</property><!-- 若數據庫中連接數不?時, ?次向數據庫服務器申請多少個連接 --><property name="acquireIncrement">5</property><!-- 初始化數據庫連接池時連接的數量 --><property name="initialPoolSize">20</property><!-- 數據庫連接池中的最?的數據庫連接數 --><property name="minPoolSize">2</property><!-- 數據庫連接池中的最?的數據庫連接數 --><property name="maxPoolSize">40</property></named-config> </c3p0-config> package com.southwind.test; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; public class DataSourceTest {public static void main(String[] args) {try {//創建C3P0ComboPooledDataSource dataSource = new ComboPooledDataSource("testc3p0");Connection connection = dataSource.getConnection();System.out.println(connection);//還回到數據庫連接池中connection.close();} catch (SQLException e){e.printStackTrace();}} }

DBUtils

DBUtils 可以幫助開發者完成數據的封裝(結果集到 Java 對象的映射)
1、導? jar 包
ResultHandler 接?是?來處理結果集,可以將查詢到的結果集轉換成 Java 對象,提供了 4 種實現類。

  • BeanHandler 將結果集映射成 Java 對象 Student
  • BeanListHandler 將結果集映射成 List 集合List <Student >
  • MapHandler 將結果集映射成 Map 對象
  • MapListHandler 將結果集映射成 MapList 結合

【注】:根據返回值決定以上handler。

public static Student findByDBUtils(Integer id){Connection connection = null;Student student = null;try {connection = dataSource.getConnection();String sql = "select * from student";//String sql = "select * from student where id=?";QueryRunner queryRunner = new QueryRunner();List<Map<String,Object>> list = queryRunner.query(connection,sql,new MapListHandler());//List<Map<String,Object>> list = queryRunner.query(connection,sql,new BeanHandler<>(Student.class),id);for (Map<String,Object> map:list){System.out.println(map);}} catch (SQLException e) {e.printStackTrace();} finally {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}return student; }


【代碼來源】參考楠哥教學視頻:https://www.bilibili.com/video/BV1BJ411L7NR
【JavaWeb實戰代碼及所需jar包】:https://download.csdn.net/download/hhhmonkey/21516713

總結

以上是生活随笔為你收集整理的JavaWeb基础学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产日韩欧美一区 | 欧美国产三级 | 红桃视频国产精品 | 午夜视频一区二区 | 日日摸日日干 | 日韩乱淫| 日本五十肥熟交尾 | 色综合狠狠 | 欧美顶级毛片在线播放 | a级片毛片| 欧美天堂在线视频 | 免费在线观看网址 | 国产xxxxx在线观看 | 欧美一级做a爰片免费视频 成人激情在线观看 | 国产亚洲精品精品国产亚洲综合 | 蜜臀久久99精品久久久画质超高清 | 日韩美女在线视频 | 欧美少妇诱惑 | av网站大全在线观看 | 国产最爽的乱淫视频国语对白 | 日韩福利视频导航 | 国产一区二区三区免费观看 | 在线观看av国产一区二区 | 深夜福利在线播放 | 自拍视频一区 | 国产999在线 | 久久国产激情 | 69视频一区二区 | 超碰午夜 | 中文字幕一区二区三区人妻电影 | 国产69精品久久久久久久久久 | 加勒比伊人 | 欧美日韩一二三区 | 天堂网va| 天堂va欧美ⅴa亚洲va一国产 | 日本裸体网站 | 99热99热| 国产午夜精品在线 | 超碰超碰超碰超碰 | 怡红院最新网址 | 国产精品嫩草影院桃色 | jizz欧美性23 | 欧美精品在线免费观看 | 久久久成人免费视频 | 午夜成人鲁丝片午夜精品 | 色综合亚洲 | 欧美全黄 | 欧美一区二区激情 | 中文字幕在线观看91 | 亚洲黄色a级片 | 日韩一区二区三区视频在线观看 | 粉嫩av四季av绯色av | 欧美做受高潮1 | 亚洲天堂首页 | 国产午夜精品一区二区三区四区 | 国产一区二区在线免费 | 国产精品v日韩精品v在线观看 | 在线国产视频 | 亚洲av无码专区在线电影 | 无码人妻精品一区二区中文 | 国产激情视频在线播放 | 中文字幕日韩一区二区三区不卡 | 嫩草影院污 | 成为性瘾网黄的yy对象后 | 四虎黄色影院 | 国产成人精品视频 | 亚洲一区二区精华 | 黄色成人在线视频 | 欧美一区二区不卡视频 | 成人免费高清在线观看 | 日日夜夜狠狠干 | 久久国产一级 | 在线高清免费观看 | 国产一区二区三区在线免费 | 91久久精品国产 | 一区二区三区中文字幕在线观看 | 黄色香蕉网 | 日本成人精品在线 | 天天操夜夜操视频 | 日韩天堂av | 精品国产免费一区二区三区 | 日韩av在线影院 | 国产精品 欧美 日韩 | 亚洲三级电影网站 | 一级艳片新婚之夜 | 男人日女人的网站 | 一区二区视 | 亚洲中午字幕 | 日韩午夜三级 | 亚洲国产一区视频 | 99热2| 成人一区二区三区仙踪林 | 日本狠狠干 | 久久久久久亚洲av毛片大全 | 91蝌蚪少妇 | 亚洲制服丝袜av | 久久夜色av| 凹凸日日摸日日碰夜夜 | 日韩成人在线影院 |