لقد كنت أتعلم SSH مؤخرًا ، ولم أفهم الفرق بين $ و ٪ و ٪ و#. لقد فعلت بعض التمارين الصغيرة وفهمت تدريجيا قليلا. سوف أسجل ما تعلمته.
الكيان التالي موجود:
شخص الطبقة العامة {private int id ؛ اسم السلسلة الخاصة ؛ public int getId () {return id ؛ } الشخص العام (int id ، اسم السلسلة) {super () ؛ this.id = id ؛ الاسم = الاسم ؛ } public person () {super () ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {name = name ؛ }} في عمل Struts2 ، يتم كتابة الرمز التالي:
Override Public String execute () يلقي استثناء {// application person p = شخص جديد (1 ، "Zhangsan") ؛ ActionContext.getContext (). getApplication (). put ("person" ، p) ؛ // session person p1 = شخص جديد (3 ، "Wangwu") ؛ ActionContext.getContext (). getSession (). put ("person" ، p1) ؛ // اطلب الشخص p2 = شخص جديد (2 ، "Lisi") ؛ ActionContext.getContext (). put ("person" ، p2) ؛ // servletContext person p3 = شخص جديد (5 ، "xiaoming") ؛ ActionContext.getContext (). getContextMap (). put ("person" ، p3) ؛ الشخص p4 = شخص جديد (3 ، "Wangwu") ؛ ActionContext.getContext (). getValuestack (). push (p4) ؛ إرجاع "النجاح" ؛ } تخزين كائن شخص في التطبيق ، الجلسة ، الطلب ، ServletContext ، Valuestack ، على التوالي. ثم في JSP يمكننا الحصول عليها بالطريقة التالية:
الشخص: <type type = "text" name = "name" value = "$ {person}" /> <br /> id: <input type = "text" name = "name" value = "$ {person.id}" /> <br /> name: <input type = "text" name = معلومات الشخص التي تم الحصول عليها بواسطة الرمز أعلاه هي Xiaoming ، أي المعلومات المخزنة في ActionContext.getContext (). getContextMap (). من خلال الاستعلام عن استخدام $ ، وجد أن هناك طريقة للحصول على الهدف من $ ، أي ،
ActionContext.getContext (). getContextMap ()> ActionContext.getContext ()> ActionContext.getContext (). بالنسبة للكائنات التي تحمل نفس الاسم موجود في نطاقات مختلفة (نطاقات) ، سيتم تنفيذ طريقة البحث بـ $ وفقًا للخطوات المذكورة أعلاه. إذا تم العثور عليه ، فسيتم الإخراج. إذا لم يتم العثور عليها ، فسيستمر البحث في المستوى السابق. عندما لا يكون الجزء العلوي موجودًا ، فإنه سيؤدي إلى إخراج فارغ.
ثم استخدام $ هو: $ {scope.object.attribute}
قيمة السمة للنطاق هي الطلب ، الجلسة ، التطبيق. عندما لا تكون مكتوبًا افتراضيًا ، ستقوم بالبحث وفقًا للمخطط أعلاه. إذا وجدت ذلك ، فسوف تقوم بإخراج قيمة السمة ذات الصلة.
في علامة الدعامات ، احفظ:
<s: property value = "#application.person"/>
يمكن ملاحظة أن الرقم # تم استخدامه في هذا الوقت. أنا شخصياً أعتقد أن استخدام # و $ هو نفسه في الواقع. طالما قمت بتحميل الكائن الذي تحتاج إلى الإخراج إلى خريطة (ServletContext ، الطلب ، الجلسة والتطبيق) في نطاق مختلف ، عند عرضه في العرض ، باستخدام <s: property value = "#scope.object.attribute"> هو بالضبط نفس فهم $. ولكن عندما تستخدم علامات الدعامات ، على سبيل المثال:
<s: textfield name = "person.name"> </s: textfield>
يمكن فهمه تمامًا
<type type = "text" name = "persom.name" id = "person.name" value = "<s: property value ="#person.name " />" />
بمعنى ، تم تغليف علامة الدعامات بالنسبة لنا في نص HTML <s: property value = "#target.name"/> ، والتي يمكن أن توفر لي الكثير من التعليمات البرمجية.
وبالمثل ، فإن استخدام # هو: <s: property value = " # scope.object.attribute" />
بالطبع ، يمكنك استخدام العلامات المحددة بواسطة Struts2 لحفظ متاعب كتابة الكثير من الرموز المكررة. في الواقع ، # له استخدامات أخرى ، مثل بناء كائنات مثل الخرائط ، لكنني شخصياً أعتقد أن عصر كتابة الكثير من التعليمات البرمجية في الرأي قد مرت ، وهذا الاستخدام ليس له معنى. علاوة على ذلك ، كتبت هذه المرة فقط عملية عرضها في العرض ، لذلك لن أتحدث عنها في مكان آخر.
أخيرًا ، دعنا نتحدث عن استخدام ٪. بعبارة ذلك ببساطة ، ٪ {} هو تعبير حساب سلسلة. على سبيل المثال ، هناك رابط معين في العرض ، والذي يحتوي بشكل عام على وظائف أساسية مثل CRUD. لوظائف إضافة وتحديث ، يمكن إكمالها على نفس الصفحة. الفرق هو أن العنوان الذي نرسله مختلف. على سبيل المثال ، قد يكون مثل هذا تمامًا: بالنسبة لطريقة إضافة ، فإن العنوان هو user_add.action ، وبالنسبة لطريقة udpate ، فإن العنوان هو user_update.action ، لذلك في النموذج ، يمكن استخدام ٪ للحكم:
<s: form action = "user _ ٪ {id == 0؟ 'add': 'update'}"> </form> هاها ، لذلك يمكن الآن حل الصفحتين السابقتين بواسطة صفحة واحدة.
وبالمثل ، يتم استخدام ٪ بشكل متكرر مع ملصقات الحكم مثل IF و ifelse في الدعامات. بعد كل شيء ، هل هي مقارنة؟ . . .
<s: if test = "٪ {false}"> <viv> لن يتم تنفيذها </div> </s: if> <s: elseif test = "٪ {true}"> <viv> سيتم تنفيذ </div> </s: elseif> <s: else> <viv> أخيرًا ، دعنا نتحدث عن النهج المفيد لهذا ٪ ، على افتراض أن هناك قائمة توضح جميع الدرجات التي تمريرها للطلاب (أي ، لن يتم عرض الدرجات الفاشلة أعلاه) ، إذا كانت ٪ المستخدمة بسيطة للغاية. لا ، فقط ضع الكود أولاً:
الطبقة العامة stduent تنفذ java.io.serializable {private static final long serialversionuid = -69103814755396419l ؛ معرف int الخاص ؛ اسم السلسلة الخاصة ؛ درجة int الخاصة ؛ موضوع السلسلة الخاصة ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } public int getScore () {return score ؛ } public void setScore (int score) {this.score = score ؛ } السلسلة العامة getSubject () {return subner ؛ } public void setSUBject (string string) {this.subject = toffice ؛ } / ** * هنا نحكم على ما إذا كانت النتيجة تجتاز الاختبار * param Socre * @return * / public boolean ISPAST (int socre) {return getScore ()> 60 ؛ }} لذا ، ابحث الآن عن درجات الطلاب في قاعدة البيانات ووضعها في قائمة التخزين المؤقت. في صفحة JSP ، يمكننا استخدام الكود التالي للتحكم في ما إذا كان إخراج نظام الصف يمر:
<s: iterator value = "#alluser"> <!- حدد ما إذا كنت تريد تمرير الخط ، إذا قمت بتمرير الخط ، فسيتم إخراجه ، وإلا فسوف تتخلى عنه! -> <s: if test = "#session.user.ispast (score)"> name: <s: textfield name = "name"> </s
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!