1. شرح servletconfig
1.1. تكوين معلمات تهيئة servlet
في ملف تكوين Servlet Web.xml ، يمكنك استخدام علامات واحدة أو أكثر من علامات <Ing-param> لتكوين بعض معلمات التهيئة للخدمة.
على سبيل المثال:
<Srevlet> <Sradlet-Name> servletConfigDemo1 </revlet-name> <Servlet-Class> gacl.servlet.study.servletconfigdemo1 </servlet-class> <!-تكوين معلمات التهيئة لـ servletconfigdemo1-> <Ing-param> name> <Param-value> gacl </parm-value> </ith-param> <Ing-param> <Param-name> كلمة المرور </param-name> <param-value> 123 </param-value> </ith-param> <Ing-param> <param-name> charset </param-name>
1.2. احصل على معلمات التهيئة من servlet من خلال servletconfig
عندما يكون لدى Servlet معلمات التهيئة التي تم تكوينها ، ستعمل حاوية الويب تلقائيًا على تغليف معلمات التهيئة هذه في كائن ServletConfig عند إنشاء كائن مثيل Servlet ، وتمرير كائن ServletConfig إلى Servlet عند استدعاء طريقة init الخاصة بـ Servlet. علاوة على ذلك ، يمكننا الحصول على معلومات معلمة التهيئة للخدمة الحالية من خلال كائن ServletConfig.
على سبيل المثال:
package gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد java.util.enumeration ؛ استيراد javax.servlet.servletconfig ؛ استيراد javax.servlet.servletexception ؛ javax.servlet.http.httpservlet ؛ import javax.servletrequest ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletresponse ؛ servletconfigdemo1 من الفئة العامة يمتد httpservlet { / *** define servletconfig كائن لتلقي المعلمات التهيئة المكونة* / servletconfig config ؛ /** * عندما تقوم Servlet بتكوين معلمات التهيئة ، عندما تقوم حاوية الويب بإنشاء كائنات مثيل Servlet ، ستعمل * على تغليف معلمات التهيئة هذه تلقائيًا في كائن ServletConfig ، وعندما يتم استدعاء طريقة init الخاصة بـ Servlet ، * تمرير كائن ServletConfig إلى servlet. علاوة على ذلك ، يمكن للمبرمج الحصول على معلومات معلمة التهيئة للخدمة الحالية من خلال كائن ServletConfig. */ Override public void init (servletconfig config) يلقي servleTexception {this.config = config ؛ } rework public void doget (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {// الحصول على سلسلة المعلمة التهيئة paramval تم تكوينها في web.xml = this.config.getInitParameter ("الاسم") استجابة. getWriter (). print ("<hr/>") ؛ // الحصول على جميع معلمات التهيئة التعداد <string> e = config.getInitParameterNames () ؛ بينما (e.hasmoreElements ()) {string name = E.NextElement () ؛ قيمة السلسلة = config.getInitParameter (الاسم) ؛ desponse.getWriter (). print (name + "=" + value + "<br/>") ؛ }} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {this.doget (request ، response) ؛ }}نتائج التشغيل كما يلي:
2. كائن servletContext
عند بدء تشغيل حاوية الويب ، فإنه ينشئ كائن ServletContext المقابل لكل تطبيق ويب ، والذي يمثل تطبيق الويب الحالي.
يحافظ كائن ServletConfig على مرجع إلى كائن ServletContext. عند كتابة servlet ، يمكن للمطورين الحصول على طريقة servletconfig.getServletContext من خلال طريقة servletConfig.getServletContext.
نظرًا لأن جميع servlets في تطبيق الويب تشترك في نفس كائن ServletContext ، يمكن تحقيق الاتصال بين كائنات Servlet من خلال كائنات ServletContext. عادة ما تسمى كائنات ServletContext كائنات مجال السياق.
3. تطبيق ServletContext
3.1. يدرك Servlets متعددة مشاركة البيانات من خلال كائن ServletContext
مثال: تحقق ServletContextDemo1 و ServletContextDemo2
package gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletcontext ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpletrequest ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletresponse ؛ public class servletcontextdemo1 يمتد httpservlet {public void doget (httpservletRequest report ، httpletresponse) "XDP_GACL" ؛ /*** يحافظ كائن ServletConfig على المرجع إلى كائن ServletContext. عندما يكتب المطورون servlets ، يمكن * الحصول على طريقة servletconfig.getServletContext من خلال طريقة servletConfig.getServletContext. */servletContext Context = this.getServletConfig (). getServletContext () ؛ // الحصول على كائن ServletContext. . }} package gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletcontext ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpletrequest ؛ javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletrespons this.getServletContext () ؛ بيانات السلسلة = (سلسلة) context.getAttribute ("البيانات") ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}قم بتشغيل ServletContextDemo1 لأول مرة ، وقم بتخزين بيانات البيانات في كائن ServletContext ، ثم قم بتشغيل ServletContextDemo 2 لاستخراج البيانات من كائن ServletContext ، بحيث يتم تحقيق مشاركة البيانات ، كما هو موضح في الشكل أدناه:
3.2. الحصول على معلمات التهيئة لتطبيق الويب
استخدم علامة <Context-param> في ملف web.xml لتكوين معلمات التهيئة لتطبيق الويب على النحو التالي:
<؟ XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web- تكوين معلمات التهيئة لتطبيق الويب-> <context-param> <Param-Name> url </param-name> <param-value> jdbc: mysql: // localhost: 3306/test </baram-vile> </context-param>
الحصول على معلمات التهيئة لتطبيق الويب ، الرمز هو كما يلي:
package gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletcontext ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpletrequest ؛ javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletrespons this.getServletContext () ؛ // احصل على معلمات التهيئة لسلسلة موقع الويب بأكملها contextinitparam = context.getInitParameter ("url") ؛ استجابة. } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}نتائج التشغيل:
3.3. استخدم ServletContext لتنفيذ إعادة توجيه الطلب
servletContextDemo4
package gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد javax.servlet.requestdispatcher ؛ استيراد javax.servlet.servlettxt ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.htttttp.http.http.htp.htp.htp.htp.htp.htp.htp.htp.htp.htp.htp.htp.hster javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletrequest استجابة) يلقي ServleTexception ، ioException {string data = "<h1> <font color = 'red'> abcdefghjkl </font> </h1>" ؛ استجابة. servletcontext context = this.getServletContext () ؛ // get servletContext Object requestDispatcher rd = context.getRequestDispatcher ("/servlet/servletcontextDemo5") Dopost (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {}} ServletContextDemo5
حزمة gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ServletContextDemo5 يمتد httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {stripte.getOutputStream (). الكتابة ("servletdemo5" .getbytes ()) ؛ } public void dopost (httpservletrequest request ، httpservletponse response) يلقي servletexception ، ioException {this.doget (request ، response) ؛ }}نتائج التشغيل:
الوصول هو servletContextDemo4 ، ولكن المتصفح يعرض محتوى servletContextDemo5. هذا هو استخدام ServletContext لتنفيذ إعادة توجيه الطلب.
3.4. استخدم كائن ServletContext لقراءة ملفات الموارد
هيكل دليل المشروع كما يلي:
مثال رمز: استخدم ServletContext لقراءة ملفات الموارد
package gacl.servlet.study ؛ import java.io.fileinputstream ؛ import java.io.filenotfoundException ؛ import java.io.ioException ؛ import java.io.inputStream ؛ import java.text.messageformat ؛ import java.util.properties ؛ javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpletrequest DOGES (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException { /*** response.setContentType ("text /html ؛ charset = utf-8") ؛ والغرض من ذلك هو التحكم في المتصفح لفك تشفير باستخدام UTF-8 ؛ * بهذه الطريقة ، لن يكون هناك رمز مشتعل صيني */ response.setheader ("نوع المحتوى" ، "text/ html ؛ charset = utf-8") ؛ readsrcdirpropcfgfile (استجابة) ؛ // اقرأ خصائص ملف استجابة ملف الخصائص. readWebRootDirPropCfgfile (استجابة) ؛ // اقرأ ملفات تكوين الخصائص. readWebRootDirPropCfgfile (استجابة) ؛ // اقرأ ملفات تكوين الخصائص. ReadPropCfgfile (استجابة) ؛ // اقرأ ملف تكوين DB3.Properties في حزمة db.config في SRC Directory Response.getWriter (). println ("<hr/>") ؛ ReadPropCfgfile2 (استجابة) ؛ // اقرأ ملف تكوين DB4.Properties في حزمة GACL.Servlet.Study في دليل SRC}/** * اقرأ ملف تكوين DB4.Properties في حزمة GACL.Servlet.Study readPropCfgfile2 (استجابة httpservletresponse) يلقي ioException {inputStream في = this.getServletContext (). Properties Prop = New Properties () ؛ prop.load (in) ؛ سلسلة برنامج التشغيل = prop.getProperty ("برنامج التشغيل") ؛ url url = prop.getProperty ("url") ؛ username string = prop.getProperty ("اسم المستخدم") ؛ سلسلة كلمة مرور = prop.getProperty ("كلمة المرور") ؛ Response.getWriter (). println ("اقرأ ملف تكوين DB4.Properties في حزمة gacl.servlet.study في دليل SRC:") ؛ desponse.getWriter (). println (messageformat.format ("driver = {0} ، url = {1} ، username = {2} ، password = {3}" ، برنامج التشغيل ، url ، اسم المستخدم ، كلمة المرور)) ؛ } /** * اقرأ ملف تكوين db3.properties في حزمة db.config في دليل src * @param response * throws fileNotFoundException * throws ioexception ، private void readPropcfile this.getServletContext (). inputStream في = new FileInputStream (path) ؛ Properties Prop = New Properties () ؛ prop.load (in) ؛ سلسلة برنامج التشغيل = prop.getProperty ("برنامج التشغيل") ؛ url url = prop.getProperty ("url") ؛ username string = prop.getProperty ("اسم المستخدم") ؛ سلسلة كلمة مرور = prop.getProperty ("كلمة المرور") ؛ Response.getWriter (). println ("اقرأ ملف تكوين DB3.Properties في حزمة db.config ضمن دليل SRC:") ؛ desponse.getWriter (). println (messageformat.format ("driver = {0} ، url = {1} ، username = {2} ، password = {3}" ، برنامج التشغيل ، url ، اسم المستخدم ، كلمة المرور)) ؛ } /*** اقرأ ملف تكوين الخصائص في دليل webroot من خلال كائن servletContext* param استجابة* throws ioException* /private void readwebrootdirpropcfile الدليل*/ inputStream في = this.getServletContext (). getResourCeasStream ("/ db2.properties") ؛ Properties Prop = New Properties () ؛ prop.load (in) ؛ سلسلة برنامج التشغيل = prop.getProperty ("برنامج التشغيل") ؛ url url = prop.getProperty ("url") ؛ username string = prop.getProperty ("اسم المستخدم") ؛ سلسلة كلمة مرور = prop.getProperty ("كلمة المرور") ؛ Response.getWriter (). println ("اقرأ ملف تكوين DB2.Properties في دليل webroot:") ؛ desponse.getWriter (). print (messageformat.format ("driver = {0} ، url = {1} ، username = {2} ، password = {3}" ، driver ، url ، username ، password)) ؛ } / *** اقرأ ملف تكوين الخصائص في دليل SRC من خلال كائن ServletContext* @param response* throws ioException* / private void readsrcdirpropcfgfile = this.getServletContext (). getResourCeasStream ("/web-inf/classes/db1.properties") ؛ Properties Prop = New Properties () ؛ prop.load (in) ؛ سلسلة برنامج التشغيل = prop.getProperty ("برنامج التشغيل") ؛ url url = prop.getProperty ("url") ؛ username string = prop.getProperty ("اسم المستخدم") ؛ سلسلة كلمة مرور = prop.getProperty ("كلمة المرور") ؛ Response.getWriter (). println ("اقرأ ملف تكوين db1.properties في دليل SRC:") ؛ desponse.getWriter (). println (messageformat.format ("driver = {0} ، url = {1} ، username = {2} ، password = {3}" ، برنامج التشغيل ، url ، اسم المستخدم ، كلمة المرور)) ؛ } public void dopost (httpservletrequest request ، httpservletponse response) يلقي servletexception ، ioException {this.doget (request ، response) ؛ }}نتائج التشغيل كما يلي:
مثال رمز: قراءة ملفات الموارد باستخدام تحميل الفئة
package gacl.servlet.study ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputstream ؛ استيراد java.text.messageformat javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpletrequest ؛ import javax.servlet.http.htttpletresprons GACL * */Public Class ServletContextDemo7 يمتد httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) رمي servleTexception ، ioException {/** response.setContentType ("text/html ؛ charset = utf-8") ؛ والغرض من ذلك هو التحكم في المستعرض لفك تشفير مع UTF-8 ؛ * هذا لن يتسبب في مشوهة صينية */ reponse.setheader ("نوع المحتوى" ، "النص/ html ؛ charset = utf-8") ؛ Test1 (استجابة) ؛ desponse.getWriter (). println ("<hr/>") ؛ Test2 (استجابة) ؛ desponse.getWriter (). println ("<hr/>") ؛ // test3 () ؛ Test4 () ؛ } /** * قراءة ملفات المورد ضمن classpath * @param response * throws ioException * /private void test1 (httpservletresponse) يلقي ioException {// احصل على محمل الفئة الذي يقوم بتحميل تحميل الفئة الحالي = servletContextDemo7.class.getClassloader () ؛ // استخدم loader الفئة لقراءة ملف تكوين db1.properties في دليل الدليل SRC في = loader.getResourCeasStream ("db1.properties") ؛ Properties Prop = New Properties () ؛ prop.load (in) ؛ سلسلة برنامج التشغيل = prop.getProperty ("برنامج التشغيل") ؛ url url = prop.getProperty ("url") ؛ username string = prop.getProperty ("اسم المستخدم") ؛ سلسلة كلمة مرور = prop.getProperty ("كلمة المرور") ؛ Response.getWriter (). println ("استخدم تحميل الفئة لقراءة ملف تكوين DB1.Properties في دليل SRC:") ؛ desponse.getWriter (). println (messageformat.format ("driver = {0} ، url = {1} ، username = {2} ، password = {3}" ، برنامج التشغيل ، url ، اسم المستخدم ، كلمة المرور)) ؛ } /** * اقرأ ملفات الموارد أسفل مسار الفئة والحزمة * param استجابة * throws ioException * /private void test2 (httpservletresponse stretion) يلقي iOexception {// احصل على محمل الفئة الذي يحمل جهاز تحميل الفئة الحالي = servletContextDemo7.class.getClassloader () ؛ // استخدم loader الفئة لقراءة ملف تكوين DB4.Properties في حزمة GACL.Servlet.Study في دليل الدليل SRC في = loader.getResourCeasStream ("GACL/SERVELT/SERVENT/DB4.PROPERTIES") ؛ Properties Prop = New Properties () ؛ prop.load (in) ؛ سلسلة برنامج التشغيل = prop.getProperty ("برنامج التشغيل") ؛ url url = prop.getProperty ("url") ؛ username string = prop.getProperty ("اسم المستخدم") ؛ سلسلة كلمة مرور = prop.getProperty ("كلمة المرور") ؛ Response.getWriter (). println ("استخدم تحميل الفئة لقراءة ملف تكوين DB4.Properties في حزمة gacl.servlet.study في دليل SRC:") ؛ desponse.getWriter (). println (messageformat.format ("driver = {0} ، url = {1} ، username = {2} ، password = {3}" ، برنامج التشغيل ، url ، اسم المستخدم ، كلمة المرور)) ؛ } / *** ملاحظات حول قراءة ملفات الموارد من خلال تحميل الفئة: إنه غير مناسب لتحميل الملفات الكبيرة ، وإلا فإنه سيؤدي إلى تفوق الذاكرة JVM* / public void test3 () { / *** 01.Avi هو ملف يحتوي على أكثر من 150 M. servletContextDemo7.class.getClassloader (). getResourCeasStream ("01.AVI") ؛ System.out.println (in) ؛ }/*** اقرأ 01.AVI ونسخ إلى e:/root directory* 01.AVI ملف كبير جدًا ، يمكنك فقط استخدام servletContext لقراءة* throws ioException*/public void test4 () rewrows ioexception {// path = g:/java التعلم this.getServletContext (). getRealPath ("/web-inf/classes/01.avi") ؛ /** * path.lastindexof ("//") + 1 هي طريقة رائعة جدًا لكتابته */سلسلة اسم ملف = path.substring (path.lastindexof ("//") + 1) ؛ // الحصول على اسم الملف inputStream in = this.getServletContext (). Byte Buffer [] = New Byte [1024] ؛ int len = 0 ؛ OutputStream Out = newOutputTream ("E: //" + اسم الملف) ؛ بينما ((len = in.read (buffer))> 0) {out.write (buffer ، 0 ، len) ؛ } out.close () ؛ in.close () ؛ } public void dopost (httpservletrequest request ، httpservletponse response) يلقي servletexception ، ioException {this.doget (request ، response) ؛ }}نتائج التشغيل كما يلي:
4. ذاكرة التخزين المؤقت لإخراج servlet على جانب العميل
بالنسبة للبيانات التي لا تتغير بشكل متكرر ، يمكن ضبط قيمة وقت ذاكرة التخزين المؤقت المعقولة في Servlet لتجنب طلبات إرسال المتصفح إلى الخادم بشكل متكرر وتحسين أداء الخادم. على سبيل المثال:
package gacl.servlet.study ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservlest ؛ javax.servlet.http.httpservletresponse ؛ servletdemo5 public class يمتد httpservlet {public void dogge (httpservletRequest request ، httpservletResponse) remrows servlexception ، ioException {string data = "abcddfwesfsaDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF. ] استجابة. } public void dopost (httpservletrequest request ، httpservletponse response) يلقي servletexception ، ioException {this.doget (request ، response) ؛ }}ما سبق هو كل شيء عن هذا المقال ، وآمل أن يكون من المفيد للجميع إتقان تقنية تطوير Javaweb Servlet.