JavaEE課後作業0214-Java創建對象的5種方式、MVC分層、Spring核心技術、表單同步異步提交區別、抽象類與接口區別

1.Java創建對象有哪些方式

  1. 使用new關鍵字

  2. 使用clone()方法

    實體類實現Cloneable接口,重寫clone()方法,調用clone()方法,克隆得到的對象與原來的對象不是一個對象

  3. 使用反射

    得到Students類的Class對象,根據Class對象得到構造器,再根據構造器得到對象

  4. 使用對象的反序列化

    西安序列化將對象寫入文件中,再反序列化從文件中得到對象,記得關閉流

  5. 使用spring獲得對象

    先在xml配置文檔裏配置好對象的屬性與id值,得到與配置文檔的連接,根據配置文檔裏id屬性的值,得到對象

Java代碼:

//Students類
package org.westos.domain;

import java.io.Serializable;

public class Students implements Cloneable, Serializable {
    private String sid;
    private String sname;
    private String gender;
    private String birthday;
    private String major;
    
    //實現Cloneable接口,重寫父類的clone()方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Students{" +
                "sid='" + sid + '\'' +
                ", sname='" + sname + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday='" + birthday + '\'' +
                ", major='" + major + '\'' +
                '}';
    }

    public Students() {
    }

    public Students(String sid, String sname, String gender, String birthday, String major) {
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.birthday = birthday;
        this.major = major;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }
}


//測試類
package org.westos.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.westos.domain.Students;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


public class Test {
    public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException, InvocationTargetException {
        //1.使用new關鍵字創建對象
        Students s1 = new Students("001", "張三", "男", "1993-02-03", "古文");
        System.out.println("s1:" + s1);

        //2.使用clone()方法創建對象
        Students s2 = (Students) s1.clone();
        System.out.println("s2:" + s2);
        System.out.println(s1 == s2);//s1與s2不相等

        //3.使用反射得到對象
        Class aClass = Class.forName("org.westos.domain.Students");//使用類名得到類的Class對象
        //使用構造器的參數得到構造器
        Constructor constructor = aClass.getConstructor(String.class, String.class, String.class, String.class, String.class);
        //使用構造器得到對象
        Students s3 = (Students) constructor.newInstance(new Object[]{"002", "李四", "男", "1994-02-04", "高數"});
        System.out.println("s3:" + s3);

        //4.使用反序列化得到對象
        //得到對象輸出流
        File file = new File("studentLists.text");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
        //將對象序列化寫到文件studentLists.txt中
        out.writeObject(s2);
        //得到對象輸入流
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
        //反序列化讀取對象
        Students s4 = (Students) in.readObject();
        System.out.println("s4:" + s4);
        //關閉流資源
        in.close();
        out.close();

        //5.使用spring中的IOC獲取對象
        //與配置文檔applicationContext.xml建立連接
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根據配置文檔裏的id屬性的值,獲得對象
        Students s5 = (Students) context.getBean("s2");
        System.out.println("s5:" + s5);
    }
}

applicationContext.xml配置文檔:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--定義學生對象-->
    <bean id="s1" class="org.westos.domain.Students">
        <property name="sid" value="003"/>
        <property name="sname" value="張三丰"/>
        <property name="gender" value=""/>
        <property name="birthday" value="1998-10-10"/>
        <property name="major" value="太極拳"/>
    </bean>

    <!--定義學生對象-->
    <bean id="s2" class="org.westos.domain.Students">
        <property name="sid" value="004"/>
        <property name="sname" value="王五"/>
        <property name="gender" value=""/>
        <property name="birthday" value="1999-10-10"/>
        <property name="major" value="乒乓球"/>
    </bean>
</beans>

