JavaWeb(kuang)
目錄
5、Maven
5.1 Maven項(xiàng)目架構(gòu)管理工具
5.2下載安裝Maven
5.3配置環(huán)境變量
5.4阿里云鏡像
5.5本地倉(cāng)庫(kù)
5.6在IDEA中使用Maven
5.7 創(chuàng)建一個(gè)普通的maven項(xiàng)目
?5.8 標(biāo)記文件夾功能
1.在打鉤的maven項(xiàng)目要自己建立這兩個(gè)目錄
2.項(xiàng)目結(jié)構(gòu)配置1
3.項(xiàng)目結(jié)構(gòu)配置2?
?4.maven的target目錄
?5.9 在IDEA中配置Tomcat
1. 點(diǎn)擊加號(hào)?
?2.使用本地tomcat
?3.tomcat相關(guān)配置?
4.解決警告問(wèn)題、新建artifacts
?5.虛擬路徑配置?
?6.啟動(dòng)路徑
?7.啟動(dòng)成功
?5.10 pom文件
1.pom.xml是Maven的核心配置文件
2.Maven的高級(jí)之處在于,他會(huì)幫你導(dǎo)入這個(gè)JAR包所依賴的其他jar,我只導(dǎo)入一個(gè)包,他可以幫我導(dǎo)入這個(gè)jar所依賴的其他包
3.maven由于他的約定大于配置,我們之后可以能遇到我們寫(xiě)的配置文件,無(wú)法被導(dǎo)出或者生效的問(wèn)題,解決方
5.12 IDEA目錄樹(shù)
?6、Servlet
6.1、Servlet簡(jiǎn)介
6.2、HelloServlet
6.2、HelloServlet
構(gòu)建一個(gè)普通的Maven項(xiàng)目,清理里面的src目錄,以后我們的學(xué)習(xí)就在這個(gè)項(xiàng)目里面建立Moudel;這個(gè)空的工程就題Maven主工程;
關(guān)于Maven父子工程的理解;
3.Maven環(huán)境優(yōu)化
4.編寫(xiě)一個(gè)Servlet程序
5.編寫(xiě)Servlet的映射
6.配置Tomcat
?7.啟動(dòng)測(cè)試,生成targer!
6.3、Servlet原理
?6.4、Mapping問(wèn)題
一個(gè)Servlet可以指定一個(gè)映射路徑
?? 2.一個(gè)servlet可以指定多個(gè)映射路徑
3.一個(gè)servlet可以指定通用映射路徑
4.默認(rèn)請(qǐng)求路徑
5.指定一些后綴或者前綴等等…
6.優(yōu)先級(jí)問(wèn)題
6.5、ServletContext
1、共享數(shù)據(jù)
2、獲取初始化參數(shù)
3、請(qǐng)求轉(zhuǎn)發(fā)
?
4、讀取資源文件servlet讀取peoperties配置文件
6.6、HttpServletResponse(下載文件、驗(yàn)證碼、重定向)
1、簡(jiǎn)單分類(lèi)
1.負(fù)責(zé)向?yàn)g覽器發(fā)送數(shù)據(jù)的方法
2. 負(fù)責(zé)向?yàn)g覽器發(fā)送響應(yīng)頭的方法
2、下載文件
?? 1. 向?yàn)g覽器輸出消息??? 2.瀏覽器下載文件要設(shè)置頭resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
3、驗(yàn)證碼功能
4.重定向(原理)
6.7、HttpServletRequest
5、Maven
我為什么要學(xué)習(xí)這個(gè)技術(shù)?
由此,Maven誕生了!
5.1 Maven項(xiàng)目架構(gòu)管理工具
我們目前用來(lái)就是方便導(dǎo)入jar包的!
Maven的核心思想:約定大于配置
- 有約束,不要去違反。
Maven會(huì)規(guī)定好你該如何去編寫(xiě)我們Java代碼,必須要按照這個(gè)規(guī)范來(lái);
5.2下載安裝Maven
官網(wǎng):Maven – Welcome to Apache Maven
?下載完成后,解壓即可;
5.3配置環(huán)境變量
在我們的系統(tǒng)環(huán)境變量中配置如下配置:
- M2_HOME maven目錄下的bin目錄
- MAVEN_HOME maven的目錄
- 在系統(tǒng)的path中配置%MAVEN_HOME%\bin
測(cè)試Maven是否安裝成功,保證必須配置完畢!
5.4阿里云鏡像
- 鏡像:mirrors
- 作用:加速我們的下載
- 國(guó)內(nèi)建議使用阿里云的鏡像
5.5本地倉(cāng)庫(kù)
在本地的倉(cāng)庫(kù),遠(yuǎn)程倉(cāng)庫(kù);
建立一個(gè)本地倉(cāng)庫(kù):localRepository
<localRepository>D:\qianfeng\maven\apache-maven-3.6.2\maven-repo</localRepository>5.6在IDEA中使用Maven
1.啟動(dòng)idea
?2.創(chuàng)建一個(gè)Maven項(xiàng)目
?
3. 等待項(xiàng)目導(dǎo)入初始化完畢
4.觀察maven倉(cāng)庫(kù)中多了什么東西?
5.IDEA中的Maven設(shè)置
注意:IDEA項(xiàng)目創(chuàng)建成功后,看一眼Maven的配置
?6.到這里,Maven在IDEA中的配置和使用就OK了!
5.7 創(chuàng)建一個(gè)普通的maven項(xiàng)目
?這是一個(gè)干凈的maven工程
這個(gè)只有在web應(yīng)用下才會(huì)有! 就是之前打上的√
?5.8 標(biāo)記文件夾功能
1.在打鉤的maven項(xiàng)目要自己建立這兩個(gè)目錄
2.項(xiàng)目結(jié)構(gòu)配置1
?
3.項(xiàng)目結(jié)構(gòu)配置2
?
?4.maven的target目錄
?5.9 在IDEA中配置Tomcat
1. 點(diǎn)擊加號(hào)
?2.使用本地tomcat
?3.tomcat相關(guān)配置
4.解決警告問(wèn)題、新建artifacts
必須要配置:為什么會(huì)有這個(gè)問(wèn)題:我們?cè)L問(wèn)一個(gè)網(wǎng)站,需要指定一個(gè)文件夾名字;
?
?5.虛擬路徑配置
?6.啟動(dòng)路徑
?7.啟動(dòng)成功
?5.10 pom文件
1.pom.xml是Maven的核心配置文件
?2.pom.xml數(shù)據(jù)結(jié)構(gòu)
<?xml version="1.0" encoding="UTF-8"?> <!--maven版本和頭文件--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion> <!--這里是配置我們剛配置的GAV--><groupId>org.example</groupId><artifactId>javaweb-01-maven</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging> <!--package:項(xiàng)目的打包方式j(luò)ar:java應(yīng)用war:javaWeb應(yīng)用 --><name>javaweb-01-maven Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url> <!--配置--><properties> <!-- 項(xiàng)目的默認(rèn)構(gòu)建編碼--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 編碼版本--><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties> <!--項(xiàng)目依賴--><dependencies> <!-- 具體依賴jar包配置文件--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><finalName>javaweb-01-maven</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></pluginManagement></build></project>2.Maven的高級(jí)之處在于,他會(huì)幫你導(dǎo)入這個(gè)JAR包所依賴的其他jar,我只導(dǎo)入一個(gè)包,他可以幫我導(dǎo)入這個(gè)jar所依賴的其他包
3.maven由于他的約定大于配置,我們之后可以能遇到我們寫(xiě)的配置文件,無(wú)法被導(dǎo)出或者生效的問(wèn)題,解決方
<resources><resource><directory>src/main/resources</directory><excludes><exclude>**/*.properties</exclude><exclude>**/*.xml</exclude></excludes><filtering>false</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources>5.12 IDEA目錄樹(shù)
?6、Servlet
6.1、Servlet簡(jiǎn)介
- Servlet就是sun公司開(kāi)發(fā)動(dòng)態(tài)web的一門(mén)技術(shù)
- Sun在這些APi中提供一個(gè)接口叫做:Servlet,如果你想開(kāi)發(fā)一個(gè)Servlet程序,只需要完成兩個(gè)小步驟:
- 編寫(xiě)一個(gè)類(lèi),實(shí)現(xiàn)Serlet接口
- 把開(kāi)發(fā)好java類(lèi)部署到web服務(wù)器中。
把實(shí)現(xiàn)了Servlet接口的Java程序叫做,Servlet
6.2、HelloServlet
Serlvet接口Sun公司有兩個(gè)默認(rèn)的實(shí)現(xiàn)類(lèi):HttpServlet,GenericServled
6.2、HelloServlet
構(gòu)建一個(gè)普通的Maven項(xiàng)目,清理里面的src目錄,以后我們的學(xué)習(xí)就在這個(gè)項(xiàng)目里面建立Moudel;這個(gè)空的工程就題Maven主工程;
關(guān)于Maven父子工程的理解;
父項(xiàng)目中會(huì)有
<modules><module>servlet-01</module></modules>子項(xiàng)目會(huì)有
<parent><artifactId>javaweb-02-servlet</artifactId><groupId>com.kuang</groupId><version>1.0-SNAPSHOT</version></parent>父項(xiàng)目中的java子項(xiàng)目可以直接使用
3.Maven環(huán)境優(yōu)化
- 修改web.xml為最新的
- 將maven的結(jié)構(gòu)搭建完整
4.編寫(xiě)一個(gè)Servlet程序
5.編寫(xiě)Servlet的映射
????????為什么需要映射:我們寫(xiě)的是JAVA程序,但是要通過(guò)瀏覽器訪問(wèn),而瀏覽器需要連接web服務(wù)器,所以我們需要再web服務(wù)中注冊(cè)我們寫(xiě)的Servlet,還需給他一個(gè)瀏覽器能夠訪問(wèn)的路徑;
<!--注冊(cè)Servlet--><servlet><servlet-name>hello</servlet-name><servlet-class>com.kuang.servlet.HelloServlet</servlet-class></servlet><!--Servlet的請(qǐng)求路徑--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>6.配置Tomcat
注意:配置項(xiàng)目發(fā)布的路徑就可以了
?
?7.啟動(dòng)測(cè)試,生成targer!
6.3、Servlet原理
Servlet是由Web服務(wù)器調(diào)用,web服務(wù)器在收到瀏覽器請(qǐng)求之后,會(huì):
?6.4、Mapping問(wèn)題
一個(gè)Servlet可以指定一個(gè)映射路徑
?? 2.一個(gè)servlet可以指定多個(gè)映射路徑
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello2</url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello3</url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello4</url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello5</url-pattern></servlet-mapping>3.一個(gè)servlet可以指定通用映射路徑
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello/*</url-pattern></servlet-mapping>4.默認(rèn)請(qǐng)求路徑
<!--默認(rèn)請(qǐng)求路徑--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>5.指定一些后綴或者前綴等等…
<!--可以自定義后綴實(shí)現(xiàn)請(qǐng)求映射注意點(diǎn),*前面不能加項(xiàng)目映射的路徑hello/sajdlkajda.qinjiang--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>*.qinjiang</url-pattern></servlet-mapping>6.優(yōu)先級(jí)問(wèn)題
????????指定了固有的映射路徑優(yōu)先級(jí)最高,如果找不到就會(huì)走默認(rèn)的處理請(qǐng)求;
????????只能以*或/開(kāi)頭
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><!--404--><servlet><servlet-name>error</servlet-name><servlet-class>com.kuang.servlet.ErrorServlet</servlet-class></servlet><servlet-mapping><servlet-name>error</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>6.5、ServletContext
????????web容器在啟動(dòng)的時(shí)候,它會(huì)為每個(gè)web程序都創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象,它代表了當(dāng)前的web應(yīng)用;
1、共享數(shù)據(jù)
| servlet方法 | 說(shuō)明 |
| this.getInitParameter() | 初始化參數(shù) |
| this.getServletConfig()? | Servlet配置 |
| this.getServletContext() | Servlet上下文 |
| this.getServletContext().getRealPath("文件") | 獲取文件路徑 |
?
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//this.getInitParameter() 初始化參數(shù)//this.getServletConfig() Servlet配置//this.getServletContext() Servlet上下文ServletContext context = this.getServletContext();String username = "文靜"; //數(shù)據(jù)context.setAttribute("username",username); //將一個(gè)數(shù)據(jù)保存在了ServletContext中,名字為:username 。值 username}} public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();String username = (String) context.getAttribute("username");resp.setContentType("text/html");resp.setCharacterEncoding("utf-8");resp.getWriter().print("名字"+username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} } <servlet><servlet-name>hello</servlet-name><servlet-class>com.kuang.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><servlet><servlet-name>getc</servlet-name><servlet-class>com.kuang.servlet.GetServlet</servlet-class></servlet><servlet-mapping><servlet-name>getc</servlet-name><url-pattern>/getc</url-pattern></servlet-mapping>測(cè)試訪問(wèn)結(jié)果;
| ServletContext context = this.getServletContext(); | 說(shuō)明 |
| context.getInitParameter | 獲得web.xml配置的初始化參數(shù)<context-param> |
| context.getRequestDispatcher("/gp").forward(req,resp); | //轉(zhuǎn)發(fā)的請(qǐng)求路徑、forward實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā); |
| this.getServletContext().getResourceAsStream() | 讀取資源文件servlet讀取peoperties配置文件 |
2、獲取初始化參數(shù)
<!--配置一些web應(yīng)用初始化參數(shù)--><context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/mybatis</param-value></context-param>3、請(qǐng)求轉(zhuǎn)發(fā)
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();System.out.println("進(jìn)入了ServletDemo04");//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //轉(zhuǎn)發(fā)的請(qǐng)求路徑//requestDispatcher.forward(req,resp); //調(diào)用forward實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā);context.getRequestDispatcher("/gp").forward(req,resp); }4、讀取資源文件servlet讀取peoperties配置文件
Properties:根據(jù)target目錄那,要 / 開(kāi)頭
- 在java目錄下新建properties
- 在resources目錄下新建properties
發(fā)現(xiàn):都被打包到了同一個(gè)路徑下:classes,我們俗稱這個(gè)路徑為classpath:類(lèi)路徑
思路:需要一個(gè)文件流
訪問(wèn)測(cè)試即可ok;
6.6、HttpServletResponse(下載文件、驗(yàn)證碼、重定向)
web服務(wù)器接收到客戶端的http請(qǐng)求,針對(duì)這個(gè)請(qǐng)求,分別創(chuàng)建一個(gè)代表請(qǐng)求的HttpServletRequest對(duì)象,代表響應(yīng)的一個(gè)HttpServletResponse;
- 如果要獲取客戶端請(qǐng)求過(guò)來(lái)的參數(shù):找HttpServletRequest
- 如果要給客戶端響應(yīng)一些信息:找HttpServletResponse
1、簡(jiǎn)單分類(lèi)
1.負(fù)責(zé)向?yàn)g覽器發(fā)送數(shù)據(jù)的方法
servletOutputstream getOutputstream() throws IOException;Printwriter getwriter() throws IOException;2. 負(fù)責(zé)向?yàn)g覽器發(fā)送響應(yīng)頭的方法
void setCharacterEncoding(String var1);//常用 void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1);//常用 void setDateHeader(String varl,long var2) void addDateHeader(String var1,long var2) void setHeader(String var1,String var2); void addHeader(String var1,String var2); void setIntHeader(String var1,int var2); void addIntHeader(String varl,int var2);響應(yīng)的狀態(tài)碼
2、下載文件
?? 1. 向?yàn)g覽器輸出消息
??? 2.瀏覽器下載文件要設(shè)置頭resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
- ??????? 要獲取下載文件的路徑
- ??????? 下載的文件名是啥?
- ??????? 設(shè)置想辦法讓瀏覽器能夠支持下載我們需要的東西
- ??????? 獲取下載文件的輸入流
- ??????? 創(chuàng)建緩沖區(qū)
- ??????? 獲取OutputStream對(duì)象
- ??????? 將FileOutputStream流寫(xiě)入到bufer緩沖區(qū)
- ??????? 使用OutputStream將緩沖區(qū)中的數(shù)據(jù)輸出到客戶端!
3、驗(yàn)證碼功能
驗(yàn)證怎么來(lái)的?
- 前端實(shí)現(xiàn)
- 后端實(shí)現(xiàn),需要用到Java的圖片類(lèi),生產(chǎn)一個(gè)圖片
4.重定向(原理)
常見(jiàn)場(chǎng)景:
- 用戶登錄
測(cè)試:
@override protected void doGet(HttpservletRequest req, HttpservletResponse resp) throws ServletException, IOException {resp. sendRedirect("/r/img");//重定向/*resp. setHeader("Location","/r/img");resp. setstatus (302);* }?index.jsp
<html><body><h2>Hel1o World!</h2>《%--這里超交的路徑,需要尋找到項(xiàng)目的路徑--%><%--${pageContext. request, contextPath}代表當(dāng)前的項(xiàng)目--%><form action="${pageContext. request.contextPath}/login" method="get">用戶名: <input type="text" name="username"> <br>密碼: <input type="password" name="password"> <br><input type="submit"></form></body> </html>RequestTest.java
public class RequestTest extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//處理方求String username = req.getParameter( s: "username");String password rea.getParameter( s: "password");System.out.println(username+":"+password);resp.sendRedirect(s: "/r/success.jsp"); }重定向頁(yè)面success.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %> <html><head><title>Title</title></head><body><h1>success</h1></body> </html>web.xml配置
<servlet><servlet-name>requset</servlet-name><servlet-class>com. kuang. servlet. RequestTest</servlet-class></servlet><servlet-mapping><servlet-name>requset</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>導(dǎo)入依賴的jar包
<dependencies><!-- https://mvnrepository. com/artifact/javax. servLet/javax. servlet-opi --><dependency><groupld>javax.servlet</grouptd><artifactId>javax. servlet-api</artifactId><version>4.0.1</version></dependency><!-- https://mvnrepository.com/artifact/javax. servLet.jsp/javax. servLet.jsp-opi --><dependency><groupId>javax.servlet.jsp</groupld><artifactId>javax. servlet.jsp-api</artifactId><version>2.3.3</version></dependency></dependencies></project>6.7、HttpServletRequest
????????HttpServletRequest代表客戶端的請(qǐng)求,用戶通過(guò)Http協(xié)議訪問(wèn)服務(wù)器, HTTP請(qǐng)求中的所有信息會(huì)被封裝到HttpServletRequest,通過(guò)這個(gè)HttpServletRequest的方法,獲得客戶端的所有信息;
| 方法 | 說(shuō)明 |
| req.getParameter | 通過(guò)參數(shù)獲得value |
| req.getParameterValues | 通過(guò)參數(shù)獲得多個(gè)values值CheckBox |
| req.getRequestDispatcher("/success.jsp").forward(req,resp); | 請(qǐng)求轉(zhuǎn)發(fā),這里的/表示當(dāng)前項(xiàng)目了,不用加rep.getContextPath(),重定向就需要 |
| req.getContextPage() | 當(dāng)前項(xiàng)目名,tomcat里配的路徑 |
| req.getServletPath() | web映射配置的路徑 |
自己創(chuàng)建類(lèi),且需要繼承HttpServlet類(lèi)
@Override protected void doGet(HttpservletRequest req. HttpservletResponse resp) throws ServletException, IOException {req. setcharacterEncoding("utf-8");resp.setcharacterEncoding("utf-8");String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbys = req.getParameterValues("hobbys");System.out.println("==========");//后臺(tái)接收中文亂碼問(wèn)題System. out.println(username);System. out.println(password);System. out.println(Arrays.tostring(hobbys));System. out.println("============");system. out.println(req.getContextPath());//通過(guò)請(qǐng)求轉(zhuǎn)發(fā)//這里的/代表當(dāng)前的web應(yīng)用req.getRequestDispatcher("/success.jsp").forward(req,resp); }14、JDBC
1.什么是JDBC : Java連接數(shù)據(jù)庫(kù)
?
2.需要jar包的支持:
- java.sql
- javax.sql
- mysql-conneter-java… 連接驅(qū)動(dòng)(必須要導(dǎo)入)
3.實(shí)驗(yàn)環(huán)境搭建
CREATE TABLE users(id INT PRIMARY KEY,`name` VARCHAR(40),`password` VARCHAR(40),email VARCHAR(60),birthday DATE );INSERT INTO users(id,`name`,`password`,email,birthday) VALUES(1,'張三','123456','zs@qq.com','2000-01-01'); INSERT INTO users(id,`name`,`password`,email,birthday) VALUES(2,'李四','123456','ls@qq.com','2000-01-01'); INSERT INTO users(id,`name`,`password`,email,birthday) VALUES(3,'王五','123456','ww@qq.com','2000-01-01');SELECT * FROM users;4.導(dǎo)入數(shù)據(jù)庫(kù)依賴
<!--mysql的驅(qū)動(dòng)--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version> </dependency>5.JDBC 固定步驟:
6.預(yù)編譯SQL
public class TestJDBC2 {public static void main(String[] args) throws Exception {//配置信息//useUnicode=true&characterEncoding=utf-8 解決中文亂碼String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";String username = "root";String password = "123456";//1.加載驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver");//2.連接數(shù)據(jù)庫(kù),代表數(shù)據(jù)庫(kù)Connection connection = DriverManager.getConnection(url, username, password);//3.編寫(xiě)SQLString sql = "insert into users(id, name, password, email, birthday) values (?,?,?,?,?);";//4.預(yù)編譯PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,2);//給第一個(gè)占位符? 的值賦值為1;preparedStatement.setString(2,"狂神說(shuō)Java");//給第二個(gè)占位符? 的值賦值為狂神說(shuō)Java;preparedStatement.setString(3,"123456");//給第三個(gè)占位符? 的值賦值為123456;preparedStatement.setString(4,"24736743@qq.com");//給第四個(gè)占位符? 的值賦值為1;preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//給第五個(gè)占位符? 的值賦值為new Date(new java.util.Date().getTime());//5.執(zhí)行SQLint i = preparedStatement.executeUpdate();if (i>0){System.out.println("插入成功@");}//6.關(guān)閉連接,釋放資源(一定要做) 先開(kāi)后關(guān)preparedStatement.close();connection.close();} }7.事務(wù)
要么都成功,要么都失敗!
ACID原則:保證數(shù)據(jù)的安全。
開(kāi)啟事務(wù)
事務(wù)提交? commit()
事務(wù)回滾? rollback()
關(guān)閉事務(wù)
轉(zhuǎn)賬:
A:1000
B:1000
?? ?
A(900)?? --100-->?? B(1100)
8.Junit單元測(cè)試
依賴
<!--單元測(cè)試--> <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version> </dependency>?簡(jiǎn)單使用
@Test注解只有在方法上有效,只要加了這個(gè)注解的方法,就可以直接運(yùn)行!
@Test public void test(){System.out.println("Hello"); }?失敗的時(shí)候是紅色:
?9.搭建一個(gè)環(huán)境
CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(40),money FLOAT );INSERT INTO account(`name`,money) VALUES('A',1000); INSERT INTO account(`name`,money) VALUES('B',1000); INSERT INTO account(`name`,money) VALUES('C',1000); @Testpublic void test() {//配置信息//useUnicode=true&characterEncoding=utf-8 解決中文亂碼String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";String username = "root";String password = "123456";Connection connection = null;//1.加載驅(qū)動(dòng)try {Class.forName("com.mysql.jdbc.Driver");//2.連接數(shù)據(jù)庫(kù),代表數(shù)據(jù)庫(kù)connection = DriverManager.getConnection(url, username, password);//3.通知數(shù)據(jù)庫(kù)開(kāi)啟事務(wù),false 開(kāi)啟connection.setAutoCommit(false);String sql = "update account set money = money-100 where name = 'A'";connection.prepareStatement(sql).executeUpdate();//制造錯(cuò)誤//int i = 1/0;String sql2 = "update account set money = money+100 where name = 'B'";connection.prepareStatement(sql2).executeUpdate();connection.commit();//以上兩條SQL都執(zhí)行成功了,就提交事務(wù)!System.out.println("success");} catch (Exception e) {try {//如果出現(xiàn)異常,就通知數(shù)據(jù)庫(kù)回滾事務(wù)connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}9、JavaBean
實(shí)體類(lèi)
JavaBean有特定的寫(xiě)法:
- 必須要有一個(gè)無(wú)參構(gòu)造
- 屬性必須私有化
- 必須有對(duì)應(yīng)的get/set方法;
一般用來(lái)和數(shù)據(jù)庫(kù)的字段做映射 ORM;
ORM :對(duì)象關(guān)系映射
- 表—>類(lèi)
- 字段–>屬性
- 行記錄---->對(duì)象
10、MVC模式和三層架構(gòu)
MVC 是一種分層開(kāi)發(fā)的模式,其中:
-
M:Model,業(yè)務(wù)模型,處理業(yè)務(wù)
-
V:View,視圖,界面展示
-
C:Controller,控制器,處理請(qǐng)求,調(diào)用模型和視圖
?控制器(serlvlet)用來(lái)接收瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求,控制器調(diào)用模型(JavaBean)來(lái)獲取數(shù)據(jù),比如從數(shù)據(jù)庫(kù)查詢數(shù)據(jù);控制器獲取到數(shù)據(jù)后再交由視圖(JSP)進(jìn)行數(shù)據(jù)展示。
MVC 好處:
-
職責(zé)單一,互不影響。每個(gè)角色做它自己的事,各司其職。
-
有利于分工協(xié)作。
-
有利于組件重用
10.1、以前的架構(gòu)
用戶直接訪問(wèn)控制層,控制層就可以直接操作數(shù)據(jù)庫(kù);
servlet--CRUD-->數(shù)據(jù)庫(kù)
弊端:程序十分臃腫,不利于維護(hù) ?
servlet的代碼中:處理請(qǐng)求、響應(yīng)、視圖跳轉(zhuǎn)、處理JDBC、處理業(yè)務(wù)代碼、處理邏輯代碼
架構(gòu):沒(méi)有什么是加一層解決不了的!
????????????????程序猿調(diào)用
????????????????????????↑
????????JDBC (實(shí)現(xiàn)該接口)
????????????????????????↑
Mysql Oracle SqlServer ....(不同廠商)
10.2、MVC三層架構(gòu)
- ?數(shù)據(jù)訪問(wèn)層:對(duì)數(shù)據(jù)庫(kù)的CRUD基本操作
- 業(yè)務(wù)邏輯層:對(duì)業(yè)務(wù)邏輯進(jìn)行封裝,組合數(shù)據(jù)訪問(wèn)層層中基本功能,形成復(fù)雜的業(yè)務(wù)邏輯功能。例如 注冊(cè)業(yè)務(wù)功能 ,我們會(huì)先調(diào)用 數(shù)據(jù)訪問(wèn)層 的 selectByName() 方法判斷該用戶名是否存在,如果不存在再調(diào)用 數(shù)據(jù)訪問(wèn)層 的 insert() 方法進(jìn)行數(shù)據(jù)的添加操作
- 表現(xiàn)層:接收請(qǐng)求,封裝數(shù)據(jù),調(diào)用業(yè)務(wù)邏輯層,響應(yīng)數(shù)據(jù)
10.3 MVC 和 三層架構(gòu)
?MVC 模式 中的 C(控制器)和 V(視圖)就是 三層架構(gòu) 中的表現(xiàn)層,而 MVC 模式 中的 M(模型)就是 三層架構(gòu) 中的 業(yè)務(wù)邏輯層 和 數(shù)據(jù)訪問(wèn)層。
可以將 MVC 模式 理解成是一個(gè)大的概念,而 三層架構(gòu) 是對(duì) MVC 模式 實(shí)現(xiàn)架構(gòu)的思想。 那么我們以后按照要求將不同層的代碼寫(xiě)在不同的包下,每一層里功能職責(zé)做到單一,將來(lái)如果將表現(xiàn)層的技術(shù)換掉,而業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層的代碼不需要發(fā)生變化。
總結(jié)
以上是生活随笔為你收集整理的JavaWeb(kuang)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 突变点检测:带突变的趋势描述测试过程
- 下一篇: java文件长度_Java中的音频文件长