Web學(xué)習(xí)筆記 - 第016天

VO

Value Object / View Object 專門為視圖定制的模型
如:

class MessageVO {
    private int id;
    private String title;
    private String pubDate;
    private String nickname;
    private String[] filenames;
    public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    
    public MessageVO(Message message) {
        this.id = message.getId();
        this.title = message.getTitle();
        this.pubDate = format.format(message.getPubDate());
        this.nickname = message.getPubUser().getNickname();
    }
}

DTO

Data Transfer Object 數(shù)據(jù)傳輸對(duì)象

分層架構(gòu)

分層架構(gòu)(事務(wù)腳本模式) 用戶有一個(gè)請(qǐng)求 在業(yè)務(wù)中就有一個(gè)方法 就有一個(gè)事務(wù)
微服務(wù)架構(gòu)/六邊形架構(gòu)

反射工具類

clazz.getField(String arg) 得到目標(biāo)類中指定的某個(gè)public屬性對(duì)應(yīng)的Field對(duì)象

clazz.getDeclaredField(String arg) 同getField列肢,但不局限于public修飾,只要是目標(biāo)類中聲明的屬性均可

f.setAccessible(true) 設(shè)置屬性可修改
f.get(target) 拿到對(duì)象實(shí)例的 域成員的值

例子1:根據(jù)字段名查找字段的類型

    /**
     * 根據(jù)字段名查找字段的類型
     * @param target 目標(biāo)對(duì)象
     * @param fieldName 字段名
     * @return 字段的類型或null
     */
    public static Class<?> getFieldType(Object target, String fieldName) {
        Class<?> clazz = target.getClass();
        String[] fs = fieldName.split("\\.");
        try {
            for (int i = 0; i < fs.length - 1; ++i) {
                Field f = clazz.getDeclaredField(fs[i]);
                target = f.getType().newInstance();
                clazz = target.getClass();
            }
            return clazz.getDeclaredField(fs[fs.length - 1]).getType();
        }
        catch (Exception e) {
            return null;
        }
    }

例子2:獲取對(duì)象所有字段的名字

    /**
     * 獲取對(duì)象所有字段的名字
     * @param obj 目標(biāo)對(duì)象
     * @return 字段名字的數(shù)組
     */
    public static String[] getFieldNames(Object obj) {
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        List<String> fieldNames = new ArrayList<>();
        for (int i = 0; i < fields.length; i++) {
            if ((fields[i].getModifiers() & Modifier.STATIC) == 0) {
                fieldNames.add(fields[i].getName());
            }
        }
        return fieldNames.toArray(new String[fieldNames.size()]);
    }

