JavaWeb(kuang)
目錄
5、Maven
5.1 Maven項目架構(gòu)管理工具
5.2下載安裝Maven
5.3配置環(huán)境變量
5.4阿里云鏡像
5.5本地倉庫
5.6在IDEA中使用Maven
5.7 創(chuàng)建一個普通的maven項目
?5.8 標(biāo)記文件夾功能
1.在打鉤的maven項目要自己建立這兩個目錄
2.項目結(jié)構(gòu)配置1
3.項目結(jié)構(gòu)配置2?
?4.maven的target目錄
?5.9 在IDEA中配置Tomcat
1. 點擊加號?
?2.使用本地tomcat
?3.tomcat相關(guān)配置?
4.解決警告問題、新建artifacts
?5.虛擬路徑配置?
?6.啟動路徑
?7.啟動成功
?5.10 pom文件
1.pom.xml是Maven的核心配置文件
2.Maven的高級之處在于,他會幫你導(dǎo)入這個JAR包所依賴的其他jar,我只導(dǎo)入一個包,他可以幫我導(dǎo)入這個jar所依賴的其他包
3.maven由于他的約定大于配置,我們之后可以能遇到我們寫的配置文件,無法被導(dǎo)出或者生效的問題,解決方
5.12 IDEA目錄樹
?6、Servlet
6.1、Servlet簡介
6.2、HelloServlet
6.2、HelloServlet
構(gòu)建一個普通的Maven項目,清理里面的src目錄,以后我們的學(xué)習(xí)就在這個項目里面建立Moudel;這個空的工程就題Maven主工程;
關(guān)于Maven父子工程的理解;
3.Maven環(huán)境優(yōu)化
4.編寫一個Servlet程序
5.編寫Servlet的映射
6.配置Tomcat
?7.啟動測試,生成targer!
6.3、Servlet原理
?6.4、Mapping問題
一個Servlet可以指定一個映射路徑
?? 2.一個servlet可以指定多個映射路徑
3.一個servlet可以指定通用映射路徑
4.默認(rèn)請求路徑
5.指定一些后綴或者前綴等等…
6.優(yōu)先級問題
6.5、ServletContext
1、共享數(shù)據(jù)
2、獲取初始化參數(shù)
3、請求轉(zhuǎn)發(fā)
?
4、讀取資源文件servlet讀取peoperties配置文件
6.6、HttpServletResponse(下載文件、驗證碼、重定向)
1、簡單分類
1.負(fù)責(zé)向瀏覽器發(fā)送數(shù)據(jù)的方法
2. 負(fù)責(zé)向瀏覽器發(fā)送響應(yīng)頭的方法
2、下載文件
?? 1. 向瀏覽器輸出消息??? 2.瀏覽器下載文件要設(shè)置頭resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
3、驗證碼功能
4.重定向(原理)
6.7、HttpServletRequest
5、Maven
我為什么要學(xué)習(xí)這個技術(shù)?
由此,Maven誕生了!
5.1 Maven項目架構(gòu)管理工具
我們目前用來就是方便導(dǎo)入jar包的!
Maven的核心思想:約定大于配置
- 有約束,不要去違反。
Maven會規(guī)定好你該如何去編寫我們Java代碼,必須要按照這個規(guī)范來;
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
測試Maven是否安裝成功,保證必須配置完畢!
5.4阿里云鏡像
- 鏡像:mirrors
- 作用:加速我們的下載
- 國內(nèi)建議使用阿里云的鏡像
5.5本地倉庫
在本地的倉庫,遠(yuǎn)程倉庫;
建立一個本地倉庫:localRepository
<localRepository>D:\qianfeng\maven\apache-maven-3.6.2\maven-repo</localRepository>5.6在IDEA中使用Maven
1.啟動idea
?2.創(chuàng)建一個Maven項目
?
3. 等待項目導(dǎo)入初始化完畢
4.觀察maven倉庫中多了什么東西?
5.IDEA中的Maven設(shè)置
注意:IDEA項目創(chuàng)建成功后,看一眼Maven的配置
?6.到這里,Maven在IDEA中的配置和使用就OK了!
5.7 創(chuàng)建一個普通的maven項目
?這是一個干凈的maven工程
這個只有在web應(yīng)用下才會有! 就是之前打上的√
?5.8 標(biāo)記文件夾功能
1.在打鉤的maven項目要自己建立這兩個目錄
2.項目結(jié)構(gòu)配置1
?
3.項目結(jié)構(gòu)配置2
?
?4.maven的target目錄
?5.9 在IDEA中配置Tomcat
1. 點擊加號
?2.使用本地tomcat
?3.tomcat相關(guān)配置
4.解決警告問題、新建artifacts
必須要配置:為什么會有這個問題:我們訪問一個網(wǎng)站,需要指定一個文件夾名字;
?
?5.虛擬路徑配置
?6.啟動路徑
?7.啟動成功
?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:項目的打包方式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> <!-- 項目的默認(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> <!--項目依賴--><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的高級之處在于,他會幫你導(dǎo)入這個JAR包所依賴的其他jar,我只導(dǎo)入一個包,他可以幫我導(dǎo)入這個jar所依賴的其他包
3.maven由于他的約定大于配置,我們之后可以能遇到我們寫的配置文件,無法被導(dǎo)出或者生效的問題,解決方
<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目錄樹
?6、Servlet
6.1、Servlet簡介
- Servlet就是sun公司開發(fā)動態(tài)web的一門技術(shù)
- Sun在這些APi中提供一個接口叫做:Servlet,如果你想開發(fā)一個Servlet程序,只需要完成兩個小步驟:
- 編寫一個類,實現(xiàn)Serlet接口
- 把開發(fā)好java類部署到web服務(wù)器中。
把實現(xiàn)了Servlet接口的Java程序叫做,Servlet
6.2、HelloServlet
Serlvet接口Sun公司有兩個默認(rèn)的實現(xiàn)類:HttpServlet,GenericServled
6.2、HelloServlet
構(gòu)建一個普通的Maven項目,清理里面的src目錄,以后我們的學(xué)習(xí)就在這個項目里面建立Moudel;這個空的工程就題Maven主工程;
關(guān)于Maven父子工程的理解;
父項目中會有
<modules><module>servlet-01</module></modules>子項目會有
<parent><artifactId>javaweb-02-servlet</artifactId><groupId>com.kuang</groupId><version>1.0-SNAPSHOT</version></parent>父項目中的java子項目可以直接使用
3.Maven環(huán)境優(yōu)化
- 修改web.xml為最新的
- 將maven的結(jié)構(gòu)搭建完整
4.編寫一個Servlet程序
5.編寫Servlet的映射
????????為什么需要映射:我們寫的是JAVA程序,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務(wù)器,所以我們需要再web服務(wù)中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑;
<!--注冊Servlet--><servlet><servlet-name>hello</servlet-name><servlet-class>com.kuang.servlet.HelloServlet</servlet-class></servlet><!--Servlet的請求路徑--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>6.配置Tomcat
注意:配置項目發(fā)布的路徑就可以了
?
?7.啟動測試,生成targer!
6.3、Servlet原理
Servlet是由Web服務(wù)器調(diào)用,web服務(wù)器在收到瀏覽器請求之后,會:
?6.4、Mapping問題
一個Servlet可以指定一個映射路徑
?? 2.一個servlet可以指定多個映射路徑
<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.一個servlet可以指定通用映射路徑
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello/*</url-pattern></servlet-mapping>4.默認(rèn)請求路徑
<!--默認(rèn)請求路徑--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>5.指定一些后綴或者前綴等等…
<!--可以自定義后綴實現(xiàn)請求映射注意點,*前面不能加項目映射的路徑hello/sajdlkajda.qinjiang--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>*.qinjiang</url-pattern></servlet-mapping>6.優(yōu)先級問題
????????指定了固有的映射路徑優(yōu)先級最高,如果找不到就會走默認(rèn)的處理請求;
????????只能以*或/開頭
<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容器在啟動的時候,它會為每個web程序都創(chuàng)建一個對應(yīng)的ServletContext對象,它代表了當(dāng)前的web應(yīng)用;
1、共享數(shù)據(jù)
| servlet方法 | 說明 |
| 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); //將一個數(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>測試訪問結(jié)果;
| ServletContext context = this.getServletContext(); | 說明 |
| context.getInitParameter | 獲得web.xml配置的初始化參數(shù)<context-param> |
| context.getRequestDispatcher("/gp").forward(req,resp); | //轉(zhuǎn)發(fā)的請求路徑、forward實現(xiàn)請求轉(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、請求轉(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ā)的請求路徑//requestDispatcher.forward(req,resp); //調(diào)用forward實現(xiàn)請求轉(zhuǎn)發(fā);context.getRequestDispatcher("/gp").forward(req,resp); }4、讀取資源文件servlet讀取peoperties配置文件
Properties:根據(jù)target目錄那,要 / 開頭
- 在java目錄下新建properties
- 在resources目錄下新建properties
發(fā)現(xiàn):都被打包到了同一個路徑下:classes,我們俗稱這個路徑為classpath:類路徑
思路:需要一個文件流
訪問測試即可ok;
6.6、HttpServletResponse(下載文件、驗證碼、重定向)
web服務(wù)器接收到客戶端的http請求,針對這個請求,分別創(chuàng)建一個代表請求的HttpServletRequest對象,代表響應(yīng)的一個HttpServletResponse;
- 如果要獲取客戶端請求過來的參數(shù):找HttpServletRequest
- 如果要給客戶端響應(yīng)一些信息:找HttpServletResponse
1、簡單分類
1.負(fù)責(zé)向瀏覽器發(fā)送數(shù)據(jù)的方法
servletOutputstream getOutputstream() throws IOException;Printwriter getwriter() throws IOException;2. 負(fù)責(zé)向瀏覽器發(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. 向瀏覽器輸出消息
??? 2.瀏覽器下載文件要設(shè)置頭resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
- ??????? 要獲取下載文件的路徑
- ??????? 下載的文件名是啥?
- ??????? 設(shè)置想辦法讓瀏覽器能夠支持下載我們需要的東西
- ??????? 獲取下載文件的輸入流
- ??????? 創(chuàng)建緩沖區(qū)
- ??????? 獲取OutputStream對象
- ??????? 將FileOutputStream流寫入到bufer緩沖區(qū)
- ??????? 使用OutputStream將緩沖區(qū)中的數(shù)據(jù)輸出到客戶端!
3、驗證碼功能
驗證怎么來的?
- 前端實現(xiàn)
- 后端實現(xiàn),需要用到Java的圖片類,生產(chǎn)一個圖片
4.重定向(原理)
常見場景:
- 用戶登錄
測試:
@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>《%--這里超交的路徑,需要尋找到項目的路徑--%><%--${pageContext. request, contextPath}代表當(dā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"); }重定向頁面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代表客戶端的請求,用戶通過Http協(xié)議訪問服務(wù)器, HTTP請求中的所有信息會被封裝到HttpServletRequest,通過這個HttpServletRequest的方法,獲得客戶端的所有信息;
| 方法 | 說明 |
| req.getParameter | 通過參數(shù)獲得value |
| req.getParameterValues | 通過參數(shù)獲得多個values值CheckBox |
| req.getRequestDispatcher("/success.jsp").forward(req,resp); | 請求轉(zhuǎn)發(fā),這里的/表示當(dāng)前項目了,不用加rep.getContextPath(),重定向就需要 |
| req.getContextPage() | 當(dāng)前項目名,tomcat里配的路徑 |
| req.getServletPath() | web映射配置的路徑 |
自己創(chuàng)建類,且需要繼承HttpServlet類
@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("==========");//后臺接收中文亂碼問題System. out.println(username);System. out.println(password);System. out.println(Arrays.tostring(hobbys));System. out.println("============");system. out.println(req.getContextPath());//通過請求轉(zhuǎn)發(fā)//這里的/代表當(dāng)前的web應(yīng)用req.getRequestDispatcher("/success.jsp").forward(req,resp); }14、JDBC
1.什么是JDBC : Java連接數(shù)據(jù)庫
?
2.需要jar包的支持:
- java.sql
- javax.sql
- mysql-conneter-java… 連接驅(qū)動(必須要導(dǎo)入)
3.實驗環(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ù)庫依賴
<!--mysql的驅(qū)動--> <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ū)動Class.forName("com.mysql.jdbc.Driver");//2.連接數(shù)據(jù)庫,代表數(shù)據(jù)庫Connection connection = DriverManager.getConnection(url, username, password);//3.編寫SQLString sql = "insert into users(id, name, password, email, birthday) values (?,?,?,?,?);";//4.預(yù)編譯PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,2);//給第一個占位符? 的值賦值為1;preparedStatement.setString(2,"狂神說Java");//給第二個占位符? 的值賦值為狂神說Java;preparedStatement.setString(3,"123456");//給第三個占位符? 的值賦值為123456;preparedStatement.setString(4,"24736743@qq.com");//給第四個占位符? 的值賦值為1;preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//給第五個占位符? 的值賦值為new Date(new java.util.Date().getTime());//5.執(zhí)行SQLint i = preparedStatement.executeUpdate();if (i>0){System.out.println("插入成功@");}//6.關(guān)閉連接,釋放資源(一定要做) 先開后關(guān)preparedStatement.close();connection.close();} }7.事務(wù)
要么都成功,要么都失敗!
ACID原則:保證數(shù)據(jù)的安全。
開啟事務(wù)
事務(wù)提交? commit()
事務(wù)回滾? rollback()
關(guān)閉事務(wù)
轉(zhuǎn)賬:
A:1000
B:1000
?? ?
A(900)?? --100-->?? B(1100)
8.Junit單元測試
依賴
<!--單元測試--> <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version> </dependency>?簡單使用
@Test注解只有在方法上有效,只要加了這個注解的方法,就可以直接運行!
@Test public void test(){System.out.println("Hello"); }?失敗的時候是紅色:
?9.搭建一個環(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ū)動try {Class.forName("com.mysql.jdbc.Driver");//2.連接數(shù)據(jù)庫,代表數(shù)據(jù)庫connection = DriverManager.getConnection(url, username, password);//3.通知數(shù)據(jù)庫開啟事務(wù),false 開啟connection.setAutoCommit(false);String sql = "update account set money = money-100 where name = 'A'";connection.prepareStatement(sql).executeUpdate();//制造錯誤//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ù)庫回滾事務(wù)connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}9、JavaBean
實體類
JavaBean有特定的寫法:
- 必須要有一個無參構(gòu)造
- 屬性必須私有化
- 必須有對應(yīng)的get/set方法;
一般用來和數(shù)據(jù)庫的字段做映射 ORM;
ORM :對象關(guān)系映射
- 表—>類
- 字段–>屬性
- 行記錄---->對象
10、MVC模式和三層架構(gòu)
MVC 是一種分層開發(fā)的模式,其中:
-
M:Model,業(yè)務(wù)模型,處理業(yè)務(wù)
-
V:View,視圖,界面展示
-
C:Controller,控制器,處理請求,調(diào)用模型和視圖
?控制器(serlvlet)用來接收瀏覽器發(fā)送過來的請求,控制器調(diào)用模型(JavaBean)來獲取數(shù)據(jù),比如從數(shù)據(jù)庫查詢數(shù)據(jù);控制器獲取到數(shù)據(jù)后再交由視圖(JSP)進(jìn)行數(shù)據(jù)展示。
MVC 好處:
-
職責(zé)單一,互不影響。每個角色做它自己的事,各司其職。
-
有利于分工協(xié)作。
-
有利于組件重用
10.1、以前的架構(gòu)
用戶直接訪問控制層,控制層就可以直接操作數(shù)據(jù)庫;
servlet--CRUD-->數(shù)據(jù)庫
弊端:程序十分臃腫,不利于維護(hù) ?
servlet的代碼中:處理請求、響應(yīng)、視圖跳轉(zhuǎn)、處理JDBC、處理業(yè)務(wù)代碼、處理邏輯代碼
架構(gòu):沒有什么是加一層解決不了的!
????????????????程序猿調(diào)用
????????????????????????↑
????????JDBC (實現(xiàn)該接口)
????????????????????????↑
Mysql Oracle SqlServer ....(不同廠商)
10.2、MVC三層架構(gòu)
- ?數(shù)據(jù)訪問層:對數(shù)據(jù)庫的CRUD基本操作
- 業(yè)務(wù)邏輯層:對業(yè)務(wù)邏輯進(jìn)行封裝,組合數(shù)據(jù)訪問層層中基本功能,形成復(fù)雜的業(yè)務(wù)邏輯功能。例如 注冊業(yè)務(wù)功能 ,我們會先調(diào)用 數(shù)據(jù)訪問層 的 selectByName() 方法判斷該用戶名是否存在,如果不存在再調(diào)用 數(shù)據(jù)訪問層 的 insert() 方法進(jìn)行數(shù)據(jù)的添加操作
- 表現(xiàn)層:接收請求,封裝數(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ù)訪問層。
可以將 MVC 模式 理解成是一個大的概念,而 三層架構(gòu) 是對 MVC 模式 實現(xiàn)架構(gòu)的思想。 那么我們以后按照要求將不同層的代碼寫在不同的包下,每一層里功能職責(zé)做到單一,將來如果將表現(xiàn)層的技術(shù)換掉,而業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層的代碼不需要發(fā)生變化。
總結(jié)
以上是生活随笔為你收集整理的JavaWeb(kuang)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 突变点检测:带突变的趋势描述测试过程
- 下一篇: 输出DNA螺旋