الملخص تأخذ هذه المقالة قاعدة بيانات Oracle كمثال لتقديم طريقة بسيطة وعالمية لتخزين ومعالجة بيانات النموذج عند تطوير تطبيقات الويب باستخدام تقنية JSP لتقليل عبء عمل التطوير وتوفير رمز البرنامج الرئيسي. مقدمة تم استخدام تقنية J2EE (Java 2 Enterprise Edition) على نطاق واسع في تطوير تطبيقات الويب. توفر تقنيات JavaBean وServlet للمطورين بيئة تطوير أكثر وضوحًا، ويتم استخدام تقنية JSP لعرض الصفحات، ويتم استخدام تقنية Servlet لإكمال عدد كبير من الصفحات العمليات التجارية، وذلك باستخدام Beans لتخزين البيانات وبعض العمليات التجارية. في تطبيقات الويب، غالبًا ما تكون عملية معالجة تخزين بيانات الأعمال في قاعدة البيانات شاقة للغاية. أحد الأشكال الرئيسية هو تخزين بيانات النموذج في قاعدة البيانات. تتضمن عملية معالجة التطبيق بأكملها عددًا كبيرًا من عمليات تخزين البيانات هذه يحتاج النموذج إلى المعالجة، ويستغرق الأمر من المطورين الكثير من الوقت والطاقة لكتابة برنامج تخزين البيانات المقابل بشكل منفصل. ما هي الأساليب التي يجب استخدامها لتقليل عبء عمل تطوير تخزين بيانات النموذج هو سؤال يستحق الدراسة. طريقتان شائعتان لتخزين ومعالجة بيانات النموذج: 1. اكتب رمز البرنامج المقابل لكل نموذج في صفحة JSP أو JavaBean أو Servlet. استخدم وظيفة request.getparameter() لاستخراج البيانات المقدمة من النموذج واحدًا تلو الآخر، أو اكتب استخدم JavaBean المقابل طريقة setProperty لجلب البيانات تلقائيًا إلى JavaBean، ثم قم بإنشاء عبارات SQL (إدراج وتحديث وحذف)، وأخيرًا تنفيذ وظيفة Executeupdate () لإكمال تخزين جدول البيانات. 2. قم بإنشاء كود برنامج JavaBean تلقائيًا لكل جدول بيانات. يجب أن يدعم نظام قاعدة البيانات المستخدمين لقراءة بنية الجدول وتحديد الحقول الرئيسية. استخدم أدوات التطوير السريع الموجهة للكائنات، مثل PowerBuilder وDelphi وما إلى ذلك، لتطوير برنامج إنشاء كود Java تلقائيًا. في هذا البرنامج، تتم قراءة بنية جدول قاعدة البيانات: اسم الحقل ونوع البيانات وطول البيانات ويتم إنشاء كود JavaBean تلقائيًا. في هذا الكود، حدد المتغيرات بنفس الأسماء المقابلة للحقول الموجودة في الجدول، وقم بإنشاء أساليب setValue وgetValue لجميع المتغيرات، وقم بإنشاء وظائف الإدراج والتحديث والحذف للتعامل مع إنشاء وتنفيذ عبارات SQL للإدراج والتحديث والحذف. وحذف على التوالي. في صفحة معالجة البيانات المقدمة بواسطة النموذج، اكتب الكود التالي لتخزين بيانات النموذج في JavaBean: <jsp: useBean id="table" class="table1_bean" /> <jsp: setProperty name="table" property=" * " /> (ملاحظة: table1_bean هو JavaBean المذكور أعلاه الذي تم إنشاؤه تلقائيًا والمطابق لجدول معين) ثم يستدعي وظائف الإدراج والتحديث والحذف في table1_bean لإكمال تخزين جدول البيانات وإرجاع نتائج التنفيذ. على سبيل المثال: <%boolean Success =table.insert(); الطريقة الأولى بسيطة وبديهية، ولكنها تتطلب كتابة إجراءات معالجة البيانات المقابلة لكل نموذج. بالنسبة للتطبيقات الأكبر قليلاً، قد يكون عدد النماذج كبيرًا، مما يؤدي إلى عبء عمل تطوير ثقيل وانخفاض كفاءة التطوير. عندما تتغير بنية الجدول، مثل إضافة الحقول أو طرحها، يجب تعديل برنامج معالجة البيانات المقابل. الطريقة الثانية أبسط بكثير من الأولى، حيث يتم تنفيذ معالجة البيانات لكل جدول بيانات بواسطة JavaBean المقابل، ويتم إنشاء JavaBean تلقائيًا ولا تحتاج إلى كتابتها يمكن استخدام فئة JavaBean والكتابة فوقها بعد تجميعها باستخدام Java. ومع ذلك، تتطلب هذه الطريقة تطوير برنامج إنشاء JavaBean التلقائي، ويحتاج JavaBean إلى إعادة إنشائه وتجميعه عندما تتغير بنية الجدول. تقديم طريقة بسيطة وعالمية لتخزين بيانات النموذج في تطوير تطبيقات الويب. يتم إرسال العديد من النماذج إلى خادم الواجهة الخلفية بعد التحقق البسيط من البيانات على متصفح الواجهة الأمامية. لا يقوم الخادم بأي معالجة للبيانات ويقوم بتخزين البيانات مباشرة فيها جدول قاعدة البيانات. في هذه الحالة، يمكننا فقط كتابة برنامج لمعالجة هذه النماذج بشكل موحد وتخزين البيانات في جدول البيانات المقابل. تتطلب هذه الطريقة أيضًا أن يدعم نظام قاعدة البيانات قراءة بنية الجدول وتحديد الحقول الرئيسية. نستخدم تقنية JSP لكتابة هذا البرنامج، وملف البرنامج يسمى DbdataStore.jsp. 1. تنسيق الاستدعاء تكون طريقة استدعاء الإجراء للنموذج في صفحة الويب كما يلي: <Form Name=Frm1 Method=Post Action='DBdataStore.jsp? tablename=table1&OperType=…'> table1 هو اسم جدول جدول قاعدة البيانات حيث سيتم تخزين البيانات، وعملية OperType هي ثلاثة أنواع: الإدراج، والتحديث، والحذف. يجب أن تكون قيم الاسم في <نوع الإدخال=اسم النص=…>،<اسم منطقة النص=…>في النموذج هي نفس أسماء الحقول في جدول البيانات يتم استخراج النموذج واحدًا تلو الآخر في DBdataStore.jsp إذا لم يكن هناك إدخال محدد في النموذج وكانت القيمة الناتجة قيمة فارغة، فلن تتم معالجة الحقل. 2. عرض التعريف مع أخذ Oracle كمثال 1) قم بإنشاء عرض نوع بيانات لكل عمود في الجدول إنشاء أو استبدال العرض v_dbstru AS SELECT table_name, column_name, data_type, data_length, data_precision, data_scale, column_id FROM all_tab_columns WHERE Owner='user1' //user1 كن مالك جدول البيانات. 2) قم بإنشاء عرض العمود الرئيسي للجدول، إنشاء أو استبدال العرض v_pkey_column AS SELECT b.table_name، b.column_name، b.position FROM all_constraints a، all_cons_columns b WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name و .owner='user1' AND a.constraint_type='P'; |
3. رمز البرنامج الرئيسي
1) تهيئة البرنامج
String tablename=request.getParameter("tablename"); //استخراج اسم الجدول
String OperType=request.getParameter("OperType");//استخراج نوع العملية
String sFieldValue="";/ / تخزين قيمة بيانات الحقل المرسلة بواسطة النموذج
String fieldname = ""، نوع البيانات = "" // تخزين اسم الحقل ونوع بيانات الحقل
int iFieldvalue = 0؛
String updateSql = ""، WhereSql = " Where "، insSql1 = " "، insSql2 =""، opSql =""، strSql =""؛
ResultSet rs1 = null، rs2 = null؛
insSql1 ="insert into "+tablename+" ("؛
insSql2 ="values(";
2) إنشاء عبارة SQL الحقول الرئيسية قم بإنشاء جزء الحقل الرئيسي من عبارة الإدراج جزئيًا
، مثل: أدخل في الجدول 1 (المعرف والقيم (100))؛
استخدم الحقول الرئيسية فقط لإنشاء بيان التحديث والحذف حيث يكون الجزء، مثل: حيث المعرف = 100 عندما
يتم تحديث نوع العملية، لن يتم تعديل بيانات الحقول الرئيسية في نموذج الويب.
rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name='"+tablename+"'"); // احصل على اسم الحقل الرئيسي while(rs1.next()){ fieldname=rs1.getString("column_name"); rs2=Stmt.executeQuery("اختر نوع البيانات من v_dbstru حيث table_name='"+tablename+"' AND column_name='"+fieldname+"'"); // احصل على نوع بيانات الحقل الرئيسي if(rs2.next()){ Datatype=rs2.getString("data_type"); sFieldValue=request.getParameter(fieldname.toLowerCase()); // قم بإنشاء جزء الحقل الرئيسي من عبارة الإدراج if(OperType.equals("insert")){ insSql1+=fieldname+"،"; إذا((sFieldValue==null)){ // عندما لا يتم إرسال قيمة بيانات الحقل الرئيسي في النموذج، ستعالجها هذه المقالة فقط كنوع رقمي، وسيتم حساب قيمة البيانات وفقًا للرقم التسلسلي. rs2= Stmt.executeQuery("SELECT max("+fieldname+")+1 FROM "+tablename); rs2.next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+"،"; }else if(Datatype.equals("DATE")){ insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD')،"; }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){ insSql2+="'" + sFieldValue+"'";} else /*NUMBER, FLOAT */ insSql2+=sFieldValue+"،} // إنشاء بيان التحديث والحذف حيث الجزء: حيث اسم الحقل =... AND إذا(OperType.equals("update") || OperType.equals("delete")){ إذا(Datatype.equals("DATE")){ WhereSql+=fieldname+"=To_Date('" + sFieldValue + "','YYYY-MM-DD') AND "; }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){ WhereSql+=fieldname+"='" + sFieldValue+"' AND ";} else /*NUMBER, FLOAT */ WhereSql+=fieldname+"="+ sFieldValue+" AND ";} } } حيثSql=whereSql.substring(0, WhereSql.length()-4); |
3) يقوم جزء الحقل غير الرئيسي في عبارة SQL بإنشاء
بيان تحديث، مثل: تحديث table1 set column1=value1,... حيث id=100
عبارة إدراج، مثل: Insert into table1 (id, column1,...) (100، القيمة1،…)
updateSql="update "+tablename+" set "; strSql = "حدد اسم العمود، نوع البيانات، طول البيانات، دقة البيانات، مقياس البيانات من v_dbstru a "+"حيث table_name='"+tablename+"' وa.column_name ليس في (SELECT b.column_name FROM v_pkey_column b حيث b.table_name=a.table_name)"; rs1=Stmt.executeQuery(strSql); // احصل على اسم الحقل غير الأساسي ونوع البيانات while(rs1.next()){ fieldname=rs1.getString("column_name"); Datatype=rs1.getString("data_type"); sFieldValue=request.getParameter(fieldname.toLowerCase()); // إذا لم يرسل النموذج قيمة هذا الحقل، فتجاهل معالجة هذا الحقل if((sFieldValue!=null)){ // إنشاء عبارة إدراج =insSql1+insSql2، أي إدراجها في اسم الجدول (... والقيم (...) if(OperType.equals("insert")){ insSql1+=fieldname+"،"; إذا(Datatype.equals("DATE")){ insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD')،"; } else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){ insSql2+="'" + sFieldValue+"',";}else /*NUMBER,FLOAT*/ insSql2+= sFieldValue+"،";} // إنشاء بيان التحديث =updateSql+whereSql، أي تحديث مجموعة اسم الجدول ... Where اسم الحقل=... إذا(OperType.equals("update")){ إذا(Datatype.equals("DATE")){ updateSql+=fieldname+"=To_Date('" + sFieldValue + "','YYYY-MM-DD')،"; }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){ updateSql+=fieldname+"='" + sFieldValue,1}+"',";}else /*NUMBER,FLOAT*/ updateSql+=fieldname+"="+sFieldValue+"،";})) rs1.إغلاق(); |
4) إنشاء عبارة SQL كاملة وتنفيذها
إذا (OperType.equals("إدراج")) opSql=insSql1.substring(0, insSql1.length()-1)+")"+insSql2.substring(0, insSql2.length()-1)+""; إذا (OperType.equals("تحديث")) opSql=updateSql.substring(0, updateSql.length()-1)+" "+whereSql; opSql="delete FROM "+tablename+" "+whereSql; // تم إنشاء بيان SQL الكامل opSql حاول{sqlnrows=Stmt.executeUpdate(opSql);} التقاط (SQLException e) {out.println ("SQLException: "+opSql);} |
4. الميزات:
تستخدم هذه الطريقة هذا البرنامج بشكل موحد لجميع هذه النماذج المخزنة مباشرة، وليس من الضروري تطوير البرامج المقابلة لكل نموذج أو لكل جدول بيانات بشكل مستقل . وفي الوقت نفسه، عندما تتغير بنية الجدول، ليست هناك حاجة لتعديل برنامج DBdataStore.jsp. يمكن أيضًا إعادة كتابة هذا البرنامج كـServelet، ويكون تنسيق الاستدعاء هو <Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…">.
الاستنتاج
في تطبيق الويب، إذا كانت بيانات النموذج تتطلب مزيدًا من التحقق من البيانات أو معالجتها في خلفية الخادم بعد الإرسال، فيجب استخدام الطريقة الثانية. ولكن في كثير من الحالات، يقوم المستخدمون بإدخال البيانات أو تعديلها في النموذج، ويستخدمون JavaScript للتحقق من البيانات أو معالجتها على متصفح الواجهة الأمامية، ثم لا تتم أي معالجة على الخادم الخلفي، ويتم إرسال البيانات بواسطة النموذج يتم تخزينها مباشرة في قاعدة البيانات في الجدول. في الوقت الحالي، يعد استخدام الطريقة الثالثة أمرًا بسيطًا للغاية ويمكن أن يقلل بشكل كبير من عبء عمل المطور.