2.什麼是maven?maven的核心功能有哪些

  1. 什麼是maven

    管理項目的構建,報告和文檔的項目管理工具軟件。將程序中要使用的jar包存在放在maven倉庫中,只需要在pom.xml文檔中進行配置,就可以聯網獲得對應的jar包,而且會將所導入的jar包的所有依賴的jar包一起導入進去

  2. 核心功能

    1. 依賴管理
    2. 模塊管理
    3. 插件管理
    4. 部署管理
  3. 生命週期

    maven將工程的構建過程理解爲不同的生命週期和階段, 一個工程的構建過程中,存在着不同的生命週期,生命週期間互相獨立,沒有一定的順序關係。 每個生命週期又劃分爲不同的階段,不同的階段之間有明確的順序關係, 同一生命週期內的階段必須按順序依次執行。

    1. clear(清除)

      1. pre-clean:執行清理的準備工作
      2. clean:執行清理工作
      3. post-clean:執行清理後的後續工作
    2. default(核心)

      1. validate:驗證項目的正確性及項目所必需的信息是否可用
      2. compile:編譯項目中代碼
      3. test:用相關的單元測試框架測試編譯後的代碼,測試代碼並不會隨項目打包和佈署
      4. package:將編譯後的代碼打包成相應的格式文件,如jar包
      5. integration-test: 如果需要在一個綜合環境中運行我們的測試,這個階段將會運行和佈署項目到該環境中
      6. verify: 檢查項目中的包是否正確與符合要求
      7. install:將包安裝到本地maven倉庫,其他項目也可以使用該包作爲依賴
      8. deploy:將包發佈到遠程的maven倉庫,並提供給其他開發者使用
    3. site(建立發佈項目站點)

      1. pre-site:準備生成
      2. site:生成項目站點和文檔
      3. post-site:執行生成文檔後的後續工作
      4. site-deploy:發佈項目文檔

3.什麼是MVC?說說分層的好處

  1. 什麼是MVC

    MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式。

    1. Model(模型):表示應用程序核心,應用程序中用於處理應用程序數據邏輯的部分,通常模型對象負責在數據庫中存取數據
    2. View(視圖):顯示數據,應用程序中處理數據顯示的部分,通常視圖是依據模型數據創建的
    3. Controller(控制器):處理輸入,應用程序中處理用戶交互的部分,通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據
  2. 優點

    1. 開發人員可以只用管理結構中的某一層
    2. 容易使用新的層實替換原有的層
    3. 降低層間依賴、也就是解耦,降低程序耦合度
    4. 有利於各層邏輯的複用
  3. 缺點

    1. 降低了系統的性能,必須通過中間層才能訪問數據庫
    2. 有時會倒是級聯的修改,尤其是在上層做出修改後,下層的結構也要做出對應的修改

4.Spring的兩大核心技術是什麼?

  1. IOC(控制反轉)/DI(依賴注入)
    1. 一般來說在Java中創建對象是使用new關鍵字創建的,而使用IOC,只需要在配置文檔中進行配置,使用配置文檔中的數據進行對象的創建。不用再使用new關鍵字創建
    2. IOC創建對象的過程是使用類的默認無參構造創建對象,然後使用類的set方法進行屬性的賦值
    3. IOC創建對象的本質是反射
  2. AOP面向切面編程
    1. 可以簡單的理解爲在不改變原有程序的基礎上爲代碼增加新的功能
    2. 分爲前置增強、後置增強、最終增強、異常增強、環繞增強
    3. 需要在原有的類上定義一個切口(方法),然後定義一個用於增強的AOP類,可以在類中定義增強的方法。最後在xml配置文檔中進行配置

5.談談面向對象編程與面向接口編程的區別

  1. 什麼是面向接口編程

    面向對象編程中不同的對象協作完成系統的各個功能,對象內部的實現由各個類自己實現。但是隨着系統愈發複雜,對象內部功能的實現已經不那麼重要了(類自己內部實現),反之對象間的協作能力更爲重要,這就是面向接口編程的思想

    面向接口編程就是先將業務的邏輯線先提取出來,作爲接口,而將具體的代碼實現作爲實現類來完成。當客戶需求變化時,只用更改接口下的實現類就可以

  2. 面向接口編程優點

    1. 降低耦合性,能極大限度解耦
    2. 易於程序擴展
    3. 易於程序維護
  3. 抽象類和接口的選擇

    在於使用動機,使用抽象類是爲了代碼的複用,而使用接口的動機是爲了實現多態性與協作關係

  4. 經典的面向接口編程例子-JDBC

    SUN公司提供了JDBC接口的規範,而不同的數據庫廠商開發不同的數據庫驅動

