navigation

13
علوماتيةندسة ا كلية اامسة السنة ات والنظملشبكاب قسمي ا لط و ميات هندسة الص - سوريا ونيةلكرة التجا ر ا مقر د. زينب خلوفاضرة اامسة اتنقل ال بلصفحات اJSF: Page Navigation أنواعتنقل ال بلصفحات ا JSF أن يتكن لصفحات اتنقل ب ال أو بشكل صريح بشكل ضم م. 1 . تنقل ضم إلصفحات ا: ويتم ذه ه الطريقةديد الصفحة الث سيتمنتقال ا إليها منل خ النتيجة الث تعيدها الطريقةAction Method منManaged Bean . حيث أن النتيجة ال يتما إعادثل إسم الصفحة ال سيتمنتقال ا إليها علما أن ه ليس ورة بالضر أن تكونذه ه النتيجةلسلة س نارف بلكن أن تكون قيمةدية عد. ثال ا( 1 ) ، عندماتم ت إعادةلسلة سارف ا" success " يتمنتقال ا إل الصفحةsuccess.xhtml وعندما تعادلسلة سارف ا" index " يتمنتقال ا إل الصفحةindex.xhtml . وثال ا(2) عندماتم إعادة ت1 يتم ا نتقال إ الصفحة ل1.xhtml وعندما يعاد2 الصفحة إلنتقال يتم ا2.xhtml . public int guessCommand () { if (guess == target) { return (1); } else { this.attempts++; return (2); } } public String guessCommand () { if (guess == target) { return ("success"); } else { this.attempts++; return ("index"); } } ثال ا2 ثال ا1 2 . تنقل ال الصريح إلصفحات ا: ذه ه الطريقةتم ت إضافة قواعدتنقل ال بشكل صريح إل ملفعريفات التfaces- config.xml ، ذه ه القواعددد بشكل صريح الصفحة الث سيتمنتقال ا إليها من أجل نتيجة معينة. حظة م: نتقال يسمى با أنواع اوع من يوجد ن ولثابل ا نتقاStatic Navigation وضع إسم الصفحة الل من خ ويتم خاصية إليهانتقال يراد اAction وامر لزر ا: < h:commandButton ... action="fixed-page /" >

Upload: zainab-khallouf

Post on 27-Jan-2017

28 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Navigation

كلية اهلندسة املعلوماتية السنة اخلامسة

هندسة الربجمياتو لطالب قسمي الشبكات والنظم سوريا -محص

مقرر التجارة االلكرتونية زينب خلوف.د

اخلامسةاحملاضرة

الصفحات بني التنقل

JSF: Page Navigation

JSF يف الصفحات بني التنقل أنواع

.م بشكل ضمين أو بشكل صريحالتنقل بني الصفحات ميكن أن يت اليت النتيجة خالل من إليها اإلنتقال سيتم اليت الصفحة حتديد الطريقة هذه يف ويتم: الصفحات إىل ضمين تنقل .1

إسم متثل إعادهتا يتم اليت النتيجة أن حيث. Managed Bean من Action Method الطريقة تعيدها تكون أن ميكن بل حمارف سلسلة النتيجة هذه تكون أن بالضرورة ليس هأن علما إليها اإلنتقال سيتم اليت الصفحة الصفحة إىل اإلنتقال يتم" success" احملارف سلسلة إعادة تتم عندما ،( 1) املثال يف. عددية قيمة

success.xhtml احملارف سلسلة تعاد وعندما "index "الصفحة إىل اإلنتقال يتم index.xhtml. ويفيتم اإلنتقال إىل الصفحة 2يعاد وعندما xhtml.1ىل الصفحة إنتقال يتم اإل 1تتم إعادة عندما (2)املثال

2.xhtml.

public int guessCommand () { if (guess == target) { return (1); } else { this.attempts++; return (2); } }

public String guessCommand () { if (guess == target) { return ("success"); } else { this.attempts++; return ("index"); } }

2املثال 1املثال -faces التعريفات ملف إىل صريح بشكل التنقل قواعد إضافة تتم الطريقة هذه يف: الصفحات إىل الصريح التنقل .2

config.xml ، معينة نتيجة أجل من إليها اإلنتقال سيتم اليت الصفحة صريح بشكل حتدد القواعد هذه.

:مالحظة

ويتم من خالل وضع إسم الصفحة اليت Static Navigation نتقال الثاب ويوجد نوع من أنواع االنتقال يسمى باإل :لزر األوامر Actionيراد اإلنتقال إليها يف خاصية

<h:commandButton ... action="fixed-page/">

Page 2: Navigation

:كما يف املثال

<h:commandButton ... action="/view/result-page-1.xhtml/">

.صحيح للصفحةحيث جيب حتديد املسار ال الصفحات إىل الصريح التنقل

