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

反射

通過反射可以設(shè)置類的私有屬性
        Field f1 = Student.class.getDeclaredField("name");
        f1.setAccessible(true);
        f1.set(stu1, "Li zxc");
        Field f2 = Student.class.getDeclaredField("age");
        f2.setAccessible(true);
        f2.set(stu1, 20);
通過反射可以使用類的方法
        String methodName = "eat";
        Method m = Student.class.getDeclaredMethod(methodName);
        m.invoke(stu1);

文件上傳

MySQL

文件類型為 longblob

jsp

如果要向服務(wù)器傳文件竿奏,需要在form屬性添加enctype="multipart/form-data"

<form action="add_emp.do" method="post" enctype="multipart/form-data">

input類型是file
比如說:照片

照片: <input type="file" name="photo">

Servlet

支持文件上傳

在以前市咆,處理文件上傳是一個(gè)很痛苦的事情,大都借助于開源的上傳組件登钥,諸如commons fileupload等。
現(xiàn)在Servlet 3.0文件上傳支持闷沥。以前的HTML端上傳表單不用改變什么母赵,還是一樣的multipart/form-data MIME類型眼溶。
讓Servlet支持上傳,需要做兩件事情
1.需要添加MultipartConfig注解

@MultipartConfig

2.從request對象中獲取Part文件對象幅疼,并通過part的輸入流將文件寫入到buffer緩沖區(qū)

        Part part = req.getPart("photo");
        byte[] buffer = new byte[(int) part.getSize()];
        part.getInputStream().read(buffer);

字符串日期轉(zhuǎn)換為Date類型

一般使用SimpleDateFormat 創(chuàng)建一個(gè)格式器來格式化字符串日期為Date類型米奸,最好把這種方法封裝到工具類里面

    private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";

    public static Date stringToDate(String pattern, String dateStr) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        try {
            return formatter.parse(dateStr);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
    
    public static Date stringToDate(String dateStr) {
        return stringToDate(DEFAULT_DATE_PATTERN, dateStr);
    }

解決重復(fù)代碼

當(dāng)A類繼承B類,有許多類似A類中都要實(shí)現(xiàn)相同的方法爽篷,如果要解決這些相同的重復(fù)代碼悴晰,可以考慮建一個(gè)C類繼承B類,把重復(fù)方法寫在C類逐工,屬性設(shè)為protected铡溪,讓A類繼承C類,這樣就不用每個(gè)類似A類的類都要寫這種重復(fù)的方法泪喊。

例子:

public class BaseServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    
    protected DeptService getDeptService() {
        return (DeptService) ServiceFactory.factory(DeptService.class);
    }

    protected EmpService getEmpService() {
        return (EmpService) ServiceFactory.factory(EmpService.class);
    }
}

jsp顯示圖片

數(shù)據(jù)庫圖片存放的是longblob棕硫,byte數(shù)組

例子:根據(jù)員工編號拿到photo
1.第一步  html

<i*m*g src="show_photo.do?eno=${emp.id}" width="150px" height="200px">

如果支持多文件上傳input添加屬性multiple

  1. 第二步 實(shí)現(xiàn)dao層byte[] findPhotoById(int id)方法
    public byte[] findPhotoById(int id) {
        try (ResultSet rs = DbSessionFactory.openSession().executeQuery(
                "select photo from tb_emp where eno=?", id)) {
            if (rs.next()) {
                return rs.getBytes("photo");
            }
            return null;
        }
        catch (SQLException e) {
            e.printStackTrace();
            throw new DbException("處理結(jié)果集異常", e);
        }
    }   

3.第三步 實(shí)現(xiàn)biz業(yè)務(wù)層BufferedImage getEmpPhoto(int empId)方法,通過dao層findPhotoById()方法得到字節(jié)數(shù)組袒啼,然后通過ByteArrayInputStream流讀取buffer到輸入流哈扮,最后通過ImageIO類的read()方法傳入輸入流返回BufferedImage

    public BufferedImage getEmpPhoto(int empId) {
        byte[] buffer = empdao.findPhotoById(empId);
        if (buffer != null && buffer.length > 0) {
            try (InputStream in = new ByteArrayInputStream(buffer)) {
                return ImageIO.read(in);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

4.第四步 創(chuàng)建servlet,根據(jù)業(yè)務(wù)層方法得到緩沖圖片瘤泪,如果不為空灶泵,用ImageIO.write()輸出

@WebServlet(urlPatterns="/show_photo.do", loadOnStartup=1)
public class GetEmpPhotoServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest rep, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("image/jpeg");
        String enoStr = rep.getParameter("eno");
        if (enoStr != null) {
            int empId = Integer.parseInt(enoStr);
            BufferedImage photo = getEmpService().getEmpPhoto(empId);
            if (photo != null) {
                ImageIO.write(photo, "JPG", resp.getOutputStream());
            }
        }
    }
    
    private EmpService getEmpService() {
        return (EmpService) ServiceFactory.factory(EmpService.class);
    }
}

注意:

需要先設(shè)置輸出流內(nèi)容格式為圖片格式 resp.setContentType("image/jpeg");

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市对途,隨后出現(xiàn)的幾起案子赦邻,更是在濱河造成了極大的恐慌,老刑警劉巖实檀,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惶洲,死亡現(xiàn)場離奇詭異,居然都是意外死亡膳犹,警方通過查閱死者的電腦和手機(jī)恬吕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來须床,“玉大人铐料,你說我怎么就攤上這事。” “怎么了钠惩?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵柒凉,是天一觀的道長。 經(jīng)常有香客問我篓跛,道長膝捞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任愧沟,我火速辦了婚禮蔬咬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沐寺。我一直安慰自己林艘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布芽丹。 她就那樣靜靜地躺著北启,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拔第。 梳的紋絲不亂的頭發(fā)上咕村,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機(jī)與錄音蚊俺,去河邊找鬼懈涛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泳猬,可吹牛的內(nèi)容都是我干的批钠。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼得封,長吁一口氣:“原來是場噩夢啊……” “哼埋心!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忙上,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤拷呆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后疫粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茬斧,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年梗逮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了项秉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慷彤,死狀恐怖娄蔼,靈堂內(nèi)的尸體忽然破棺而出怖喻,到底是詐尸還是另有隱情,我是刑警寧澤岁诉,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布罢防,位于F島的核電站,受9級特大地震影響唉侄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜野建,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一属划、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧候生,春花似錦同眯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至目溉,卻和暖如春明肮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缭付。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工柿估, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陷猫。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓秫舌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绣檬。 傳聞我的和親對象是個(gè)殘疾皇子足陨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司娇未,掛了不少墨缘,但最終還是拿到小米、百度忘蟹、阿里飒房、京東、新浪媚值、CVTE狠毯、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,278評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法褥芒,內(nèi)部類的語法嚼松,繼承相關(guān)的語法嫡良,異常的語法,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題献酗。 96寝受、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,412評論 0 10
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,815評論 0 11
  • 涉及的aws云服務(wù) Quicksight Quicksight 是AWS提供的一個(gè)高效商業(yè)智能數(shù)據(jù)分析工具。 今天...
    zhujp閱讀 1,097評論 2 2