6.什麼是反射?說說反射是如何應用到spring框架上

  1. 什麼是反射

    反射是Java中一個非常重要的特性,它允許程序在運行時進行自我檢查,同時也允許對其內部成員進行操作。主要有:得到一個對象所屬的類、獲取一個類的所有成員變量和方法、在運行時創建對象、在運行時調用對象的方法等

  2. 反射的優點

    可以動態創建對象和編譯,體現出很大的靈活性,通過反射機制可以獲得類的各種內容,對於JAVA這種先編譯再運行的語言來說,反射機制可以使代碼更加靈活

  3. 反射機制的缺點

    對性能有影響,使用反射基本上是一種解釋操作,這類操作總是慢於只直接執行相同的操作

    破壞了類的封裝性,不安全

  4. 反射機制應用到spring框架中

    1. 加載resourse資源目錄下的配置文件
    2. 解析配置文件
    3. 從配置文件中找到對應id屬性值的對象
    4. 通過反射調用默認的無參構造創建對象
    5. 使用set方法對屬性賦值
    6. 返回創建的對象

7.說說java解析xml有哪些技術?

  1. DOM解析

    是html和xml的應用程序接口(API),DOM文檔對象模型,採用樹形結構來完成對文檔的解析,在解析時,會將整個文檔加載到內存中然後形成"節點數",當文檔內容過多或者需要解析的文檔過多時,會造成服務器內存緊張

  2. SAX解析

    流模型中的"推"模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法完成解析工作,解析XML文檔的邏輯需要應用程序完成

  3. JDOM解析

    Java特定的文檔對象模型。自身不包含解析器,使用SAX

  4. DOM4J解析

    簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP,提供了一套完整的針對DOM和SAX的解析技術,目前使用較爲廣泛

  5. STAX解析

    流模型中的拉模型分析方式。提供基於指針和基於迭代器兩種方式的支持,JDK1.6新特性

8.抽象類與接口的區別

  1. 語法區別
    1. 抽象類可以有構造方法,接口中不能有構造方法
    2. 抽象類中可以有普通成員變量,接口中沒有普通成員變量
    3. 抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法
    4. 抽象類中的抽象方法的訪問類型可以是public,protected,但接口中的抽象方法只能是public類型的,並且默認即爲public abstract類型。
    5. 抽象類中可以包含靜態方法,接口中不能包含靜態方法
    6. 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是默認public static final類型
    7. 一個類可以實現多個接口,但只能繼承一個抽象類
  2. 應用區別
    1. 接口更多的是在系統架構設計方法發揮作用,主要用於定義模塊之間的聯繫
    2. 抽象類主要在代碼實現方面發揮作用,來實現代碼的重用

9.談談表單的同步提交與異步提交的區別

  1. 處理步驟

    1. 同步:提交請求->等待服務器處理->處理完畢返回,在此期間瀏覽器不能做別的事情
    2. 異步:請求通過事件觸發->服務器處理(服務器任然可以做別的事情)->處理完畢
  2. 區別

    同步提交的時候客戶端瀏覽器不能做別的事情,只能等待服務器處理;而異步提交的時候客戶端瀏覽器任然可以做別的

    可以理解爲喫飯,同步就是我叫你去喫飯,你沒聽見,我繼續叫你,知道你回答我了,一起去喫飯。

    異步就是我給你發消息說我去喫飯了,然後我就先走了,你後面自己來

  3. 具體應用
    同步表單使用submit按鈕提交,執行表單的action動作會出現頁面假死的現象,用戶體驗不好

    異步表單使用ajax異步提交,通過普通按鈕提交實現頁面局部刷新,用戶體驗好,大多數使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章