Explicit Page Navigation

يتم Netbeans، يف faces-config.xmlمن خالل تعريف قواعد التنقل يف امللف يتم الصفحات بني الصريح التنقل :وفقاً للشكل faces-config.xmlإنشاء امللف

:امبني يف الشكل كم WEB-INFضمن اجمللد ليتوضع بشكل إفرتاضي

:مبني يف الشكل faces-config.xml للملفالشكل العام

ملف يف املعرفة تلك غري بالتطبيق اخلاصة التعريفات مجيع ويتضمن xml الـ ملف جذر ميثل< faces-config> العنصر-faces امللف يف العناصر كل. Web Deployment Descriptor( web.xml) التطبيق إستخدام موصف

config.xml مثل (application, managed-bean, ..., factory )امللف يتضمن أن وميكن إختيارية هي .يف هذه احملاضرة سنركز على كيفية تعريف قواعد التنقل. العناصر هذه من أكثر أو واحد

:ات يتضمن جمموعة من القواعد لتعريف التنقل بني الصفح faces-config.xmlمثال عن ملف

Page 3: Navigation

faces-config.xml

1 <?xml version="1.0"?> 2 <faces-config xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 6 version="2.0"> 7 8 <navigation-rule> 9 <from-view-id>/start-page.xhtml</from-view-id> 10 <navigation-case> 11 <from-outcome>too-short</from-outcome> 12 <to-view-id>error-message.xhtml</to-view-id> 13 </navigation-case> 14 </navigation-rule> 15 <navigation-rule> 16 <from-view-id>/start-page.xhtml</from-view-id> 17 <navigation-case> 18 <from-outcome>page1</from-outcome> 19 <to-view-id>result-page-1.xhtml</to-view-id> 20 </navigation-case> 21 <navigation-case> 22 <from-outcome>page2</from-outcome> 23 <to-view-id>result-page-2.xhtml</to-view-id> 24 </navigation-case> 25 </navigation-rule> 26 </faces-config> 27

faces-config.xmlيف امللف (Navigation Rules) التنقل قواعديعرف قاعدة ، ميكن أن يكون هلذا العنصر عدد من العناصر األبناء ، من أكثرهم <navigation-rule>العنصر

:استخداماً CHILD ELEMENT MULTIPLICITY DESCRIPTION

Page 4: Navigation

from-view-id zero or one عليها القاعدة ، إذا مل يكن حتدد الصفحة اليت تطبق .هذا العنصر موجود فالقاعدة تطبق على كل الصفحات

navigation-case zero to many حيدد الصفحة التالية اليت سيتم اإلنتقال إليها إذا حتقق . شرط أو خرج معني

، هذا اليعطي أخطاء navigation-caseمن املالحظ من اجلدول السابق أن القاعدة قد التتضمن أي عنصر : مالحظة

موافقة هلذه navigation-case واليوجد حالة Action Methodبالتنفيذ ولكن حيصل خطأ ان كان هناك نتيجة لـ .النتيجة

. أيضاً عناصر أبناء ومن أكثرها استخداماً <navigation-case>للعنصر CHILD ELEMENT MULTIPLICITY DESCRIPTION from-outcome zero or one تعرف خرج مثل"success " أو"failure" لـ

Action Method to-view-id exactly one تعرف الصفحة التالية اليت سيتم االنتقال إليها إذا حتققت

.هذه احلالةfrom-action zero or one قيمة تدل على تعبري جيب أن يتنفذ حىت يتم تطبيق هذه

.القاعدةredirect zero or one حيدد أن اإلنتقال للصفحة املعرفة بـto-view-id جيب

.HTTP redirectأن يتم وفقاً لـ اإلنتقال الضمين قد يكون أبسط ولكن التنقل الصريح يسمح بتخصيص : للصفحات الصريح التنقل وحماسن مساوئ

من حيث أنه ميكن إسناد الشروط مكان واحد لقواعد التنقل بدل البحث يف ملفات جافا ، هذا يعطي مرونة أكرب .لصفحات البدء أو إستخدام التنقل الشرطي wildcardsلصفحات خمتلفة الحقا وميكن إستخدام

