سؤال

هل يمكن لأي شخص أن يوصي بإطار عمل لصياغة/تنسيق الرسائل في تطبيق مستقل على غرار JSP EL (لغة التعبير)؟

أتوقع أن أكون قادرًا على إنشاء كائن من نوع ما، وإعطائه قالبًا على غرار

Dear ${customer.firstName}. You order will be dispatched on ${order.estimatedDispatchDate}

قم بتزويده بسياق يتضمن قاموس قيم لكائنات المعلمات (في هذه الحالة، كائن من النوع "عميل" باسم "عميل"، على سبيل المثال، وكائن من النوع "طلب" باسم "طلب").

أعلم أن هناك العديد من أطر عمل القوالب - العديد منها يعمل خارج سياق تطبيق الويب، لكنني لا أرى هذا كإطار عمل قوالب كبير ثقيل الوزن.مجرد نسخة أفضل من وظيفة تنسيق الرسالة الأساسية التي توفرها Java بالفعل

على سبيل المثال، يمكنني إنجاز ما سبق باستخدام java.text.MessageFormat باستخدام قالب (أو "نمط" كما يسمونه) مثل

Dear {0}. You order will be dispatched on {1,date,EEE dd MMM yyyy}

ويمكنني تمريرها إلى مصفوفة كائنات في برنامج Java الخاص بي

new Object[] { customer.getFirstName(), order.getEstimatedDispatchDate() };

ومع ذلك، في هذا الاستخدام، يرتبط الرمز والنمط ارتباطًا وثيقًا.بينما يمكنني وضع النمط في ملف خصائص المورد، يحتاج الكود والنمط إلى معرفة تفاصيل دقيقة عن بعضهما البعض.مع نظام يشبه EL، سيكون العقد بين الكود والنمط على مستوى أعلى بكثير (على سبيل المثال.العميل والأمر، بدلاً من customer.firstName وorder.estimatedDispatchDate)، مما يسهل تغيير بنية الرسالة وترتيبها ومحتوياتها دون تغيير أي رمز.

هل كانت مفيدة؟

المحلول

يمكنك فقط استخدام لغة التعبير العالمية نفسها.أنت بحاجة إلى التنفيذ (ولكن هناك عدد قليل للاختيار من بينها).بعد ذلك، تحتاج إلى تنفيذ ثلاث فئات:ELResolver وFunctionMapper وVariableMapper.

يصف منشور المدونة هذا كيفية القيام بذلك: جافا:باستخدام EL خارج J2EE.

نصائح أخرى

StringTemplate هو بديل خفيف الوزن لـ Velocity و Freemarker.

أود أن أوصي بالنظر سرعة أباتشي.إنها بسيطة للغاية وخفيفة الوزن.

نحن نستخدمه حاليًا لقوالب البريد الإلكتروني لدينا، وهو يعمل بشكل جيد جدًا.

يمكنك استخدام Casper مشابه جدًا لـ jsp وسهل الاستخدام: كاسبر

سأختار لغة Spring Expression:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html

بعض الأمثلة التي توضح القوة (الاثنان الأولان مأخوذان من الوثائق):

int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context);

String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context);

// weekday is a String, e.g. "Mon", time is an int, e.g. 1400 or 900
{"Thu", "Fri"}.contains(weekday) and time matches '\d{4}'

يمكن للتعبيرات أيضًا استخدام خصائص الكائن:

public class Data {
    private String name; // getter and setter omitted
}

Data data = new Data();
data.setName("John Doe");

ExpressionParser p = new SpelExpressionParser();
Expression e = p.parseExpression("name == 'John Doe'");
Boolean r = (Boolean) e.getValue(data); // will return true

e = p.parseExpression("Hello " + name + ", how are you ?");
String text = e.getValue(data, String.class); // text will be "Hello John Doe, how are you ?"

قد ترغب في إلقاء نظرة على OGNL وهو نوع المكتبة التي تبحث عنها.يمكن أن تكون OGNL قوية بشكل معقول، وهي لغة التعبير المستخدمة في ويب وورك إطار الويب.

يكرر:يتم بناء جاسبر وجويل لـ 1.5:وبعد ذلك اكتشفت RetroTranslator (http://retrotranslator.sourceforge.net/).بمجرد إعادة ترجمتهما، يعمل EL وJasper كالسحر

كانت فكرة استخدام EL نفسها خارج Java EE الذي دافع عنه إد بيرنز و تمت مناقشته على جانب الخادم.تنفيذ القطط السفن في JAR منفصلة لكني لا أعرف ما إذا كان يمكن استخدامه خارج الخادم.

سوف يقوم Freemarker بعمل ما تحتاجه بالضبط.هذا محرك قالب ذو بناء جملة مشابه جدًا لـ JSP:

http://freemarker.org/

اه.بينما مع messageFormat، يمكنني القيام بذلك

Dear {0}. Your order will be dispatched on {1,date,EEE dd MMM yyyy}

حيث أن المعلمة رقم 1 هي كائن تاريخ ويتم تنسيقها وفقًا للنمط، فلا يوجد ما يعادلها في EL.

في JSP، ربما كنت سأستخدم علامة التنسيق.في هذا المثال المستقل، سأضطر إلى تنسيق التاريخ كسلسلة في الكود الخاص بي قبل تقييم التعبير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top