خلفية
يتم رفض الأصدقاء الذين يستخدمون غريزة مريحة لتصدير هذه الاحتياجات ~ إنه يدمر اتساق عناوين URL المريحة [تصحيح صارم هو إما HTTP JSON أو RESTFLE. سيقوم العديد من الأصدقاء بفضح JSON ويطلقون عليه مريحًا مباشرة]
كما هو الحال في مولد الرمز أعلاه ، سنقوم بإنشاء مجموعة من الرموز ، ومعظمها من المتسابقين.
فئة مجردة عامة AbstractrestController <V تمتد VO ، S تمتد So ، PK يمتد Serializable> {فئة محمية <V> voclazz ؛ خدمة خاصة Autowired <V ، S ، Pk> ؛ Public AbstractrestController () {typetoken <v> VotyPe = new typetoken <V> (getClass ()) {} ؛ voclazz = (class <v>) Votype.getRawtype () ؛ } postmapping () apiOperation (value = "intity new" ، notes = "") public add ( @requestbody v vo) {service.savesElective (vo) ؛ return resultgenerator.gensuccessResult () ؛ } deletemapping ("/{id}") apiOperation (value = "delete ectity" ، notes = "") delete ( @pathvariable pk id) {service.deleteById (id) ؛ return resultgenerator.gensuccessResult () ؛ } putmapping apiOperation (value = "update icke" ، notes = "") update report update (requestbody v vo) {service.updateByPrimaryKeySelective (vo) ؛ return resultgenerator.gensuccessResult () ؛ } getMappingApiOperation (value = "get intity list" ، notes = "") قائمة النتائج العامة (s so) {pagehelper.startPage (so.getCurrentPage () ، so.getPagesize ()) ؛ قائمة <v> list = service.findall () ؛ pageInfo pageInfo = new pageInfo (list) ؛ excelexportparam () ؛ return resultgenerator.gensuccessResult (pageInfo) ؛ } void void excelexportparam () {exportParams ep = new esportParams (null ، "data") ؛ excelexportparam <v> param = new excelexportparam <> () ؛ param.setClazz (voclazz) ؛ param.setexcelexport (excelexport.normalexcel) ؛ param.setexportparams (EP) ؛ param.setFilename ("file.xls") ؛ f6static.setexcelexportparam (param) ؛ } getMapping ("/{id}") apiOperation (value = "الحصول على كيان واحد" ، Notes = "") تفاصيل النتيجة العامة (pathvariable pk id) {v vo = service.findbyid (id) ؛ return resultgenerator.gensuccessResult (VO) ؛ } deletemapping ("/batch") apiOperation (value = "batch delete ectity" ، notes = "") public result batchdelete (requestparam string ids) {service.deletebyids (ids) ؛ return resultgenerator.gensuccessResult () ؛ } getMapping ("/batch") apiOperation (value = "batch get ectity" ، notes = "") batchdetail batchdetail ( @requestparam string ids) {list <v> vos = service.findbyids (ids) ؛ return resultgenerator.gensuccessResult (VOS) ؛ } postmapping ("/batch") apiOperation (value = "Batch New Crettity" ، Notes = "") public result add (requestbody list <V> vos) {service.save (vos) ؛ return resultgenerator.gensuccessResult () ؛ } getMapping ("/count") apiOperation (value = "الحصول على عدد الكيانات" ، Notes = "") عدد النتائج العامة (requestbody v) {int count = service.selectcount (v) ؛ return resultgenerator.gensuccessResult (count) ؛ }فكيف يتم التصدير؟ [في الواقع ، يمكن فهم أن التصدير هو عرض البيانات ، ولكن النتيجة ليست فقط JSON]
إذا تم طرح سؤال ، فماذا عن تسجيل الدخول؟ الحلول التقليدية هي تسجيل الدخول إلى تسجيل الدخول. إذن ما هي فكرة استبدال الموارد المريحة؟
نصيحة: تسجيل الدخول هو الجلسة الجديدة. تسجيل الخروج هو جلسة الحذف.
ينجز
استنادًا إلى الأفكار المذكورة أعلاه ، اعتقدنا بشكل طبيعي أننا نحتاج فقط إلى إرجاع نتائج متعددة إلى عنوان URL نفسه ، أليس كذلك؟ [PDF ، إصدار واحد ، إصدار واحد ، إصدار واحد ، إصدار واحد ، إصدار واحد ، إصدار واحد]
بنغو! هذا هو أصل مفاوض المحتوى
لم يتم إنشاء مفاوض المحتوى بحلول الربيع ، في الواقع ، يمكن رؤية ذلك من رأس HTTP.
1. على سبيل المثال ، يعد العودة إلى الصفحة الإنجليزية إلى العميل الإنجليزي أكثر من اللازم للصفحة الصينية.
يحدد بروتوكول HTTP قيم الجودة (المشار إليها باسم قيم Q) التي تسمح للعملاء بإدراج خيارات متعددة لكل فئة تفضيل وربط أولوية لكل خيار تفضيل.
قبول اللغة: en ؛ q = 0.5 ، fr ؛ q = 0.0 ، nl ؛ q = 1.0 ، tr ؛ q = 0.0
حيث تتراوح قيمة Q من 0.0 إلى 1.0 (0.0 هي أقل أولوية ، في حين أن 1.0 هو الأولوية القصوى).
لاحظ أن ترتيب التفضيلات غير مهم ، فقط قيمة Q المتعلقة بالتفضيلات مهمة
2. ثم هناك بعض المعلمات الأخرى مثل القبول
عادة ، لدى مفاوض المحتوى الحلول التالية أولاً
1. استخدم الرأس:
هذا شائع الموصوف في الكتب المدرسية. من الناحية المثالية ، هذه الطريقة هي الأفضل ، ولكن إذا تم الوصول إلى مواردك مباشرة من خلال المتصفح (أي عرض HTML) ، ثم بسبب اختلافات المتصفح ، فسيكون رأس رأس القبول المرسل مختلفًا. سيؤدي ذلك إلى عدم معرفة الخادم ما هو تنسيق البيانات لإرجاعك. فيما يلي رأس قبول المتصفح
chrome: قبول: التطبيق/xml ، التطبيق/xhtml+xml ، textml ؛ Image/PJPEG ، Application/X-shockwave-flash ، application/x-silverlight ، application/x-ms-application ، application/x-ms-xbap ، application/vnd.ms-xpsdocument ، application/xaml+xml ، */ */ *
2. استخدم التمديد
تم فقد عنوان URL نفسه ، ولكن يتم استخدام هذه الطريقة أكثر في البيئة الفعلية لأنها تتماشى أكثر مع العرض الجمالي للمبرمجين.
على سبيل المثال /user.json /user.xls /user.xml
باستخدام المعلمات الآن ، استخدم العديد من واجهات برمجة التطبيقات المفتوحة هذه الطريقة ، مثل Taobao
ومع ذلك ، بالنسبة للمتصفحات المختلفة ، قد لا يكون القبول موحدًا بشكل خاص ، لذا فإن العديد من التطبيقات تختار 2 3 حلين.
نتبنى الحلتين أعلاه في الربيع
قم أولاً بتكوين مفاوض المحتوى
شفرة
Bean Public ViewResolver ContentNegotiAtingViewResolver (ContentNegotiationManager Manager) {// تحديد Resolvers ViewResolver BeannameViewResolver = NewNameViewResolver () ؛ قائمة <FiewResolver> Resolvers = lists.newarrayList (BeanNameViewResolver) ؛ contentNegotiAtingViewResolver Resolver = new contentNegotiAtingViewResolver () ؛ Resolver.setViewResOlvers (Resolvers) ؛ Resolver.setContentNegotiationManager (مدير) ؛ إرجاع محلول ؛ } Override public void configureContentNegotiation (contentNegotiationConfigurer configure) {configurer.favorpathextension (true) .usejaf (false) .favorparameter (true) .parametername ("format") .InSCEPTHEADERER . mediAtype ("json" ، mediaType.application_json). MediAtype ("XLS" ، excel_media_type) ؛ }إنشاء المحول المقابل
private httpmessageConverter <Object> createExcelHttpMessageConverter () {excelhttpmessageconverter excelhttpmessageconverter = new excelhttpmessageConverter () ؛ إرجاع excelhttpmessageConverter ؛ }بيانات التصدير مباشرة باستخدام Easy-POI
] * Morbi non lorem porttitor neque feugiat blandit. UTAAE IPSUM eget quam lacinia accumsan. * ETIAM SED TURPIS AC IPSUM CONDRINTUM Fringilla. Maecenas Magna. * proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque Sagittis Ligula Eget Metus. * الدهليزي العميد. UT RHONCUS GRAVIDA ARCU. */ package com.f6car.base.web.converter ؛ استيراد cn.afterturn.easypoi.excel.excelexportutil ؛ استيراد com.f6car.base.common.Result ؛ استيراد com.f6car.base.core.excelexport ؛ استيراد com.f6car.base.core.excelexportparam ؛ استيراد com.github.pageHelper.pageinfo ؛ استيراد com.google.common.collect.lists ؛ استيراد org.apache.poi.ss.usermodel.workbook ؛ استيراد org.springframework.http.httpheaders ؛ استيراد org.springframework.http.httpinputmessage ؛ استيراد org.springframework.http.httpoutputmessage ؛ استيراد org.springframework.http.mediatepe ؛ استيراد org.springframework.http.converter.abstracthttpmessageConverter ؛ استيراد org.springframework.http.converter.generichttpmessageConverter ؛ استيراد org.springframework.http.converter.httpmessagenotreadableable ؛ استيراد org.springframework.http.converter.httpmessagenotwithourfitable ؛ استيراد java.io.ioException ؛ استيراد java.lang.reflect.type ؛ استيراد java.net.urlencoder ؛ استيراد java.util.collection ؛ استيراد java.util.collections ؛ استيراد java.util.collections ؛ استيراد java.util.map ؛ استيراد static com.f6car.base.core.f6static.getexcelexportparam ؛ / ** * Author QixiAobo */ public class excelhttpmessageConverter يمتد AbstracthTtpMessageConverter <object> generichttpmessageConverter <object> {public static final mediaType excel_media_type = new mediaType ( public excelhttpmessageConverter () {super (excel_media_type) ؛ } Override Protected Boolean Support (class <؟> clazz) {return false ؛ } override كائن محمي ReadInternal (class <؟> clazz ، httpinputmessage inputMessage) يلقي ioexception ، httpmessagenotreadable {return null ؛ } override proted proid writeinternal (Object O ، HttPoutputMessage OutputMessage) يلقي iOexception ، httpmessagenotwithableexception {httpheaders headers = outputMessage.getheaders () ؛ بيانات التجميع = getActualData ((النتيجة) O) ؛ excelexportparam excelexportparam = getExcelExportParam () ؛ مصنف المصنف ؛ Switch (excelexportparam.getexcelexport ()) {case normalexcel: workbook = excelexportutil.exportexcel (excelexportparam.getexportparams () ، (class <؟ استراحة؛ Case mapexcel: forkbook = excelexportutil.exportexcel (excelexportparam.getexportparams () ، excelexportparam.getExcelExportentities () ، (collection <؟ exments map <؟ ، >>) البيانات) ؛ استراحة؛ CASE BIGEXCEL: CASE MAPEXCELGRAPT: CASE PDFTEMPLITE: CASE TEMPLATEEXCEL: CASE TEMPLATEWORD: الافتراضي: رمي new RunTimeException () ؛ } if (workbook! = null) {if (excelexportparam.getFilename ()! = null) {String CodeDfilename = urlencoder.encode (excelexportparam.getFilename () ، "utf8") ؛ headers.setContentDispositionFormData ("المرفق" ، codedfilename) ؛ } workbook.write (outputMessage.getBody ()) ؛ }} مجموعة خاصة getActualData (result r) {if (r! = null && r.getData ()! = null) {object data = r.getData () ؛ if (data estamueof pageInfo) {return ((pageInfo) data) .getList () ؛ } if if (! (data estairof collection)) {data = lists.newArrayList (data) ؛ } آخر {return (collection) data ؛ }} return collections.emptylist () ؛ } Override Public Boolean canread (نوع النوع ، الفئة <؟> contextClass ، MediaType MediaType) {// excel return false غير مدعوم ؛ } override الكائن العام قراءة (نوع النوع ، الفئة <؟> contextClass ، httpinputmessage inputMessage) يلقي ioexception ، httpmessagenotreadableexception {return null ؛ } Override Public Boolean Canwrite (النوع ، الفئة <؟> clazz ، mediaType MediaType) {return super.canwrite (mediaType) && clazz == result.class && support () ؛ } Private Boolean Support () {excelexportparam param = getExcelExportParam () ؛ if (param == null || param.getexcelexport () == null || param.getExportParams () == null) {return false ؛ } if (param.getexcelexport () == excelexport.normalexcel) {return true ؛ } آخر {logger.warn (param.getexcelexport () + "لا تدعم الآن!") ؛ العودة كاذبة }} Override public void write (object o ، type ، mediaType contentType ، httpoutputmessage outpressage) يلقي iOexception ، httpmessagenotwitableexception {super.write (o ، contenttype ، outputMessage) ؛ }}في الوقت الحالي ، هو فقط للتصدير ، لذلك عند استخدامه على النحو التالي
getMappingApiOperation (value = "Get intity List" ، Notes = "") قائمة النتائج العامة (s so) {pagehelper.startPage (so.getCurrentPage () ، so.getpagesize ()) ؛ قائمة <v> list = service.findall () ؛ pageInfo pageInfo = new pageInfo (list) ؛ excelexportparam () ؛ return resultgenerator.gensuccessResult (pageInfo) ؛ } void void excelexportparam () {exportParams ep = new esportParams (null ، "data") ؛ excelexportparam <v> param = new excelexportparam <> () ؛ param.setClazz (voclazz) ؛ param.setexcelexport (excelexport.normalexcel) ؛ param.setexportparams (EP) ؛ param.setFilename ("file.xls") ؛ f6static.setexcelexportparam (param) ؛ }عندما نزور
http://127.0.0.1:8079/zeus/user
{"Code": 200 ، "Data": {"endrow": 10 ، "firstpage: 1 ،" hasnextpage ": true ،" haspreviouspage ": false ،" isfirstpage ": true ،" islastpage: "false ، 24201883434352650 ، "Idownorg": 23993199378825296 ، "Idrole": 88 ، "idwxbstation": "332" ، "idwxbuser:" 207 "،" isadmin ": 1 ،" isdel: 0 ، " "" ، "كلمة المرور": "96E79218965EB72C92A549DDD5A330112" ، "PKID": 23993199378825296 ، "username": "Lingweiqiche" ، 4 ، "idwxbstation": "" ، "" ، "idwxbuser": "" ، "isadmin": 0 ، 24201883434356532 ، "username": "007"} ، {"الهاتف المحمول": "15715139000" ، "IDEMPLOMEEE": 24351585207523460 ، "Idownorg: 2420183434357600 ،" "idwxbuser": "298" ، "isadmin": 1 ، "ISDEL": 0 ، "isGuideopen": 0 ، "LimitMac": 0 ، "اسم المستخدم": "15715139000"} ، {"الهاتف المحمول": "" ، "الموظفين المعنيين": 0 ، "Idownorg": 24201883434357600 ، "Idrole": 216 ، "idwxbstation": "idwxbuser": 0 ، "limitMac": 0 ، "OpenId": "" ، "Password": "96E79218965EB72C92A549DD5A330112" ، "PKID": 24201883434357920 ، "username": 24351585207425676 ، "Idownorg": 24201883434359384 ، "Idrole": 90 ، "idwxbstation": "348" ، "idwxbuser:" 227 "، "opzuds_v13we500kxymjj6xg_gfee" ، "كلمة المرور": "idemployee": 0 ، "Idownorg": 24201883434359790 ، "Idrole": 91 ، "IdwxbStation": "315" ، "Idwxbuser": "175" ، "isadmin: 1 ،" isdel ": 0 ، "96E79218965EB72C92A549DD5A330112" ، "PKID": 24201883434359790 ، "username": "13809056211"} ، {"phone):" 1890385585 "،" "Idownorg": 24201883434359890 ، "Idrole": 92 ، "IdwxbStation": "317" ، "idwxbuser": "178" ، "isadmin": 1 ، "96E79218965EB72C92A549DD5A330112" ، "PKID": 24201883434359892 ، "username": "1890385255585"} ، {"phone" ، "" ، "idemeee:" 2435158520742. 24201883434359924 ، "Idrole": 93 ، "IDWXBStation": "318" ، "idwxbuser": "179" ، "isadmin": 1 ، "96E79218965EB72C92A549DD5A330112" ، "PKID": 24201883434359930 ، "اسم المستخدم": "13372299595" "Idrole": 94 ، "idwxbstation": "321" ، "idwxbuser": "188" ، "isadmin": 1 ، "ISDEL": 0 ، "Isguideopen": 0 ، " "pkid": 24201883434360052 ، "اسم المستخدم": "15221250005"} ، {"الهاتف المحمول": "،" idemployee ": 0 ،" idownorg ": 24201883434360070 ،" idrole ":" idwxbstation: "325" ، " "isadmin": 1 ، "iSdel": 0 ، "isGuideopen": 0 ، "LimitMac": 0 ، "OpenID": "" ، "password": }] ، "sistigateFirstPage": 1 ، "NavigatelastPage": 8 ، "TavigatePages": 8 ، "TavigatePagenums": [1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8] ، "Nextpage": 2 ، "Orderby": "" ، "pagenum": 1 ، "pages": 10 ، 10 ، "StarTrow": 1 ، "Total": 1012} ، "Message": "Success"}عند الوصول إلى http://127.0.0.1:8079/zeus/user؟format=xls أو http://127.0.0.1:8079/zeus/user.xls
الآثار التالية
نظرًا لأن البيانات هنا مرتبطة بالاستعلام ، يمكننا تشغيل بهذه الطريقة http://127.0.0.1:8079/zeus/user.xls؟pagesize=1000 إدراك بسهولة xlsization من نتائج الاستعلام!
لخص
ما ورد أعلاه هو توضيح لمفاوض المحتوى في سبرينغ بوت الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!