Spring內(nèi)容協(xié)商以及視圖解析

概念

1)MediaType,即是Internet Media Type撞反,互聯(lián)網(wǎng)媒體類型妥色;也叫做MIME類型。
2)Content-Type代表發(fā)送端(客戶端|服務(wù)器)發(fā)送的實(shí)體數(shù)據(jù)的數(shù)據(jù)類型遏片。
3)Accept代表發(fā)送端(客戶端)希望接受的數(shù)據(jù)類型嘹害。
4)常見的MediaType
text/html、text/xml吮便、image/png
application/json笔呀、application/x-www-form-urlencoded (表單默認(rèn)的提交數(shù)據(jù)的格式)、multipart/form-data (文件上傳)
5)導(dǎo)出excel髓需,返回字節(jié)數(shù)組response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("中文url編碼","UTF-8") + ".xls");
6)類型格式:type/subtype(;parameter)

1许师,Spring視圖解析

1)jsp視圖解析

@Bean//配置視圖解析viewResolver(spring mvc的9大組件)
public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
        internalResourceViewResolver.setSuffix(".jsp");

        return internalResourceViewResolver;
}

2)thymeleaf視圖解析(需要引入compile 'org.thymeleaf:thymeleaf-spring4:3.0.3.RELEASE'和compile 'org.thymeleaf:thymeleaf:3.0.3.RELEASE')

@Bean
    public ThymeleafViewResolver thymeleafViewResolver(){
        ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
        thymeleafViewResolver.setOrder(1);
        thymeleafViewResolver.setCharacterEncoding("utf-8");
        thymeleafViewResolver.setTemplateEngine(templateEngine());

        return thymeleafViewResolver;
    }

@Bean
    public SpringTemplateEngine templateEngine(){
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        templateEngine.addDialect("shiro", new ShiroDialect());

        return templateEngine;
    }

@Bean
    public SpringResourceTemplateResolver templateResolver(){
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCacheable(false);//設(shè)置熱部署
        templateResolver.setOrder(1);
        templateResolver.setCharacterEncoding("UTF-8");

        return templateResolver;
    }

2,基于視圖的method與基于restful的method僚匆。

@Controller
class AccountController {
    // RESTful method
    @RequestMapping(value="/accounts", produces={"application/xml", "application/json"})
    @ResponseBody//會經(jīng)過內(nèi)容協(xié)商微渠,返回具體的視圖
    public  List<Account> listWithMarshalling(Principal principal) {
        return accountManager.getAccounts(principal);
    }

    // View-based method
    @RequestMapping("/accounts")//`會使用配置的viewResolver`
    public String listWithView(Model model, Principal principal) {
        // Call RESTful method to avoid repeating account lookup logic
        model.addAttribute( listWithMarshalling(principal) );

        // Return the view to use for rendering the response
        return ¨accounts/list¨;
    }
}

3,重寫WebMvcConfigurerAdapter的configureContentNegotiation方法白热,配置內(nèi)容協(xié)商的策略敛助。

    /**
     * 配置內(nèi)容協(xié)商的策略
     */
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        Map<String, MediaType> mediaTypeMap = new HashMap<>();
        mediaTypeMap.put("html", MediaType.TEXT_HTML);
        mediaTypeMap.put("json", MediaType.APPLICATION_JSON);
        mediaTypeMap.put("atom", MediaType.APPLICATION_ATOM_XML);

        configurer.favorParameter(false)//是否支持format=json參數(shù)
                .favorPathExtension(false).useJaf(false)//是否支持.json .xml等擴(kuò)展名
                .ignoreAcceptHeader(true)//忽視Accept請求頭
                .defaultContentType(MediaType.APPLICATION_JSON)//默認(rèn)返回的context-type
                .mediaTypes(mediaTypeMap);

        super.configureContentNegotiation(configurer);
    }

4,配置內(nèi)容協(xié)商的多視圖解析器屋确。

    @Bean
    public ContentNegotiatingViewResolver contentNegotiatingViewResolver(){
        ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver();
        List<ViewResolver> viewResolverList = new ArrayList<>();
        viewResolverList.add(thymeleafViewResolver());

        List<View> viewList = new ArrayList<>();
        viewList.add(mappingJackson2JsonView()); // 配置默認(rèn)視圖解析

        contentNegotiatingViewResolver.setOrder(1);
        contentNegotiatingViewResolver.setViewResolvers(viewResolverList);
        contentNegotiatingViewResolver.setDefaultViews(viewList);

        return contentNegotiatingViewResolver;
    }

@Bean
    public MappingJackson2JsonView mappingJackson2JsonView(){
        return new MappingJackson2JsonView();//使用MappingJackson2JsonView 配合@ResponseBody來返回JSON格式
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市续扔,隨后出現(xiàn)的幾起案子攻臀,更是在濱河造成了極大的恐慌,老刑警劉巖纱昧,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刨啸,死亡現(xiàn)場離奇詭異,居然都是意外死亡识脆,警方通過查閱死者的電腦和手機(jī)设联,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門善已,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人离例,你說我怎么就攤上這事换团。” “怎么了宫蛆?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵艘包,是天一觀的道長。 經(jīng)常有香客問我耀盗,道長想虎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任叛拷,我火速辦了婚禮舌厨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忿薇。我一直安慰自己裙椭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布煌恢。 她就那樣靜靜地躺著骇陈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑰抵。 梳的紋絲不亂的頭發(fā)上你雌,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音二汛,去河邊找鬼婿崭。 笑死,一個胖子當(dāng)著我的面吹牛肴颊,可吹牛的內(nèi)容都是我干的氓栈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼婿着,長吁一口氣:“原來是場噩夢啊……” “哼授瘦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竟宋,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤提完,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丘侠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒欣,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年蜗字,在試婚紗的時候發(fā)現(xiàn)自己被綠了打肝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脂新。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粗梭,靈堂內(nèi)的尸體忽然破棺而出争便,到底是詐尸還是另有隱情,我是刑警寧澤楼吃,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布始花,位于F島的核電站,受9級特大地震影響孩锡,放射性物質(zhì)發(fā)生泄漏酷宵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一躬窜、第九天 我趴在偏房一處隱蔽的房頂上張望浇垦。 院中可真熱鬧,春花似錦荣挨、人聲如沸男韧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此虑。三九已至,卻和暖如春口锭,著一層夾襖步出監(jiān)牢的瞬間朦前,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工鹃操, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留韭寸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓荆隘,卻偏偏與公主長得像恩伺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子椰拒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晶渠,服務(wù)發(fā)現(xiàn),斷路器燃观,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,827評論 6 342
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,993評論 6 13
  • 那天有個朋友在微信里要問來我們銀行貸款的利率是多少乱陡,然后順便提及我在家療傷的事兒,他的第一反應(yīng)是:好好的一個姑娘仪壮,...
    肉盾家的嘟嘟閱讀 223評論 0 0
  • 大家好积锅,本人現(xiàn)就業(yè)中國人民保險工作業(yè)務(wù)經(jīng)理爽彤,需要了解壽險,健康險缚陷,財產(chǎn)險适篙,意外險,教育險箫爷,養(yǎng)老險嚷节,車險,建工險等各...
    dcbbb8c129a4閱讀 281評論 0 0