English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

علامات مخصصة JSP

العلامات المخصصة هي عناصر لغة JSP المحددة من قبل المستخدم. عند وجود علامة مخصصة في صفحة JSP، يتم تحويلها إلى servlet، وتحويل العلامة إلى عمليات.    العمليات التي تنفذها الكائنات التي تُدعى tag handler، وهي العمليات التي يتم استدعاؤها من قبل Web container عند تنفيذ servlet.

توسيع علامات JSP يتيح لك إنشاء علامات جديدة وإدراجها مباشرة في صفحة JSP. تم إدخال Simple Tag Handlers في معيار JSP 2.0 لإنشاء هذه العلامات المخصصة.

يمكنك توريث SimpleTagSupport وتعديل طريقة doTag لإنشاء علامة مخصصة بسيطة.

إنشاء "Hello" العلامة

الآن نريد إنشاء علامة مخصصة تسمى <ex:Hello>، ونمط العلامة كما يلي:

<ex:Hello />

لإنشاء علامة JSP مخصصة، يجب أن تنشئ أولاً فئة Java لتعامل العلامة. لذلك، دعونا ننشئ فئة HelloTag كما يلي:

باقة com.w3codebox;
إدراج javax.servlet.jsp.tagext.*;
إدراج javax.servlet.jsp.*;
إدراج java.io.*;
public class HelloTag extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    JspWriter out = getJspContext().getOut();
    out.println("Hello Custom Tag!");
  }
}

يعيد هذا الكود كتابة طريقة doTag()، حيث يستخدم طريقة getJspContext() للحصول على جسم JspContext الحالي، ويقوم بمرور "Hello Custom Tag!" إلى جسم JspWriter.

استنساخ هذه الفئات، وأدمجها في دليل CLASSPATH المتغير. ثم قم بإنشاء مكتبة العلامات كما يلي: <Tomcat安装目录>webapps\ROOT\WEB-INF\custom.tld.

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

الآن يمكننا استخدام علامة Hello في ملف JSP:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  <body>
    <ex:Hello/>
  </body>
</html>

نتائج البرنامج المذكور أعلاه كما يلي:

Hello Custom Tag!

زيارة جسم العلامة

يمكنك تضمين محتوى الرسالة في العلامة مثل مكتبة العلامات القياسية. إذا أردنا تضمين محتوى في علامة Hello المخصصة، فإن النمط كما يلي:

<ex:Hello>
   This is message body
</ex:Hello>

يمكننا تعديل ملف فئة معالج العلامة، كما يلي:

باقة com.w3codebox;
إدراج javax.servlet.jsp.tagext.*;
إدراج javax.servlet.jsp.*;
إدراج java.io.*;
public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       getJspBody().invoke(sw);
       getJspContext().getOut().println(sw.toString());
    }
}

الآن نحتاج إلى تعديل ملف TLD، كما يلي:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>مثال على TLD يحتوي على جسم</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

الآن يمكننا استخدام العلامة المعدلة في JSP، كما يلي:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  <body>
    <ex:Hello>
        This is message body
    </ex:Hello>
  </body>
</html>

نتائج البرنامج المذكور أعلاه كما يلي:

This is message body

خصائص العلامة المخصصة

يمكنك تعيين مختلف الخصائص في العلامة القياسية المخصصة، لاستقبال الخصائص، يجب أن يكون فئة العلامة المخصصة قادرة على تنفيذ طريقة setter، ويمكن رؤية طريقة setter في JavaBean كما يلي:

باقة com.w3codebox;
إدراج javax.servlet.jsp.tagext.*;
إدراج javax.servlet.jsp.*;
إدراج java.io.*;
public class HelloTag extends SimpleTagSupport {
   private String message;
   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       if (message != null) {
          /* من الخاصية باستخدام الرسالة */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* من جسم المحتوى باستخدام الرسالة */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }
}

اسم الخاصية هو "message"، لذا فإن طريقة الإعداد هي setMessage(). دعونا الآن نضيف هذه الخاصية إلى عنصر <attribute> في ملف TLD:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>مثال على TLD يحتوي على جسم</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

الآن يمكننا استخدام خاصية message في ملفات JSP، مثلما يلي:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  <body>
    <ex:Hello message="This is custom tag" />
  </body>
</html>

نتيجة بيانات الأمثلة أعلاه هي:

هذه علامة مخصصة

يمكنك أيضًا تضمين الخصائص التالية:

خصائصوصف
nameيحدد اسم الخاصية. يجب أن يكون اسم الخاصية الفريدة لكل علامة.
requiredيحدد ما إذا كانت الخاصية إلزامية أو اختيارية، إذا تم تعيينها كـfalse فهي اختيارية.
rtexprvalueيحدد ما إذا كان خاصية العلامة صالحة أثناء تشغيل التعبير.
typeيحدد نوع الكلاس الذي يعينه الخاصية. يتم تحديد القيمة الافتراضية كـ String
descriptionمعلومات الوصف
fragmentإذا تم إعلان هذا الخصوص، سيتم اعتبار قيمة الخصوص كـ JspFragment

السجلات التالية هي أمثلة على الخصائص المحددة:

.....
    <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
    </attribute>
.....

إذا كنت قد استخدمت اثنين من الخصائص، قم بتعديل ملف TLD كما يلي:

.....
    <attribute>
      <name>attribute_name1</name>
      <required>false</required>
      <type>java.util.Boolean</type>
      <fragment>false</fragment>
    </attribute>
    <attribute>
      <name>attribute_name2</name>
      <required>true</required>
      <type>java.util.Date</type>
    </attribute>
.....