(/http://www.coreservlets.com/JSF-Tutorial/jsf2: )الصفحات بني الصريح التنقل عن مثال أوامر وزر inputText نص إلدخال ُمكونة تتضمن ، start-page-1.xhtml البداية ، صفحة املثال هذا يف

commandButton .لإلنتقال صفحة يارتإخ عشوائي بشكل يتم ني أو أكثرحمرف من مكونة رسالة املستخدم أدخل إذا .خطأ رسالة تعرض لصفحة لاإلنتقا فإنه يتم وإال املدخلة الرسالة عرض فيها ويتم إليها

:SimpleController.java هو Managed Beanالتطبيق مكون من

SimpleController.java

1 package coreservlets; 2

Page 5: Navigation

3 import java.io.Serializable; 4 import javax.enterprise.context.RequestScoped; 5 import javax.inject.Named; 6 @RequestScoped 7 @Named 8 public class SimpleController { 9 private String message=""; 10 11 public String getMessage() { 12 return(message); 13 } 14 15 public void setMessage(String message) { 16 this.message = message; 17 } 18 19 public String doNavigation() { 20 if (message.trim().length() < 2) { 21 return("too-short"); 22 } else { 23 String[] results = 24 { "page1", "page2" }; 25 return(RandomUtils.randomElement(results)); 26 } 27 } 28 } 29

.هو صف مساعد يسمح باختيار عنصر من صف بشكل عشوائي RandomUtils.javaالصف

RandomUtils.java

1 package coreservlets; 2 3 import java.util.Random; 4 5 public class RandomUtils { 6 private static Random r = new Random();

Page 6: Navigation

7 8 public static int randomInt(int range) { 9 return(r.nextInt(range)); 10 } 11 12 public static int randomIndex(Object[] array) { 13 return(randomInt(array.length)); 14 } 15 16 public static <T> T randomElement(T[] array) { 17 return(array[randomIndex(array)]); 18 } 19 } 20

. ، فيم يلي عرض هلذه الصفحات JSFوكذلك يتألف التطبيق من جمموعة من صفحات start-page.xhtmlالصفحة

start-page.xhtml

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:h="http://java.sun.com/jsf/html"> 5 <h:head><title>JSF 2.0: Basic Navigation Rules</title> 6 <link href="./css/styles.css" 7 rel="stylesheet" type="text/css"/> 8 </h:head> 9 <h:body> 10 <div align="center"> 11 <table border="5"> 12 <tr><th class="title">JSF 2.0: Basic Navigation Rules</th></tr> 13 </table> 14 <p/> 15 <h:form> 16 Your message: 17 <h:inputText value="#{simpleController.message}"/> 18 <br/>

Page 7: Navigation

19 <h:commandButton value="Show Results" 20 action="#{simpleController.doNavigation}"/> 21 </h:form> 22 </div> 23 </h:body> 24 </html> 25

result-page-1.xhtmlالصفحة

result-page-1.xhtml

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:h="http://java.sun.com/jsf/html"> 5 <h:head><title>Result Page 1</title> 6 <link href="./css/styles.css" 7 rel="stylesheet" type="text/css"/> 8 </h:head> 9 <h:body> 10 <div align="center"> 11 <table border="5"> 12 <tr><th class="title">Result Page 1</th></tr> 13 </table> 14 <p/> 15 16 <h2>Your message: "#{simpleController.message}"</h2> 17 18 </div></h:body></html> 19

result-page-2.xhtmlالصفحة

result-page-2.xhtml

Page 8: Navigation

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:h="http://java.sun.com/jsf/html"> 5 <h:head><title>Result Page 2</title> 6 <link href="./css/styles.css" 7 rel="stylesheet" type="text/css"/> 8 </h:head> 9 <h:body> 10 <div align="center"> 11 <table border="5"> 12 <tr><th class="title">Result Page 2</th></tr> 13 </table> 14 <p/> 15 16 <h2>Your message: "#{simpleController.message}"</h2> 17 18 </div></h:body></html> 19

error-message.xhtmlالصفحة

error-message.xhtml

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:h="http://java.sun.com/jsf/html"> 5 <h:head><title>Error: Message Too Short</title> 6 <link href="./css/styles.css" 7 rel="stylesheet" type="text/css"/> 8 </h:head> 9 <h:body> 10 <div align="center"> 11 <table border="5"> 12 <tr><th class="title">Error: Message Too Short</th></tr> 13 </table> 14 <p/>

Page 9: Navigation

15 16 <h2>Short message.</h2> 17 18 </div></h:body></html> 19

faces-config.xmlامللف

faces-config.xml

1 <?xml version="1.0"?> 2 <faces-config xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 6 version="2.0"> 7 8 <navigation-rule> 9 <from-view-id>/start-page.xhtml</from-view-id> 10 <navigation-case> 11 <from-outcome>too-short</from-outcome> 12 <to-view-id>error-message.xhtml</to-view-id> 13 </navigation-case> 14 </navigation-rule> 15 <navigation-rule> 16 <from-view-id>/start-page.xhtml</from-view-id> 17 <navigation-case> 18 <from-outcome>page1</from-outcome> 19 <to-view-id>result-page-1.xhtml</to-view-id> 20 </navigation-case> 21 <navigation-case> 22 <from-outcome>page2</from-outcome> 23 <to-view-id>result-page-2.xhtml</to-view-id> 24 </navigation-case> 25 </navigation-rule> 26 </faces-config> 27

Page 10: Navigation

from-actionإستخدام

:يف بعض األحيان قد تعيد طريقتني خمتلفتني نفس النتيجة ، كما يف املثال package bean; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean @SessionScoped public class PageController {

public String processPage1() { return "success"; } public String processPage2() { return "success"; }

} .للتميز بني حاليت االنتقال from-actionيف هذه احلالة نستخدم

<?xml version='1.0' encoding='UTF-8'?> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> <navigation-rule> <from-view-id>index.xhtml</from-view-id> <navigation-case> <from-action>#{pageController.processPage1}</from-action> <from-outcome>success</from-outcome> <to-view-id>page1.xhtml</to-view-id> </navigation-case> <navigation-case> <from-action>#{pageController.processPage2}</from-action> <from-outcome>success</from-outcome> <to-view-id>page2.xhtml</to-view-id> </navigation-case> </navigation-rule>

</faces-config> يف القواعد *استخدام حمرف البدل

: كما يف املثال التايل <from-view-id>من املمكن استخدام حمرف البدل يف القواعد بدل اسم الصفحة يف <navigation-rule>

Page 11: Navigation

<from-view-id>*</from-view-id> <navigation-case> <from-outcome>too-short</from-outcome> <to-view-id>/view/error-message.xhtml</to-view-id> </navigation-case> </navigation-rule>

.<from-view-id>أي أن هذد القاعدة تتحقق من أجل أي صفحة بداية Conditional Navigation Rulesقواعد اإلنتقال الشرطي

: ، كما يف املثال التايل <if>من املمكن تعريف قواعد انتقال شرطية من خالل استخدام الومسة <navigation-case> <from-outcome>success</from-outcome> <if>#{user.newVisitor}</if> <to-view-id>/welcome-new.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>success</from-outcome> <if>#{!user.newVisitor}</if> <to-view-id>/welcome-back.xhtml</to-view-id> </navigation-case>

هو userصحيحة حيث أن {user.newVisitor}#و successيف احلالة األوىل إذا كانت النتيجة ManagedBean و newVisitor اسم خلاصية من نوع منطقي لـuser.

Dynamic To-Idsإمكانية حتديد إسم الصفحة اليت سيتم اإلنتقال إليها بشكل ديناميكي ، بدل من facse-config.xmlيف من املمكن حساب الصفحة اليت سيتم اإلنتقال إليها بشكل ديناميكي يف ملف التول

-exam/يف املثال التايل سيتم االنتقال من الصفحة . أن يتم حتديد إسم الصفحة بشكل غري مباشر كنتيجة إعادة

question.xhtml إىل الصفحة ذات اإلسم الناتج من تنفيذ التعبري#{exam.nextQuestionPage} <from-view-id>/exam-question.xhtml</from-view-id> <navigation-case> <to-view-id>#{exam.nextQuestionPage}.xhtml</to-view-id> </navigation-case>

Page 12: Navigation

Page Forward vs Page Redirectالفرق بني

أما عند إستخدام .يدةعند االنتقال إىل الصفحة اجلد URLاليتم تغيري الـ Page Forwardعند إستخدام توجيه الصفحة .عند اإلنتقال إىل الصفحة اجلديدة URLيتم تغيري الـ redirection Pageإعادة التوجيه

: عدة طرقلتحقيق إعاد التوجيه بشكل عملي يوجد :للزر Actionبشكل ثابت من خالل اخلاصية الطريقة األوىل

<h:form> <h:commandButton action="page1?faces-redirect=true" value="Page1" /> </h:form>

:Action Methodمن خالل القيمة اليت تعيدها ال الطريقة الثانية public String sayHello() {

Page 13: Navigation

if (age < 11) { helloText = "Hello " + name + "!"; } else { helloText = "Good Morning " + name + "!"; } return ("home?faces-redirect=true"); }

</ navigation-case> ضمن </ redirect>من خالل استخدام الومسة الثالثةالطريقة <navigation-rule> <from-view-id>start.xhtml</from-view-id> <navigation-case> <from-outcome>page1</from-outcome> <to-view-id>page1.xhtml</to-view-id> <redirect /> </navigation-case> </navigation-rule>

مراجع احملاضرة

1. The Java EE 6 Tutorial. http://download.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf

2. JSF 2.0: Explicit Page Navigation and faces-con_g.xml, available from:http://www.coreservlets.com/JSF-Tutorial/jsf2/

3. Mastering JavaServer Faces, by Bill Dudney, Jonathan Lehr, Bill Willis, and LeRoy Mattingly.

4. JSF 2.0 lecture notes by Dr. Beatrice Amrhein, available from: http://sws.bfh.ch/~amrhein/

5. JSF 2.0 Tutorial, available from: http://www.mkyong.com/jsf2/