例子3:通過反射取對(duì)象指定字段(屬性)的值
1.根據(jù)傳入的target對(duì)象得到target的類信息
2.將傳入的字段名字根據(jù).分割成字符串?dāng)?shù)組
3.限定小于fs.length() - 1之間循環(huán) 如果字符串長(zhǎng)度為2 循環(huán)一次
4.用clazz根據(jù)字段名用getDeclaredField()方法拿到字段對(duì)象
5.將字段對(duì)象設(shè)置為可以修改的
6.f.get(target)字段對(duì)象根據(jù)傳入的target對(duì)象拿到對(duì)應(yīng)target實(shí)例中參數(shù)的值抄淑,如果是基本類型int 就拿到對(duì)應(yīng)的值23刻剥,如果是類Car育灸,就拿到對(duì)象car
7.根據(jù)對(duì)應(yīng)屬性的值得到對(duì)應(yīng)字段值對(duì)象的類信息 如: String 對(duì)應(yīng) String的類信息腻窒, 自己定義的Car類 得到對(duì)應(yīng)的Car類的類信息
8.如果循環(huán)未結(jié)束,繼續(xù)向下磅崭。如Person中有Car這個(gè)對(duì)象屬性,拿到之后向下繼續(xù)得到Engine對(duì)象儿子。
9.若循環(huán)結(jié)束 或 字符串?dāng)?shù)組長(zhǎng)度為1,直接fs[fs.length - 1]得到對(duì)應(yīng)的字段绽诚,設(shè)置可以訪問權(quán)限
10.返回字段的值

    /**
     * 通過反射取對(duì)象指定字段(屬性)的值
     * @param target 目標(biāo)對(duì)象
     * @param fieldName 字段的名字
     * @throws 如果取不到對(duì)象指定字段的值則拋出異常
     * @return 字段的值或null
     */
    public static Object getValue(Object target, String fieldName) {
        Class<?> clazz = target.getClass();
        String[] fs = fieldName.split("\\.");
        try {
            for (int i = 0; i < fs.length - 1; i++) {
                Field f = clazz.getDeclaredField(fs[i]);
                f.setAccessible(true);
                target = f.get(target);
                clazz = target.getClass();
            }
        
            Field f = clazz.getDeclaredField(fs[fs.length - 1]);
            f.setAccessible(true);
            return f.get(target);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

例子4:通過反射給對(duì)象的指定字段賦值

    /**
     * 通過反射給對(duì)象的指定字段賦值
     * @param target 目標(biāo)對(duì)象
     * @param fieldName 字段的名稱
     * @param value 值
     * @throws 
     */
    public static void setValue(Object target, String fieldName, Object value) {
        Class<?> clazz = target.getClass();
        String[] fs = fieldName.split("\\.");
        try {
            for (int i = 0; i < fs.length - 1; i++) {
                Field f = clazz.getDeclaredField(fs[i]);
                f.setAccessible(true);
                Object val = f.get(target);
                if (val == null) {
                    Constructor<?> c = f.getType().getDeclaredConstructor();
                    c.setAccessible(true);
                    val = c.newInstance();
                    f.set(target, val);
                }
                target = val;
                clazz = target.getClass();
            }
        
            Field f = clazz.getDeclaredField(fs[fs.length - 1]);
            f.setAccessible(true);
            f.set(target, value);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

安全性

基本驗(yàn)證

web.xml配置

配置安全性約束 
  <security-constraint>
    指定需要安全約束的資源
    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>manager</role-name>
    </auth-constraint>
  </security-constraint>
  
  <login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>protected</realm-name>
  </login-config>

tomcat-users.xml配置

    <!-- AA - Authentication / Authorization -->
    <!-- What you konw? -->
    <!-- What you have? --> 
    <!-- Whom you are? -->
    <role rolename="authorizedUser" />
    <role rolename="admin" />
    <role rolename="manager" />
    <role rolename="emp" />
    <user username="jack" password="123456" roles="admin,manager" />
客戶端證書驗(yàn)證

如果創(chuàng)建了keystore
rm .keystore
第一步:
keytool -genkey -alias tomcat -keyalg RSA
第二步:
keytool - certreq -alias tomcat -file tomcat.csr
第三步:
keytool -importcert -alias tomcat -file tomcat.cer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末典徊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恩够,更是在濱河造成了極大的恐慌,老刑警劉巖蜂桶,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異费坊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)永毅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來意蛀,“玉大人浸间,你說我怎么就攤上這事《悼矗” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)精绎。 經(jīng)常有香客問我,道長(zhǎng)搁吓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮仿吞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘你虹。我一直安慰自己傅物,他們只是感情好董饰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布啄栓。 她就那樣靜靜地躺著昙楚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淳梦。 梳的紋絲不亂的頭發(fā)上谭跨,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼堂湖。 笑死无蜂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼拦焚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了杠输?” 一聲冷哼從身側(cè)響起耕漱,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抬伺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灾梦,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峡钓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了若河。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片能岩。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萧福,靈堂內(nèi)的尸體忽然破棺而出拉鹃,到底是詐尸還是另有隱情,我是刑警寧澤鲫忍,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布膏燕,位于F島的核電站,受9級(jí)特大地震影響悟民,放射性物質(zhì)發(fā)生泄漏坝辫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一射亏、第九天 我趴在偏房一處隱蔽的房頂上張望近忙。 院中可真熱鬧,春花似錦智润、人聲如沸及舍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锯玛。三九已至,卻和暖如春钾麸,著一層夾襖步出監(jiān)牢的瞬間更振,已是汗流浹背炕桨。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肯腕,地道東北人献宫。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像实撒,于是被迫代替她去往敵國(guó)和親姊途。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理知态,服務(wù)發(fā)現(xiàn)捷兰,斷路器,智...
    卡卡羅2017閱讀 134,639評(píng)論 18 139
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,719評(píng)論 0 15
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評(píng)論 6 13
  • 這部分主要是開源Java EE框架方面的內(nèi)容负敏,包括Hibernate贡茅、MyBatis、Spring其做、Spring ...
    雜貨鋪老板閱讀 1,357評(píng)論 0 2
  • 國(guó)家現(xiàn)在提倡的就是大眾創(chuàng)業(yè)和萬眾創(chuàng)新顶考,那么創(chuàng)業(yè)到底有多艱難呢?我給大家分享一下妖泄,因?yàn)槲矣泻芏喑晒Φ膭?chuàng)業(yè)經(jīng)驗(yàn)驹沿。 當(dāng)時(shí)...
    劉杰say閱讀 166評(píng)論 0 0