في القسم السابق ، "أول مشروع معركة SSH Framework Online Mall: دمج Struts2 و Hibernate4.3 و Spring4.2" ، قمنا ببناء بيئة التطوير لـ Struts2 و Hibernate و Spring ودمجتها بنجاح معًا. يكمل هذا القسم بشكل أساسي بعض الإضافات الأساسية والحذف والتعديل والبحث ، وكذلك استخراج الخدمة ، DAO والعمل.
1. استخراج طبقة الخدمة
في القسم السابق ، كتبنا ببساطة أساليب حفظ وتحديث في طبقة الخدمة. هنا نبدأ في تحسين الكود في هذا الجزء ثم استخراج الكود في طبقة الخدمة.
1.1 تحسين طبقة الخدمات الفئة
إن تشغيل قاعدة البيانات ليس أكثر من إضافة وحذف وتعديل وفحص. أولاً ، دعنا نحسن الواجهة وتنفيذ طبقة الخدمات الفئة:
. // إدراج تحديث الفراغ العام (فئة الفئة) ؛ // تحديث حذف الفراغ العام (int id) ؛ // حذف الفئة العامة GET (int id) ؛ // احصل على قائمة عامة <category> Query () ؛ // احصل على كل الفئة}
تنفيذ محدد لواجهة خدمة الفئة:
فئة الفئة العامة فئة ServiceImpl يمتد BaseserviceImpl <Category> تنفذ CatevoryService {SessionFactory SessionFactory ؛ // سوف يضخ SPRING STESSUSERESSINGEFACTORY (SATESFACTORY SATESFACTORY) {this.sessionFactory = SessionFactory ؛ } GetSession GetSession () {// الحصول على جلسة من مؤشر الترابط الحالي ، إن لم يكن ، قم بإنشاء جلسة جديدة SessionFactory.getCurrentsession () ؛ } Override public void save (فئة الفئة) {getSession (). حفظ (الفئة) ؛ } Override public void update (فئة الفئة) {getSession (). update (الفئة) ؛ } Override public void delete (int id) { /*الطريقة الأولى لها عيب ، أي عليك الاستعلام عنها مرة واحدة قبل حذفها. Object obj = getSession (). get (category.class ، id) ؛ if (obj! = null) {getSession (). delete (obj) ؛ }*/ string hql = "حذف الفئة بينما id =: id" ؛ getSession (). createquery (hql) // .setinteger ("id" ، id) // .executeupdate () ؛ } Override Public Category GET (int id) {return (category) getSession (). get (category.class ، id) ؛ } Override Public List <PateCory> Query () {String HQL = "From Category" ؛ الإرجاع getSession (). createquery (HQL) .List () ؛ }} 1.2 تطبيق استخراج طبقة الخدمة
بعد الانتهاء من خدمة الفئة ، سنقوم باستخراج التنفيذ الأساسي لطبقة الخدمة. الفكرة هي على النحو التالي: نستخرج خدمة أساس قاعدة الأساس و paseserviceImpl ، وعند التطوير لاحقًا ، إذا كانت هناك حاجة إلى خدمة جديدة ، فأنت بحاجة فقط إلى القيام بخطوتين: أولاً تحديد واجهة جديدة XXXService ترث الواجهة الأساسية ، والتي يمكن أن تضيف طرقًا مجردة جديدة إلى هذه الواجهة ؛ ثم تحديد فئة التنفيذ الجديدة XXXSServiceImpl يرث BaseserviceImpl وتنفيذ واجهة XXXSERVICE. هذا يجعل من السهل الحفاظ على المشروع.
دعنا أولاً ننشئ واجهة Baseservice استنادًا إلى واجهة خدمة الفئة أعلاه:
// Basic Interface Baseservice ، استخدم Generic Interface Baseservice <T> {public void save (t t) ؛ تحديث الفراغ العام (T T) ؛ حذف الفراغ العام (int id) ؛ العام t get (int id) ؛ القائمة العامة <T> Query () ؛ } ثم قم بإنشاء فئة تنفيذ واجهة Baseservice BaseserviceImpl وفقًا لفئة تنفيذ CatevoryServiceImpl:
/ ** * description todo (استخراج الوحدات العامة) * Author ESON_15 * */ suppressWarnings ("Unchected") الفئة العامة BaseserviceImpl <T> تنفذ قواعد <T> {private clazz ؛ // يتم تخزين نوع العملية الحالية في Clazz ، أي SessionFactory العامة t sessionfactory العامة ؛ BaseserviceImpl () {// يمكن إزالة معلومات الطباعة الثلاثة التالية. فيما يلي System.out.println ("هذا يمثل الكائن الذي يدعو حاليًا المُنشئ" + هذا) ؛ System.out.println ("احصل على معلومات الفئة الأصل الخاصة بالتيار هذا الكائن" + this.getClass (). getSuperClass ()) ؛ System.out.println ("احصل على معلومات الفئة الأصل الخاصة بالتيار هذا الكائن (بما في ذلك المعلومات العامة)" + this.getClass (). getGenericSuperClass ()) ؛ // احصل على نوع المعلمة لنوع المعلمة العامة = (parameterizedType) this.getClass (). getGenericSuperClass () ؛ clazz = (class) type.getActualTyPearguments () [0] ؛ } public void setSessionFactory (SessionFactory SessionFactory) {this.sessionFactory = SessionFactory ؛ } GetSession GetSession () {// الحصول على جلسة من مؤشر الترابط الحالي ، إن لم يكن ، قم بإنشاء جلسة جديدة SessionFactory.getCurrentsession () ؛ } Override public void save (t t) {getSession (). Save (t) ؛ } Override public void update (t t) {getSession (). update (t) ؛ } Override public void delete (int id) {system.out.println (clazz.getSimplename ()) ؛ String hql = "delete" + clazz.getSimplename () + "as c where c.id =: id" ؛ getSession (). createquery (hql) // .setinteger ("id" ، id) // .executeupdate () ؛ } Override public t get (int id) {return (t) getessession (). get (clazz ، id) ؛ } Override Public List <T> Query () {String HQL = "From" + clazz.getSimplename () ؛ الإرجاع getSession (). createquery (HQL) .List () ؛ }} بعد الانتهاء من الاستخراج ، يمكننا إعادة كتابة واجهة الخدمات الفئة وفئة تنفيذ CatevoryServiceImpl. على النحو التالي:
// واجهة CateSoryService ترث واجهة الواجهة العامة Baseservice Catevoryservice تمتد Baseservice <category> { / * * فقط أضف الطريقة الجديدة المطلوبة حسب الخدمات نفسها. الطريقة العامة موجودة بالفعل في Baseservice * /} / ** * description TODO (منطق الأعمال للوحدة نفسها) * Author ESON_15 * * / الفئة العامة ، يمتد فئة الفئة العامة فقط في الفئة المضافة في الفئة الخاطئة interface. تم تنفيذ الطريقة العامة في BaseserviceImpl */} كما يتضح من الكود ، تحتاج الخدمة المضافة حديثًا فقط إلى ورث واجهة Baseservice ثم إضافة منطق العمل المطلوب من قبل الخدمة إلى الواجهة. تحتاج ServiceImpl المضافة حديثًا فقط إلى وراثة BaseserviceImpl وتنفيذ منطق الأعمال المضافة حديثًا.
ولكن لا تنس النقطة المهمة: إنها تعديل الفاصوليا في ملف تكوين الربيع Beans.xml .
<!-لا يمكن إنشاء فئات عامة ، لذا أضف خاصية Lazy-Init-> <bean id = "baseservice" lazy-init = "true"> <property name = "sessionfactory" ref = "sessionfactory"/> </bean> <bean id = "categoryservice" parent = "baseservice"/>
اقتل الممتلكات في الخدمات الأصلية ، ثم أضف خاصية الأصل للإشارة إلى ميراث خدمات قواعد القواعد ؛ ثم قم بتكوين خدمة قواعد وتكوين SessionFactory إلى Paseservice. بالإضافة إلى ذلك ، هناك شيء واحد يجب ملاحظته: تعيين خاصية Lazy-Init على True ، لأن Paseservice هي فئة عامة ، ولا يمكن إنشاء فئات عامة. في هذه المرحلة ، يتم استخراج طبقة الخدمة.
2. أضف حسابًا في طبقة الخدمة
تم استخراج طبقة الخدمة للتو ، لذا أصبح من السهل جدًا كتابة خدمة حساب:
أولا اكتب واجهة خدمة الحسابات لروث قواعد الأسس:
Exclude Occountservice Explosts Express يمتد BasesService <counter> {// لاحظ أن الأدوية الجيرية في قواعد Baseservice هي الآن حساب / * * فقط أضف الطريقة الجديدة المطلوبة بواسطة حساب الحساب نفسه ، والطريقة العامة موجودة بالفعل في Baseservice * /} ثم اكتب فئة تنفيذ حساب الحسابات لراث فئة تنفيذ BaseserviceImpl وتنفيذ واجهة خدمة الحسابات:
ECALSERSERSICPLES Public Class يمتد BASESERVICEIMPL <COPPORT> تنفيذ حساب الحسابات { / * * فقط قم بتنفيذ الأساليب المضافة حديثًا في واجهة خدمة الحسابات. تم تنفيذ الطريقة العامة في BaseserviceImpl *///إدارة وظيفة تسجيل الدخول ، وسيتم تحسينها لاحقًا} أخيرًا ، أضف التكوين التالي إلى ملف beans.xml:
<bean id = "accounsservice" parent = "baseservice" />
وبهذه الطريقة ، تمت كتابة خدمة جديدة. إذا كنت بحاجة إلى إضافة خدمة في المستقبل ، فستتبع هذه العملية ، وهي مريحة للغاية.
3. استخراج العمل
3.1 تخزين البيانات في الإجراء في المجال (الطلب ، الجلسة ، التطبيق ، إلخ)
نحن نعلم أنه في العمل ، يمكنك الحصول مباشرة على كائن ActionContext من خلال ActionContext.getContext () ، ثم الحصول على كائن المجال المقابل من خلال الكائن ؛ يمكنك أيضًا ضخ كائن المجال المقابل عن طريق تطبيق واجهة XXXAWARE. دعونا نلقي نظرة أولاً على هاتين الطريقتين:
يمتد فئة الفئة العامة Actionsupport التي تُطوَّع requestaware ، SessionAware ، ApplicationAware {فئة الفئة الخاصة ؛ خدمة الخدمات الخاصة. public void setCategoryService (CategoryService CatevoryService) {this.categoryService = CategoryService ؛ } public string update () {system.out.println ("---- update ----") ؛ categoryservice.update (الفئة) ؛ إرجاع "فهرس" ؛ } السلسلة العامة Save () {system.out.println ("---- Save ----") ؛ إرجاع "فهرس" ؛ } public string query () {// solution 1 ، استخدم الخريطة المقابلة لاستبدال الكائن المدمج الأصلي ، بحيث لا يوجد أي اعتماد مع JSP ، ولكن مقدار الكود كبير نسبيًا // ActionContext.getContext (). put ("categorylist" ، categoryservice.query ()) ؛ // ضعه في حقل الطلب // ActionContext.getContext (). // ضعه في حقل الجلسة // ActionContext.getContext (). getapplication (). put ("categorylist" ، categoryservice.query ()) ؛ // ضعه في مجال التطبيق // الحل 2 ، وقم بتنفيذ الواجهة المقابلة (requestAware ، SessionAware ، ApplicationAware) ، واترك طلب حقن الخريطة المقابل ("CategoryList" ، catevoryservice.query ()) ؛ Session.put ("CategoryList" ، catevoryservice.query ()) ؛ application.put ("categorylist" ، catevoryservice.query ()) ؛ إرجاع "فهرس" ؛ } الفئة العامة getCategory () {فئة الإرجاع ؛ } public void setCategory (فئة الفئة) {this.category = الفئة ؛ } الخريطة الخاصة <string ، Object> request ؛ خريطة خاصة <سلسلة ، كائن> جلسة ؛ الخريطة الخاصة <string ، Object> Application ؛ Override public void setapplication (Map <String ، Object> application) {this.application = application ؛ } Override public void setSession (Map <String ، Object> Session) {this.session = session ؛ } Override public void setRequest (Map <String ، Object> request) {this.request = request ؛ }} لا يزال فئة الفئة التي تدمج الأطر الرئيسية الثلاثة في القسم السابق. أضفنا طريقة استعلام لهذه الطريقة. في هذه الطريقة ، نقوم بتخزين نتائج الاستعلام في مجال الطلب ومجال الجلسة ومجال التطبيق. الطريقة الأولى هي استخدام ActionContext مباشرة لتنفيذها. لا توجد واجهة مطلوبة ، لكن الرمز كبير ؛ تنفذ الطريقة الثانية واجهات requestAware و SessionAware و ApplicationAware ، وثلاث طرق مجردة لتنفيذ طلب حقن الواجهة ، والجلسة والتطبيق ، ثم تعيينه إلى متغيرات الأعضاء المقابلة ، بحيث يمكن تخزين نتائج الاستعلام في المجال في طريقة الاستعلام. يبدو أن حجم الكود هذا أكبر من الطريقة الأولى ... ولكن يمكننا استخراجه وقراءته أولاً.
نضيف اتصال استعلام جديد إلى index.jsp لاختبار ما إذا كان يمكن عرض نتائج الاستعلام:
<٪@ page language = "java" import = "java.util. <html> <head> <title> my jsp 'index.jsp' صفحة البدء </title> </head> <body> <a href = "$ {pagecontext.request.contextpath} /category_update.action؟category.id=2&category.type=gga. href = "category_save.action"> الوصول حفظ </a> <a href = "category_query.action"> الاستعلام عن جميع الفئات </a> <br/> <c: foreach heads = "$ {requestscope.categorylist}" var = "customory"> $ { $ {category.type} | $ {category.hot} <br/> </c: foreach> <c: foreach heads = "$ {sessionscope.categorylist}" var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c: foreach> <c: foreach heads = "$ {applicationscope.categorylist}" var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c: foreach> </body> </html> 3.2 استخراج BASEACTION
كما ذكرنا الآن ، فإن الطريقة الثانية تحتوي على حجم رمز أكبر ، ولكن يمكننا استخراج قاعدة للتعامل مع العمليات المتعلقة بهذه المجالات على وجه التحديد.
يمتد BASEACTY للطبقة العامة ACTIONSUPORT يطالب requestAware ، SessionAware ، ApplicationAware {MAP المحمي <string ، Object> request ؛ الخريطة المحمية <سلسلة ، كائن> جلسة ؛ الخريطة المحمية <string ، Object> Application ؛ Override public void setapplication (Map <String ، Object> application) {this.application = application ؛ } Override public void setSession (Map <String ، Object> Session) {this.session = session ؛ } Override public void setRequest (Map <String ، Object> request) {this.request = request ؛ }} ثم إذا كان الإجراء الخاص بنا يحتاج إلى استخدام كائنات المجال هذه لتخزين البيانات ، فيمكننا أن نرث بشكل مباشر ، ويمكننا استخدام كائنات الطلب والجلسة والتطبيق مباشرة. لذلك ، فإن الفئة المعدلة هي كما يلي:
يمتد فئة الفئة العامة BaseAction {فئة الفئة الخاصة ؛ <pre name = "code"> فئة الفئة الخاصة ؛ public void setCategoryService (CategoryService CatevoryService) {this.categoryService = CategoryService ؛ } update update update () {system.out.println ("--- تحديث ----") ؛ categoryservice.update (الفئة) ؛ إرجاع "فهرس" ؛ } السلسلة العامة Save () {system.out.println ("---- save -----") ؛ إرجاع "index" ؛ } public string query () {request.put ("categorylist" ، categoryservice.query ()) ؛ Session.put ("CategoryList" ، catevoryservice.query ()) ؛ application.put ("categorylist" ، catevoryservice.query ()) ؛ إرجاع "فهرس" ؛ } الفئة العامة getCategory () {فئة الإرجاع ؛ } public void setCategory (فئة الفئة) {this.category = الفئة ؛ }} جميع الإجراءات التي تحتاج إلى استخدام الحقول المطلوبة والجلسة والتطبيق موروثة مباشرة ، وهو مريح للغاية.
3.3 احصل على المعلمات (ModelDriven)
دعنا نستمر في النظر إلى فئة الفئة أعلاه. هناك فئة متغيرة عضو ، وهي pojo. تحديد هذا المتغير وكتابة المجموعة والحصول على الأساليب هو أن يتم تمرير صفحة JSP من خلال المعلمات المرفقة بعنوان URL. المعلمات عبارة عن سمات في كائن الفئة ، مثل المعرف ، والنوع ، وما إلى ذلك ، ولكن يجب كتابة المعلمات في عنوان URL على أنها فئة. يمكننا استخدام ModelDriven لحل المشكلة بسهولة أكبر.
يمتد فئة الفئة العامة التي يمتد BASEACTION الأدوات النموذجية <Category> {فئة الفئة الخاصة ؛ // باستخدام واجهة ModelDriven ، يجب تنفيذ طريقة getModel (). ستدفع هذه الطريقة العنصر الذي تم إرجاعه إلى الجزء العلوي من فئة stack Override العامة getModel () {category = new category () ؛ فئة العودة ؛ } <pre name = "code"> فئة الفئة الخاصة ؛ public void setCategoryService (CategoryService CatevoryService) {this.categoryService = CategoryService ؛ } public string update () {system.out.println ("---- update ----") ؛ categoryservice.update (الفئة) ؛ إرجاع "فهرس" ؛ } السلسلة العامة Save () {system.out.println ("---- Save ----") ؛ إرجاع "فهرس" ؛ } public string query () {request.put ("categorylist" ، categoryservice.query ()) ؛ Session.put ("CategoryList" ، catevoryservice.query ()) ؛ application.put ("categorylist" ، catevoryservice.query ()) ؛ إرجاع "فهرس" ؛ }} وبهذه الطريقة ، لسنا بحاجة إلى تضمين المعلمات الشاقة مثل الفئة. في صفحة مكتب الاستقبال JSP. انظر إلى الجزء النموذجي من صفحة JSP:
<٪@ page language = "java" import = "java.util. <html> <head> <title> my jsp 'index.jsp' صفحة البدء </title> </head> <body> <a href = "$ {pagecontext.request.contextpath} /category_update.action؟category.id=2&category.type=gga. href = "category_save.action؟ id = 1 & type = haha & hot = true"> test modeldriven </a> <a href = "category_query.action"> Query جميع الفئات </a> <br/> <c: foreach عناصر = "$ {requestscope.categoryList}" var = "category"> $ { $ {category.type} | $ {category.hot} <br/> </c: foreach> <c: foreach heads = "$ {sessionscope.categorylist}" var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c: foreach> <c: foreach heads = "$ {applicationscope.categorylist}" var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c: foreach> </body> </html> نتيجة الاختبار هي أنه يمكن الحصول على Catgory وأن يتم تعيين جميع المعرفات والنوع والسمات الساخنة بشكل جيد. يمكننا أن نرى أنه من خلال تنفيذ واجهة ModelDriven ، يمكننا بسهولة حمل المعلمات في عنوان URL. في العمل ، نحتاج فقط إلى تنفيذ طريقة getModel وإرجاع كائن جديد لاستخدامه. في هذه المرحلة ، من السهل التفكير في أنه سيكون هناك بالتأكيد العديد من هذه النماذج في الدعامات التي يجب الحصول عليها ، لذلك نحتاج أيضًا إلى استخراج هذا الجزء في baseaction.
3.4 استخراج طراز Driven
أولاً ، نضيف رمز الجزء النموذجي إلى BASEACTION ، على النحو التالي:
// نظرًا لوجود العديد من النماذج المختلفة التي تتطلب ModelDrvening ، فإننا نستخدم BASEACTION العام العام <T> يمتد ACTORICUSUPORT على طلب requestaware ، sessionaware ، ApplicationAware ، ModelDRIVE <T> {MAP المحمي <سلسلة ، كائن> ؛ الخريطة المحمية <سلسلة ، كائن> جلسة ؛ الخريطة المحمية <string ، Object> Application ؛ نموذج t المحمي. Override public void setapplication (Map <String ، Object> application) {this.application = application ؛ } Override public void setSession (Map <String ، Object> Session) {this.session = session ؛ } Override public void setRequest (Map <String ، Object> request) {this.request = request ؛ } Override public t getModel () {// هنا ، مثيل جديد مقابل عن طريق تحليل t قد تم تمريره. class clazz = (class) type.getActualTyPearguments () [0] ؛ حاول {model = (t) clazz.newinstance () ؛ } catch (استثناء e) {رمي new runTimeException (e) ؛ } نموذج الإرجاع ؛ }} بعد الاستخراج ، سوف ينخفض الرمز في الفئة ويقل:
. public void setCategoryService (CategoryService CatevoryService) {this.categoryService = CategoryService ؛ } public string update () {system.out.println ("---- update ----") ؛ categoryservice.update (model) ؛ // استخدم النموذج إرجاع مباشرة "الفهرس" ؛ } السلسلة العامة Save () {system.out.println ("---- Save ----") ؛ System.out.println (نموذج) ؛ // استخدم النموذج مباشرة لإرجاع "الفهرس" ؛ } public string query () {request.put ("categorylist" ، categoryservice.query ()) ؛ Session.put ("CategoryList" ، catevoryservice.query ()) ؛ application.put ("categorylist" ، catevoryservice.query ()) ؛ إرجاع "فهرس" ؛ }} في هذه المرحلة ، هناك شيء آخر لا يشعر بالرضا حيال ذلك ، وهو الخدمات المتغيرة للأعضاء ، والتي كانت موجودة دائمًا في الفئة. نظرًا لأن الفئة تستخدم الأساليب في كائن خدمة الفئة ، يجب إنشاء هذا الكائن ويمكن حقن طريقة المحددة. هذا يؤدي إلى عيب: إذا كانت هناك حاجة إلى استخدام العديد من الإجراءات إلى استخدام الخدمات الفئة ، فيجب إنشاء الكائن والطريقة المحددة في أفعالهم. علاوة على ذلك ، إذا تم استخدام العديد من كائنات الخدمة المختلفة في إجراء ما ، فيجب إنشاء جميعها ، والتي تصبح معقدة للغاية.
3.5 استخراج الخدمة إلى BASEACTION
استجابة للمشكلة أعلاه ، نقوم باستخراج جميع كائنات الخدمة في المشروع في BASEACTION لإنشائها. وبهذه الطريقة ، بعد أن ترث الإجراءات الأخرى ، يمكنهم استخدام أي خدمة يريدون استخدامها:
. حسابات حساب الحسابات المحمية ؛ public void setCategoryService (CategoryService CatevoryService) {this.categoryService = CategoryService ؛ } public void setAccountService (accountservice) accountservice) {this.AccountService = accountService ؛ } // كائن المجال الخريطة المحمية <string ، Object> request ؛ الخريطة المحمية <سلسلة ، كائن> جلسة ؛ الخريطة المحمية <string ، Object> Application ؛ Override public void setapplication (Map <String ، Object> application) {this.application = application ؛ } Override public void setSession (Map <String ، Object> Session) {this.session = session ؛ } Override public void setRequest (Map <String ، Object> request) {this.request = request ؛ } // modeldriven modern todern ؛ Override public t getModel () {parameterizedType type = (parameterizedType) this.getClass (). getGenericSuperClass () ؛ class clazz = (class) type.getActualTyPearguments () [0] ؛ حاول {model = (t) clazz.newinstance () ؛ } catch (استثناء e) {رمي new runTimeException (e) ؛ } نموذج الإرجاع ؛ }} هذا يجعل الفئة أكثر تحديثًا: فئة الفئة العامة يمتد BASEACTION <Category> {public string update () {system.out.println ("--- تحديث ----") ؛ categoryservice.update (نموذج) ؛ إرجاع "فهرس" ؛ } السلسلة العامة Save () {system.out.println ("--- Save ----") ؛ System.out.println (نموذج) ؛ إرجاع "فهرس" ؛ } public string query () {request.put ("categorylist" ، categoryservice.query ()) ؛ Session.put ("CategoryList" ، catevoryservice.query ()) ؛ application.put ("categorylist" ، catevoryservice.query ()) ؛ إرجاع "فهرس" ؛ }} قد يسأل بعض الأشخاص ، ألا يكون من الضروري أن يتم حقن العديد من كائنات الخدمة في BASEACTION؟ هذا ليس صحيحًا ، لأنه حتى لو لم يتم كتابته في BaseAction ، فإن حاوية الربيع ستقوم بإنشاء هذا الكائن ، وهو ما لا يهم. على العكس من ذلك ، يتم وضع كائن الخدمة في BASEACTION وهو أكثر ملاءمة لتطوير إجراءات أخرى. علاوة على ذلك ، لا يلزم تعيين BASEACTY إلى ملف Struts.xml ، لأنه لن يطلب JSP BASEACTION ، فمن المدى الوراثي أن ترث الإجراءات الأخرى فقط.
شيء آخر يجب أن ننسى: وهذا هو تعديل التكوين في beans.xml:
<!-إذا كان نوعًا من النموذج الأولي ، يتم إنشاؤه عند استخدامه ، وليس تلقائيًا عند البدء-> <bean id = "baseaction" scope = "prototype"> <property name = "categoryservice" ref = "categoryservice"> </property> <property name = "accounservice" ref =/property> </property> parent = "baseaction"/>
أضف حبة BASEACTION جديدة ، وتطابق جميع كائنات الخدمة في المشروع كعقار ، وقتل العقار في الفئة الأصلية.
في المستقبل ، إذا أردنا كتابة xxxaction جديد ، يمكننا أن نرث بشكل مباشر. إذا تم استخدام خدمة في XXXAction ، فيمكننا استخدامها مباشرة. نحتاج فقط إلى إضافة حبة تتوافق مع xxxaction في ملف beans.xml وتكوين القفزة في ملف struts.xml.
4. تغيير XML إلى التعليق التوضيحي
يمكننا أن نرى أنه مع تقدم المشروع وأكبر ، سيكون هناك المزيد والمزيد من التكوينات في Beans.xml ، والعديد من التكوينات زائدة عن الحاجة. من أجل تسهيل التطوير ، نقوم الآن بتغيير تكوين XML إلى التعليقات التوضيحية. دعونا أولاً نلقي نظرة على التكوين في beans.xml:
هذه هي الفاصوليا التي كتبناها عندما بنينا البيئة واستخرجناها. هذه تحتاج إلى تحويلها إلى تعليقات توضيحية. دعنا نستبدلها قطعة قطعة: أولاً استبدل جزء الخدمة ، الذي يحتوي على ثلاثة أجزاء: خدمات قواعد ، خدمة الفئة وحسابات الحسابات. استبدال على النحو التالي:
ثم اقتل الجزء المقابل في beans.xml. بعد ذلك ، قم بتعديل جزء الإجراء ، وخاصةً BASEACTION و CATERACTING و ACCOUCTION ، واستبدله على النحو التالي:
ثم اقتل تكوين جزء الإجراء في beans.xml ، وأخيراً أضف التكوين التالي إلى ملف beans.xml ، ويمكنك استخدام التعليق التوضيحي.
<السياق: مكون المسح الضوئي package = "cn.it.shop .."/>
قد يسأل بعض الناس ، لماذا يختلف الخدمة والعمل عند استخدام التعليقات التوضيحية؟ يتم استخدام Service في الخدمة ويستخدم Controller في الإجراء؟ في الواقع ، هو نفسه ، فقط لتمييزهم عن طبقات مختلفة من الفاصوليا لسهولة القراءة.
عنوان تنزيل رمز المصدر للمشروع بأكمله: //www.vevb.com/article/86099.htm
العنوان الأصلي: http://blog.csdn.net/eson_15/article/details/51297698
ما سبق هو المحتوى الكامل لمشروع معركة SSH Framework Online Mall. آمل أن يكون ذلك مفيدًا لتعلم الجميع ، وآمل أن يدعم الجميع wulin.com أكثر.