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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

JavaWeb(kuang)

發(fā)布時(shí)間:2024/3/12 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb(kuang) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

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ù)?

  • 在Javaweb開(kāi)發(fā)中,需要使用大量的jar包,我們手動(dòng)去導(dǎo)入;
  • 如何能夠讓一個(gè)東西自動(dòng)幫我導(dǎo)入和配置這個(gè)jar包。
  • 由此,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)建議使用阿里云的鏡像
    <mirror><id>nexus-aliyun</id> <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>

    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程序

  • 編寫(xiě)一個(gè)普通類(lèi)
  • 實(shí)現(xiàn)Servlet接口,這里我們直接繼承HttpServlet
  • 有字符輸出就有字節(jié)輸出
  • public class HelloServlet extends HttpServlet {//由于get或者post只是請(qǐng)求實(shí)現(xiàn)的不同的方式,可以相互調(diào)用,業(yè)務(wù)邏輯都一樣;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//ServletOutputStream outputStream = resp.getOutputStream();PrintWriter writer = resp.getWriter(); //響應(yīng)流writer.print("Hello,Serlvet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}

    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è)映射路徑

  • <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>

    ?? 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è)文件流

    username=root12312 password=zxczxczxc public class ServletDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");Properties prop = new Properties();prop.load(is);String user = prop.getProperty("username");String pwd = prop.getProperty("password");resp.getWriter().print(user+":"+pwd);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }

    訪問(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ù)輸出到客戶端!
    @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 要獲取下載文件的路徑String realPath = "F:\\班級(jí)管理\\西開(kāi)【19525】\\2、代碼\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\秦疆.png";System.out.println("下載文件的路徑:"+realPath);// 2. 下載的文件名是啥?String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);// 3. 設(shè)置想辦法讓瀏覽器能夠支持(Content-Disposition)下載我們需要的東西,中文文件名URLEncoder.encode編碼,否則有可能亂碼resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));// 4. 獲取下載文件的輸入流FileInputStream in = new FileInputStream(realPath);// 5. 創(chuàng)建緩沖區(qū)int len = 0;byte[] buffer = new byte[1024];// 6. 獲取OutputStream對(duì)象ServletOutputStream out = resp.getOutputStream();// 7. 將FileOutputStream流寫(xiě)入到buffer緩沖區(qū),使用OutputStream將緩沖區(qū)中的數(shù)據(jù)輸出到客戶端!while ((len=in.read(buffer))>0){out.write(buffer,0,len);}in.close();out.close(); }

    3、驗(yàn)證碼功能

    驗(yàn)證怎么來(lái)的?

    • 前端實(shí)現(xiàn)
    • 后端實(shí)現(xiàn),需要用到Java的圖片類(lèi),生產(chǎn)一個(gè)圖片
    package com.kuang.servlet;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;public class ImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//如何讓瀏覽器3秒自動(dòng)刷新一次;resp.setHeader("refresh","3");//在內(nèi)存中創(chuàng)建一個(gè)圖片BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//得到圖片Graphics2D g = (Graphics2D) image.getGraphics(); //筆//設(shè)置圖片的背景顏色g.setColor(Color.white);g.fillRect(0,0,80,20);//給圖片寫(xiě)數(shù)據(jù)g.setColor(Color.BLUE);g.setFont(new Font(null,Font.BOLD,20));g.drawString(makeNum(),0,20);//告訴瀏覽器,這個(gè)請(qǐng)求用圖片的方式打開(kāi)resp.setContentType("image/jpeg");//網(wǎng)站存在緩存,不讓瀏覽器緩存resp.setDateHeader("expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");//把圖片寫(xiě)給瀏覽器ImageIO.write(image,"jpg", resp.getOutputStream());}//生成隨機(jī)數(shù)private String makeNum(){Random random = new Random();String num = random.nextInt(9999999) + "";StringBuffer sb = new StringBuffer();for (int i = 0; i < 7-num.length() ; i++) {sb.append("0");}num = sb.toString() + num;return num;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} } <servlet><servlet-name>ImageServlet</servlet-name><servlet-class>com.kuang.servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>Imageservlet</servlet-name><url-pattern>/img</url-pattern> </servlet-mapping>

    4.重定向(原理)

    常見(jiàn)場(chǎng)景:

    • 用戶登錄
    void sendRedirect(String var1) throws IOException;

    測(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 固定步驟:

  • 加載驅(qū)動(dòng)
  • 連接數(shù)據(jù)庫(kù),代表數(shù)據(jù)庫(kù)
  • 向數(shù)據(jù)庫(kù)發(fā)送SQL的對(duì)象Statement : CRUD
  • 編寫(xiě)SQL (根據(jù)業(yè)務(wù),不同的SQL)
  • 執(zhí)行SQL
  • 關(guān)閉連接(先開(kāi)的后關(guān))
  • public class TestJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException {//配置信息//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.向數(shù)據(jù)庫(kù)發(fā)送SQL的對(duì)象Statement,PreparedStatement : CRUDStatement statement = connection.createStatement();//4.編寫(xiě)SQLString sql = "select * from users";//5.執(zhí)行查詢SQL,返回一個(gè) ResultSet : 結(jié)果集ResultSet rs = statement.executeQuery(sql);while (rs.next()){System.out.println("id="+rs.getObject("id"));System.out.println("name="+rs.getObject("name"));System.out.println("password="+rs.getObject("password"));System.out.println("email="+rs.getObject("email"));System.out.println("birthday="+rs.getObject("birthday"));}//6.關(guān)閉連接,釋放資源(一定要做) 先開(kāi)后關(guān)rs.close();statement.close();connection.close();} }

    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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。