English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في العديد من الحالات، تحتاج إلى نقل بعض المعلومات من متصفح الويب إلى خادم الويب، ثم إلى برنامج الخلفية. يستخدم متصفح الويب طريقتين لتحويل هذه المعلومات إلى خادم الويب، وهي طريقة GET و طريقة POST.
تستخدم طريقة GET لإرسال معلومات مستخدمة مسبقًا إلى صفحة الطلب. يتم فصل الصفحة والمعلومات الم编码ة برمز الأسئلة، مثلما يلي:
http://www.test.com/hello?key1=value1&key2=value2
طريقة GET هي الطريقة الافتراضية لتحويل معلومات من متصفح الويب إلى خادم الويب، وستنتج سلسلة طويلة من الأحرف تظهر في شريط العناوين في المتصفح. إذا كنت ترغب في إرسال كلمة المرور أو معلومات حساسة أخرى إلى الخادم، فلا تستخدم طريقة GET. تتوفر طريقة GET بمحدودية الحجم: يمكن أن يحتوي السلسلة الطلبات على 1024 حرف كحد أقصى.
تتم نقل هذه المعلومات باستخدام رأس QUERY_STRING وتتوفر من خلال متغير البيئة QUERY_STRING، يستخدم Servlet doGet() معالجة هذا النوع من الطلبات.
طريقة أكثر موثوقية لتحويل معلومات إلى برنامج الخلفية هي طريقة POST. يتم ت打包 المعلومات بطريقة مشابهة لطريقة GET، ولكن طريقة POST لا تقوم بإرسال المعلومات كنص مرتبط بعد رمز الأسئلة في URL، بل ترسل هذه المعلومات كرسالة منفصلة. يتم نقل الرسالة بشكل مخرجات معيارية إلى برنامج الخلفية، ويمكنك تحليل واستخدام هذه المخرجات. يستخدم Servlet طريقة doPost() لمعالجة هذا النوع من الطلبات.
يحصل Servlet على بيانات النموذج ويتم تفسيرها تلقائيًا باستخدام طرق مختلفة بناءً على الحالة المختلفة:
getParameter():يمكنك استدعاء طريقة request.getParameter() للحصول على قيمة المعاملات في النموذج.
getParameterValues():إذا ظهر المعامل أكثر من مرة، فعليك استدعاء هذه الطريقة وستحصل على قيم متعددة، مثل المربعات المفترضة.
getParameterNames():إذا كنت ترغب في الحصول على قائمة كاملة لجميع المعلمات الحالية في الطلب، فعليك استدعاء هذه الطريقة.
إليك رابط بسيط، سيتم استخدامه لإرسال قيمين إلى برنامج HelloForm باستخدام طريقة GET.
http://localhost:8080/TomcatTest/HelloForm?name=موقع الأساسيات&url=ar.oldtoolbag.com
إليك معالجة إدخال متصفح الويب: HelloForm.java برنامج Servlet. سنستخدم getParameter() يمكنك استخدام هذه الطريقة لسهولة الوصول إلى المعلومات المرسلة:
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloForm */ @WebServlet("/HelloForm") public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // إعداد نوع المحتوى الخاص بالاستجابة response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "استخدام طريقة GET لقراءة بيانات النموذج"; // 处理中文 String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"); String docType = "<!DOCTYPE html> \n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + “ <li><b>站点名</b></li> + name + “\n” + “ <li><b>网址</b></li> + request.getParameter("url") + “\n” + "</ul>\n" + "</body></html>"); } // معالجة طلبات طريقة POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ثم في web.xml إنشاء المشاركات التالية في الملف:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>HelloForm</servlet-name> <servlet-class>com.w3codebox.test.HelloForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloForm</servlet-name> <url-pattern>/TomcatTest/HelloForm</url-pattern> </servlet-mapping> </web-app>
الآن اكتب في شريط العناوين في المتصفح: http://localhost:8080/TomcatTest/HelloForm?name=موقع الأساسيات&url=ar.oldtoolbag.com ، ويجب التأكد من تشغيل خادم Tomcat قبل تنفيذ الأوامر المذكورة أعلاه. إذا كان كل شيء على ما يرام، فستحصل على النتيجة التالية:
إليك مثال بسيط يستخدم نموذج HTML وأزرار التقديم لتحويل قيمين. سنستخدم Servlet HelloForm نفسه لمعالجة الإدخال.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>موقع تعليم الأساسيات (oldtoolbag.com)</title> </head> <body> <form action="HelloForm" method="GET"> 网址名:<input type="text" name="name"> <br/> 网址:<input type="text" name="url"/> <input type="submit" value="提交"/> </form> </body> </html>
احفظ هذا HTML في ملف hello.html، بنية المجلد كما يلي:
المحاولة إدخال اسم الموقع والرابط، ثم النقر على زر "تقديم"، كما يلي:
我们对上面的 Servlet 做一个小小的修改,以使其能处理 GET 和 POST 方法。下面的 HelloForm.java Servlet 程序使用 GET 和 POST 方法处理很临的 Web 浏览器的输入。
注册:如果表单提交的数据中有中文数据需要转码。
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloForm */ @WebServlet("/HelloForm") public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // إعداد نوع المحتوى الخاص بالاستجابة response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = “使用 POST 方法读取表单数据”; // 处理中文 String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8"); String docType = "<!DOCTYPE html> \n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + “ <li><b>站点名</b></li> + name + “\n” + “ <li><b>网址</b></li> + request.getParameter("url") + “\n” + "</ul>\n" + "</body></html>"); } // معالجة طلبات طريقة POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
现在,编译部署上面的 Servlet,并使用养有 POST 方法的 hello.html 输入测试,如下所示:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>موقع تعليم الأساسيات (oldtoolbag.com)</title> </head> <body> <form action="HelloForm" method="POST"> 网址名:<input type="text" name="name"> <br/> 网址:<input type="text" name="url"/> <input type="submit" value="提交"/> </form> </body> </html>
下面是上面表单的实际输出,已调照地地输入网址名和网址,然后点击“提交”按钮,演示如下:
当需要选择一个以上的选项时,将使用补销板。
下面是一个 HTML 代码示例 checkbox.html,一个养有两个补销板的表单。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>موقع تعليم الأساسيات (oldtoolbag.com)</title> </head> <body> <form action="CheckBox" method="POST" target="_blank"> <input type="checkbox" name="w3codebox" checked="checked"/> 基础教程网 <input type="checkbox" name="google" /> Google <input type="checkbox" name="taobao" checked="checked" /> تاobao <input type="submit" value="اختيار الموقع" /> </form> </body> </html>
هذه هي برنامج ServletCheckBox.java، المعالج لبيانات مربعات الاختيار المقدمة من متصفح الويب.
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * فئة تنفيذ ServletCheckBox */ @WebServlet("/CheckBox") public class CheckBox extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // إعداد نوع المحتوى الخاص بالاستجابة response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "قراءة بيانات مربعات الاختيار"; String docType = "<!DOCTYPE html> \n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>علامة تذكير طريقة النسخ:</b>: " + request.getParameter("w3codebox") + "\n" + " <li><b>علامة تذكير Google:</b>: " + request.getParameter("google") + "\n" + " <li><b>علامة تذكير تاobao:</b>: " + request.getParameter("taobao") + "\n" + "</ul>\n" + "</body></html>"); } // معالجة طلبات طريقة POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
إعداد web.xml المطلوب:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>CheckBox</servlet-name> <servlet-class>com.w3codebox.test.CheckBox</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckBox</servlet-name> <url-pattern>/TomcatTest/CheckBox</url-pattern> </servlet-mapping> </web-app>
上面的示例访问地址:http://localhost:8080/TomcatTest/checkbox.html ,查看输出结果。
以下是通用的示例,使用 HttpServletRequest 的 getParameterNames() 方法读取所有可用的表单参数。该方法返回一个枚举,其中包含未指定顺序的参数名。
一旦我们有一个枚举,我们可以以标准方式循环枚举,使用 hasMoreElements() 方法来确定何时停止,使用 nextElement() 方法来获取每个参数的名称。
import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ReadParams */ @WebServlet("/ReadParams") public class ReadParams extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ReadParams() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // إعداد نوع المحتوى الخاص بالاستجابة response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "قراءة جميع بيانات النموذج"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//ar\">\n"; out.println(docType + "<html>\n" + "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<table width=\"100%\" border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + "<th>اسم المفتاح</th><th>قيمة المفتاح</th>\n"+ "</tr>\n"); Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n"); String[] paramValues = request.getParameterValues(paramName); // Read single value data if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("<td><i>لا يوجد قيمة</i></td>"); else else { } // Read multiple values data out.println("<td><ul>"); for(int i=0; i < paramValues.length; i++) { out.println("<li>" + paramValues[i]); } out.println("</ul></td>"); } out.print("</tr>"); } out.println("\n</table>\n</body></html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
الآن، جرب Servlet أعلاه من خلال النموذج التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>موقع تعليم الأساسيات (oldtoolbag.com)</title> </head> <body> <form action="ReadParams" method="POST" target="_blank"> <input type="checkbox" name="maths" checked="checked" /> الرياضيات <input type="checkbox" name="physics" /> فيزياء <input type="checkbox" name="chemistry" checked="checked" /> كيمياء <input type="submit" value="اختر المادة" /> </form> </body> </html>
تعيين web.xml المناسب:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>ReadParams</servlet-name> <servlet-class>com.w3codebox.test.ReadParams</servlet-class> </servlet> <servlet-mapping> <servlet-name>ReadParams</servlet-name> <url-pattern>/TomcatTest/ReadParams</url-pattern> </servlet-mapping> </web-app>
استخدم النموذج المذكور أعلاه الآن لتشغيل Servlet، عنوان العنوان: http://localhost:8080/TomcatTest/test.html لمعاينة النتائج.
يمكنك محاولة استخدام Servlet المذكور أعلاه لقراءة بيانات النموذج الأخرى، مثل حقل النص أو المربعات المختارة أو القوائم المنسدلة وما إلى ذلك.