الملخص
تأخذ هذه المقالة قاعدة بيانات 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 = "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
حدد b.table_name، b.column_name، b.position
من all_constraints أ، all_cons_columns ب
WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name AND a.owner='user1' AND a.constraint_type='P';
3. رمز البرنامج الرئيسي
1) تهيئة البرنامج
String tablename=request.getParameter(" اسم الجدول")؛ // استخراج اسم الجدول
String OperType=request.getParameter("OperType"); //استخراج نوع العملية
String sFieldValue = "";// تخزين قيمة بيانات الحقل المقدمة بواسطة النموذج
String fieldname = ""، نوع البيانات = "" // اسم حقل التخزين، نوع بيانات الحقل
int iFieldvalue=0;
سلسلة updateSql = ""، WhereSql = " Where "، insSql1 = ""، insSql2 = ""، opSql = ""، strSql = ""؛
ResultSet rs1=null, rs2=null;
insSql1 = "أدخل في "+tablename+" (";
insSql2 = "values(";
2) قم بإنشاء جزء الحقل الرئيسي من عبارة SQL
وإنشاء جزء الحقل الرئيسي من عبارة الإدراج، مثل: Insert into table1(id andvalues(100));
استخدم الحقول الرئيسية فقط لـ قم بإنشاء بيان التحديث والحذف حيث الأجزاء، مثل: حيث id=100؛
عندما يتم تحديث نوع العملية، لن يتم تعديل بيانات الحقول الرئيسية في نموذج الويب.
rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name='"+tablename+"'");
بينما(rs1.next()){
fieldname=rs1.getString("column_name");
rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE 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()); }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 ";}
}
}
WhereSql=whereSql.substring(0, WhereSql.length()-4);
3) تنشئ عبارة SQL لجزء الحقل غير الرئيسي
بيان تحديث، مثل: تحديث table1 set column1=value1,... حيث id= 100
عبارة إدراج، مثل: إدراج في الجدول 1 (المعرف، العمود 1، ...) القيم (100، القيمة 1، ...)
updateSql = "update "+tablename+" set "؛
strSql = "SELECT column_name, data_type, data_length, data_precision, data_scale FROM 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); // احصل على اسم الحقل ونوع بيانات الحقول غير الرئيسية
بينما(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، أي تحديث مجموعة اسم الجدول... حيث fieldname=... if(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.Close();
4) إنشاء عبارة SQL كاملة وتنفيذها
if(OperType.equals("insert"))
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);}
Catch(SQLException e){out.println("SQLException:"+opSql);}
4. المميزات
تستخدم هذه الطريقة هذا البرنامج بشكل موحد لجميع النماذج المخزنة مباشرة، فهي عالمية ولا تحتاج إلى استخدامها لكل نموذج أو كل نموذج تم تطوير البرنامج المقابل بشكل مستقل لجدول البيانات، وعبء عمل التطوير صغير جدًا، والاستدعاء بسيط للغاية. وفي الوقت نفسه، عندما تتغير بنية الجدول، ليست هناك حاجة لتعديل برنامج DBdataStore.jsp. يمكن أيضًا إعادة كتابة هذا البرنامج كـServelet، ويكون تنسيق الاستدعاء هو <Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…">.
الاستنتاج
في تطبيق الويب، إذا كانت بيانات النموذج تتطلب مزيدًا من التحقق من البيانات أو معالجتها في خلفية الخادم بعد الإرسال، فيجب استخدام الطريقة الثانية. ولكن في كثير من الحالات، يقوم المستخدمون بإدخال البيانات أو تعديلها في النموذج، ويستخدمون JavaScript للتحقق من البيانات أو معالجتها على متصفح الواجهة الأمامية، ثم لا تتم أي معالجة على الخادم الخلفي، ويتم إرسال البيانات بواسطة النموذج يتم تخزينها مباشرة في قاعدة البيانات في الجدول. في الوقت الحالي، يعد استخدام الطريقة الثالثة أمرًا بسيطًا للغاية ويمكن أن يقلل بشكل كبير من عبء عمل المطور.