latar belakang
Teman -teman yang menggunakan Naluri Restful untuk mengekspor kebutuhan ini ditolak ~ Menghancurkan konsistensi URL yang tenang [koreksi ketat adalah HTTP JSON atau RESTful. Banyak teman akan mengekspos JSON dan menyebutnya RESTFUL secara langsung]
Seperti pada generator kode di atas, kami akan menghasilkan banyak kode, yang sebagian besar adalah restcontrollers.
Kelas Abstrak Publik AbstractrestController <v memperluas vo, s extends so, pk memperluas serializable> {kelas terlindungi <v> voclazz; @Autowired Private Service <V, S, PK> Layanan; Publik abstractrestController () {typetoken <v> votype = new typetoken <v> (getClass ()) {}; voclazz = (class <v>) votype.getRawType (); } @PostMapping () @ApiOperation (value = "new entity", notes = "") Hasil Publik Tambah (@RequestBody v vo) {service.saveselective (vo); return resultGenerator.gensccessResult (); } @DeleteMapping ("/{id}") @ApiOperation (value = "Delete Entity", notes = "") Hasil Hasil Publik Hapus (@PathVariable PK ID) {service.deletebyId (id); return resultGenerator.gensccessResult (); } @PutMapping @ApiOperation (value = "Update Entity", notes = "") Pembaruan hasil publik (@RequestBody v vo) {service.updatebyprimarykeyselective (vo); return resultGenerator.gensccessResult (); } @GetMapping @ApiOperation (value = "Get Entity List", notes = "") Daftar Hasil Publik (S SO) {pageHelper.StartPage (so.getCurrentPage (), so.getPageSize ()); Daftar <V> list = service.findall (); PageInfo pageInfo = pageInfo baru (daftar); ExcelExportParam (); return resultGenerator.gensccessResult (pageInfo); } void excelExportParam () {ExportParams EP = ExportParams baru (null, "data"); ExcelExportParam <V> param = ExcelExportParam baru <> (); param.setClazz (voclazz); param.setexcelExport (excelexport.normalexcel); param.setExportParams (EP); param.setFileName ("file.xls"); F6static.setExcelExportParam (param); } @GetMapping ("/{id}") @ApiOperation (value = "Get Single Entity", notes = "") Detail Hasil Publik (@PathVariable PK ID) {V vo = service.findbyId (id); return resultGenerator.gensccessResult (VO); } @DeleteMapping ("/batch") @ApiOperation (value = "Batch Delete Entity", notes = "") Hasil publik BatchDelete (@RequestParam string id) {service.deletebyIds (id); return resultGenerator.gensccessResult (); } @GetMapping ("/batch") @ApiOperation (value = "Batch Get Entity", notes = "") Hasil publik BatchDetail (@RequestParam string id) {List <v> vos = service.findbyIds (id); return resultGenerator.gensccessResult (VOS); } @PostMapping ("/batch") @ApiOperation (value = "Batch New Entity", notes = "") Hasil Tambah (@RequestBody List <v> vos) {service.save (vos); return resultGenerator.gensccessResult (); } @GetMapping ("/count") @ApiOperation (value = "Dapatkan jumlah entitas", notes = "") Count Hasil Publik (@RequestBody V V) {int count = service.selectCount (v); return resultGenerator.gensccessResult (Count); }Jadi bagaimana cara mengekspor? [Faktanya, dapat dipahami bahwa ekspor adalah tampilan data, tetapi hasilnya bukan hanya JSON]
Jika ada pertanyaan, lalu bagaimana dengan masuk? Solusi tradisional adalah logout login. Jadi apa gagasan mengganti sumber daya yang tenang?
Kiat: Masuk adalah sesi baru. Logout adalah sesi Hapus.
menyelesaikan
Berdasarkan ide -ide di atas, kami secara alami berpikir bahwa kami hanya perlu mengembalikan banyak hasil ke URL yang sama, bukankah tidak apa -apa? [PDF, satu versi, satu versi, satu versi, satu versi, satu versi, satu versi]
bingo! Ini adalah asal dari negosiator konten
Negosiator konten tidak dibuat oleh Spring, pada kenyataannya, ini dapat dilihat dari header HTTP.
1. Misalnya, kembali ke halaman bahasa Inggris ke pelanggan bahasa Inggris terlalu banyak untuk halaman Cina.
Protokol HTTP mendefinisikan nilai kualitas (disebut sebagai nilai Q) yang memungkinkan klien untuk mendaftar beberapa opsi untuk setiap kategori preferensi dan mengaitkan prioritas untuk setiap opsi preferensi.
Penerimaan-bahasa: en; q = 0,5, fr; q = 0,0, nl; q = 1.0, tr; q = 0,0
Di mana nilai Q berkisar antara 0,0 hingga 1,0 (0,0 adalah prioritas terendah, sedangkan 1,0 adalah prioritas tertinggi).
Perhatikan bahwa urutan preferensi tidak penting, hanya nilai q yang terkait dengan preferensi yang penting
2. Lalu ada beberapa parameter lain seperti menerima header
Biasanya, negosiator konten terlebih dahulu memiliki solusi berikut
1.gara menerima header:
Ini adalah yang biasa dijelaskan dalam buku teks. Idealnya, metode ini adalah yang terbaik, tetapi jika sumber daya Anda harus diakses langsung melalui browser (mis., Tampilan HTML), maka karena perbedaan browser, header header ACCECT yang dikirim akan berbeda. Ini akan menyebabkan server tidak tahu format data apa yang akan dikembalikan kepada Anda. Berikut ini adalah header penerimaan browser
Chrome: Terima: Aplikasi/XML, Aplikasi/XHTML+XML, TEXTML; q = 0.9, Teks/Polos; Q = 0.8, Image/Png,*/*; q = 0.5 Firefox: AcCECT: TEKS/HTML, Aplikasi/XHTML+XML, Aplikasi/XML; Q = 0.9,*; Image/PJPEG, Aplikasi/X-Shockwave-Flash, Application/X-Silverlight, Application/X-MS-Application, Application/X-MS-XBAP, Aplikasi/VND.MS-XPSDocument, Application/XAML+XML, */ *
2. Gunakan ekstensi
URL yang sama telah hilang, tetapi metode ini paling banyak digunakan di lingkungan aktual karena lebih sesuai dengan pandangan estetika pemrogram.
Misalnya /user.json /user.xls /user.xml
Menggunakan parameter sekarang banyak API terbuka menggunakan metode ini, seperti taobao
Namun, untuk browser yang berbeda, header menerima mungkin tidak terlalu bersatu, begitu banyak implementasi memilih 2 3 dua solusi.
Kami mengadopsi dua solusi di atas di musim semi
Pertama kali mengkonfigurasi negosiator konten
Kode
@Bean Public ViewResolver ContentNeGotiatingViewResolver (ContentNeGotiationManager Manager) {// Tentukan view resolver viewResolver beannameviewResolver = new beannameviewResolver (); Daftar <AYERRESOLVER> resolvers = lists.newarraylist (beannameviewResolver); ContentNeGotiatingViewResolver resolver = ContentNeGoTiatingViewResolver () baru; resolver.setViewResolver (resolver); resolver.setContentNegotiationManager (manajer); resolver kembali; } @Override public void configureContentNeGotiation (contentNeGotiationConfigurer configure) {configurer.favorpathextension (true) .useJaf (false) .favorparameter (true) .parametername ("format") .ignoreacepheader (true) .parametername ("format") .ignoreaceptheader (true) .defaultContentContent (format ") .ignoreacepTheader (true) .defaultContentContent (format") .ignoreaceptheader (true) .defaultContentContent (truePEnPeCepTheader (true) .DEFAURCONP.PAULICEPTEACEPTHON (true). Mediatype.application_json) .mediatype ("xls", excel_media_type); }Buat konverter yang sesuai
Private httpmessageConverter <PapEck> createExcelhttpMessageConverter () {excelhttpmessageConverter excelhttpmessageConverter = excelhttpmessageConverter () baru; return excelhttpmessageConverter; }Ekspor Data Langsung Menggunakan Easy-Poi
/ * * Hak Cipta (C) 2017. Lorem iPsum Dolor Sit Amet, elit adipiscing konsisten. * Morbi Non Lorem PortTitor Neque Feugiat Blandit. UT Vitae ipsum Eget quam lacinia accumsan. * ETIAM SED TURPIS AC ipsum condimentum fringilla. Maecenas Magna. * Proin Dapibus Sapien Vel Ante. Aliquam Erat Volutpat. Pellentesque Sagittis Ligula Eget Metus. * Commodo vestibular. UT Rhoncus gravida Arcu. */ paket com.f6car.base.web.converter; impor cn.afterturn.easypoi.excel.excelExportutil; impor com.f6car.base.common.result; impor com.f6car.base.core.excelExport; impor com.f6car.base.core.excelExportParam; impor com.github.pagehelper.pageeinfo; impor com.google.common.collect.lists; impor org.apache.poi.ss.usermodel.workbook; impor org.springframework.http.httpheaders; impor org.springframework.http.httpinputMessage; impor org.springframework.http.httpoutputMessage; impor org.springframework.http.mediatype; impor org.springframework.http.converter.abstracthttpMessageConverter; impor org.springframework.http.converter.generichttpmessageConverter; impor org.springframework.http.converter.httpmessagenotreadableException; impor org.springframework.http.converter.httpmessagenotwritable exception; impor java.io.ioException; impor java.lang.reflect.type; impor java.net.urlencoder; impor java.util.collection; impor java.util.collections; impor java.util.collections; impor java.util.map; impor statis com.f6car.base.core.f6static.getExcelExportParam; /** * @author qixiaobo */ public class ExcelHttpMessageConverter extends AbstractHttpMessageConverter<Object> implements GenericHttpMessageConverter<Object> { public static final MediaType EXCEL_MEDIA_TYPE = new MediaType("application", "vnd.ms-excel"); public excelhttpMessageConverter () {super (excel_media_type); } @Override Dukungan boolean yang dilindungi (kelas <?> Clazz) {return false; } @Override Obyek Protected ReadInternal (Class <?> CLAZZ, HTTPInputMessage InputMessage) melempar IOException, httpmessagenotreadableException {return null; } @Override Protected void writeInternal (Objek O, httpoutputMessage outputMessage) melempar ioException, httpMessagenotwritable exception {httpheaders header = outputMessage.getheaders (); Data pengumpulan = getActualData ((hasil) o); ExcelExportParam excelExportParam = getExcelExportParam (); Buku kerja buku kerja; Switch (ExcelExportParam.GetExcelExport ()) {case normalexcel: workbook = excelexportutil.exportexcel (excelexportparam.getExportParams (), (kelas <?>) data excelexportparam.getClazz (), (collection <?>)); merusak; case mapexcel: workbook = excelexportutil.exportexcel (excelexportparam.getExportParams (), excelExportParam.getExcelExportentities (), (koleksi <? Extends peta <?,? >>) data); merusak; case BigExcel: case mapexcelgraph: case pdftemplate: case templateexcel: case templateword: default: lempar runimeException baru (); } if (workbook! = null) {if (excelExportParam.getFileName ()! = null) {string codedFileName = urlencoder.encode (excelexportparparam.getFileName (), "UTF8"); header.setContentDispositionFormData ("lampiran", codedFileName); } workbook.write (outputMessage.getBody ()); }} koleksi pribadi getActualData (hasil r) {if (r! = null && r.getData ()! = null) {objek data = r.getData (); if (data instanceof pageInfo) {return ((pageInfo) data) .getList (); } else if (! (Data instanceof collection)) {data = lists.newarraylist (data); } else {return (collection) data; }} return collections.emptylist (); } @Override public boolean canread (tipe tipe, kelas <?> ContextClass, mediatype mediatype) {// excel return false tidak didukung; } @Override Objek publik Baca (Jenis Jenis, Kelas <?> ContextClass, InputMessage httpInputMessage) melempar ioException, httpmessagenotreadableException {return null; } @Override public boolean canwrite (tipe tipe, kelas <?> Clazz, mediatype mediatype) {return super.canwrite (mediatype) && clazz == result.class && dukungan (); } dukungan private boolean () {excelExportParam param = getExcelExportParam (); if (param == null || param.getExcelExport () == null || param.getExportParams () == null) {return false; } if (param.getExcelExport () == excelexport.normalexcel) {return true; } else {logger.warn (param.getExcelExport () + "tidak mendukung sekarang!"); mengembalikan false; }} @Override public void write (objek O, tipe tipe, mediatype contentType, httpoutputMessage outputMessage) melempar ioException, httpmessagenotwritable exception {super.write (o, contentType, outputMessage); }}Untuk saat ini, itu hanya untuk ekspor, jadi ketika digunakan sebagai berikut
@GetMapping @ApiOperation (value = "Get Entity List", notes = "") Daftar Hasil Publik (S SO) {pageHelper.StartPage (so.getCurrentPage (), so.getPageSize ()); Daftar <V> list = service.findall (); PageInfo pageInfo = pageInfo baru (daftar); ExcelExportParam (); return resultGenerator.gensccessResult (pageInfo); } void excelExportParam () {ExportParams EP = ExportParams baru (null, "data"); ExcelExportParam <V> param = ExcelExportParam baru <> (); param.setClazz (voclazz); param.setexcelExport (excelexport.normalexcel); param.setExportParams (EP); param.setFileName ("file.xls"); F6static.setExcelExportParam (param); }Saat kami berkunjung
http://127.0.0.1:8079/zeus/user
{"kode": 200, "data": {"endrow": 10, "firstpage": 1, "hasnextpage": true, "haspreviouspage": false, "isFirstPage": true, "isLastpage": false, "lastpage": 8, "list": {"selphone": "1385," lastpage ": 8," list ": {" selphone ":" 1381. "1385," lastpage ": 8," {"selphone": "1385," 24201883434352650, "Idownorg": 23993199378825296, "IDROLE": 88, "IDWXBSTATION": "332", "IDWXBUSER": "207", "ISADMIN": 1, "ISDEL": 0, "ISGUED" ISGU "," ISADMIN ": 1," ISDEL ":" ISDEL ":" ISED "ISDEL": "ISDEL": "ISED": "ISDMIN": "ISDMIN": "ISDMIN": "ISDMIN": "ISADMIN": "ISADMIN": "ISADMIN": "ISADMIN": " "", "Kata Sandi": "96E79218965EB72C92A549DD5A330112", "PKID": 23931993788825296, "nama pengguna" (IdeMe. (IdeRe. ("Ide.e. 4, "IDWXBSTATION": "", "", "IDWXBUSER": "", "Isadmin": 0, "Isdel": 0, "Isguideopen": 0, "Limitmac": 0, "OpenID": "", "Kata Sandi": "96e79218965EB72C92," Kata sandi ":" 96e792189651515 24201883434356532, "nama pengguna": "007"}, {"ponsel": "15715139000", "Idemployee": 24351585207523460, "IDOWNG": 24201888343434357600, "IDOWNREG": 24201888343434357600, "IDOWNOX": 2420188343434357600, " "IDWXBUSER": "298", "Isadmin": 1, "Isdel": 0, "Isguideopen": 0, "Limitmac": 0, "OpenID": "", "Kata Sandi": "96e79218965EB72C92A54949DDDD5A30112", "212.218212.21 "username": "15715139000" }, { "cellPhone": "", "idEmployee": 0, "idOwnOrg": 24201883434357600, "idRole": 216, "idWxbStation": "", "idWxbUser": "", "isAdmin": 0, "isDel": 0, "isGuideOpen": 0, "LimitMac": 0, "OpenId": "", "Kata Sandi": "96e79218965EB72C92A549DD5A330112", "PKID": 24201883434357920, "nama USERNEE": "Sunlingli"}, {"": "" Idlingli "": "Idlingli"} {"": "": "Sunlingli"}, {"": "": "Sunlingli"} {"": "": "Sunlingli"} {"" ":" "{" ":" "{" "{" {"" 24351585207425676, "Idownorg": 24201883434359384, "IDROLE": 90, "IDWXBSTATION": "348", "IDWXBUSER": "227", "ISADMIN": 1, "ISDEL": 0, "ISGUED" ISUREDED "ISADMIN": 1, "ISDEL": 0, "ISED" ISDEL ":" ISDEL ":" ISED ":" ISDMIN ": 1," ISDMIN ":" ISDMIN ":" ISADMIN ":" ISADMIN ":" "opzUDs_v13WE500kxYMj6Xg_gFeE", "password": "96e79218965eb72c92a549dd5a330112", "pkId": 24201883434359388, "username": "15952920979" }, { "cellPhone": "", "Idemployee": 0, "Idownorg": 24201883434359790, "IDROLE": 91, "IDWXBSTATION": "315", "IDWXBUSER": "" "", "" "," "," "," "" "," "" "" "" "" "," "," " "96E79218965EB72C92A549DD5A330112", "PKID": 24201883434359790, "Nama Pengguna": "13809056211"}, {"Seluler": "18903885" "Idphone": "18903885" "Idphone": "18903885" "Idphone": " "Idownorg": 24201883434359890, "idrole": 92, "idwxbStation": "317", "idwxbuser": "178", "isadmin": 1, "isdel": "Isguideopen": 0, "Limitmac": " "96e79218965eb72c92a549dd5a330112", "pkid": 24201883434359892, "nama pengguna": "189038585"}, "ponsel": "" "," Idemeorg ": 243. 243174887878." 24201883434359924, "idrole": 93, "idwxbStation": "318", "idwxbuser": "179", "isadmin": 1, "isdel": 0, "Isguideopen": 0, "LimitMac": 0, "Openid", "" " "96E79218965EB72C92A549DD5A330112", "PKID": 2420188343435930, "Nama Pengguna": "1337229595"}, {"ponsel": "" "Idrole": 94, "idwxbstation": "321", "idwxbuser": "188", "isadmin": 1, "isdel": 0, "Isguideopen": 0, "LimitMac": 0, "OpenID": "", "" ":" 96E7921892189.196. "OpenID": "" " "PKID": 24201883434360052, "nama pengguna": "15221250005"}, {"ponsel": "", "Idemployee": 0, "Idownorg": "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "IsAdmin": 1, "Isdel": 0, "Isguideopen": 0, "Limitmac": 0, "OpenId": "", "Kata Sandi": "96e79218965eb72c92a516" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" }], "navigateFirstPage": 1, "navigateLastpage": 8, "navigatePage": 8, "navigatePagenums": [1, 2, 3, 4, 5, 6, 7, 8], "nextpage": "orderby": "", "pagen", 1, "page": "page": "pagenpage": "Pagen," Pagen, " 10, "StarTrow": 1, "Total": 1012}, "Pesan": "Sukses"}Saat mengakses http://127.0.0.1:8079/zeus/user?format=xls atau http://127.0.0.1:8079/zeus/user.xls
Efek berikut
Karena data di sini terkait dengan kueri, kita dapat beroperasi dengan cara ini http://127.0.0.1:8079/zeus/user.xls?pageSize=1000 dengan mudah mewujudkan xlsization hasil kueri!
Meringkaskan
Di atas adalah ilustrasi negosiator konten di Springboot yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!