1. Объяснение ServletConfig
1.1. Настройка параметров инициализации сервлета
В файле конфигурации сервлета web.xml вы можете использовать один или несколько тегов <init-param> для настройки некоторых параметров инициализации для сервлета.
Например:
<servlet> <servlet-name>ServletConfigDemo1</servlet-name> <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class> <!--Configure the initialization parameters of ServletConfigDemo1 --> <init-param> <param-name>name</param-name> <param-value>gacl</param-value> </init-param> <init-param> <param-name> пароль </param-name> <param-value> 123 </param-value> </init-param> <initparam> <param-name> charset </param-name> <param-value> utf-8 </param-value> </init-param> </servlet>
1.2. Получить параметры инициализации сервлета через ServletConfig
Когда сервг настроил параметры инициализации, веб -контейнер автоматически инкапсуляет эти параметры инициализации в объект ServletConfig при создании объекта экземпляра сервлета, и передавать объект ServletConfig в сервенс при вызове метода инициирования сервлета. Кроме того, мы можем получить информацию о параметре инициализации текущего сервлета через объект ServletConfig.
Например:
Package gacl.servlet.study; импорт java.io.ioexception; import java.util.enumeration; импорт javax.servlet.servletconfig; импорт javax.servlet.servletexception; import javax.servlet.http.httpservelt; import.servlet.httpsps. javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletresponse; открытый класс ServletConfigdemo1 Extends httpservlet { / *** define servletConfig объект получения конфигурированных параметров инициализации* / private servletConfig config; /** * Когда сервг настраивает параметры инициализации, когда веб -контейнер создает объекты экземпляра сервлета, * автоматически инкапсуляет эти параметры инициализации в объект ServletConfig, и когда вызван метод инициирования сервлета, * передайте объект ServletConfig в сервенс. Кроме того, программист может получить информацию о параметре инициализации текущего сервлета через объект ServletConfig. */ @Override public void init (конфигурация ServletConfig) Throws ServletException {this.config = config; } public void doget (httpservletrequest, httpservletresponse response), бросает ServletException, ioException {// Получить параметр параметра инициализации, настроенный в web.xml = this.config.getinitParameter («имя»); // Получить указанный параметров инициализации. GetWerwriter (). Paramval); response.getWriter (). print ("<hr/>"); // Получить все параметры инициализации перечисление <string> e = config.getInitParameterNames (); while (e.hasmoreelements ()) {string name = e.nextelement (); String value = config.getinitParameter (name); response.getWriter (). print (name + "=" + value + "<br/>"); }} public void dopost (httpservlectrequest, httpservletresponse response) throws servletexception, ioexception {this.doget (запрос, ответ); }}Результаты работы следующие:
2. Объект ServletContext
Когда веб -контейнер запускается, он создает соответствующий объект ServletContext для каждого веб -приложения, который представляет текущее веб -приложение.
Объект ServletConfig поддерживает ссылку на объект ServletContext. При написании сервлета разработчики могут получить метод ServletConfig.getServletContext с помощью метода ServletConfig.getServletContext.
Поскольку все сервлеты в веб -приложении имеют один и тот же объект ServletContext, связь между объектами сервлета может быть достигнута с помощью объектов ServletContext. Объекты ServletContext обычно также называются объектами домена контекста.
3. Применение ServletContext
3.1. Несколько сервлетов реализуют обмен данными через объект ServletContext
Пример: ServletContextDemo1 и ServletContextDemo2 реализуйте обмен данными через объект ServletContext
пакет gacl.servlet.study; import java.io.ioexception; import javax.servlet.servletcontext; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; открытый класс ServletContextDemo1 Extends httpservlet {public void Doget (httpservletrequest, httpservesceponse response). "xdp_gacl"; /*** Объект ServletConfig поддерживает ссылку на объект ServletContext. Когда разработчики пишут сервлеты, * может получить метод ServletConfig.getServletContext с помощью метода ServletConfig.getServletContext. */ServletContext context = this.getServletConfig (). GetServletContext (); // Получить объект CENTESTER SERVLETONTEXT.SETATTRIBUTE ("DATA", DATA); // Сохранить данные в объект ServletContext} public void Dopost (httpservlectrequest, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }} пакет gacl.servlet.study; import java.io.ioexception; import javax.servlet.servletcontext; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; открытый класс ServletContextDemo2 Extends httpservlet {public void Doget (httpservletrequest, httpservescepons this.getServletContext (); String data = (string) context.getAttribute ("data"); // Извлекать данные из ответа объекта ServletContext.getWriter (). Print ("data ="+data); } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }}Сначала запустите ServletContextDemo1, сохраните данные данных в объекте ServletContext, а затем запустите ServletContextDemo2 для извлечения данных из объекта ServletContext, чтобы обмен данными реализован, как показано на рисунке ниже:
3.2. Получить параметры инициализации веб -приложения
Используйте тег <context-param> в файле web.xml, чтобы настроить параметры инициализации веб-приложения следующим образом:
<? xml version = "1.0" Encoding = "utf-8"?> <web-app arser = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema electsmance "/www.w3. xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xcsd"/xml/ns/javaee/web-app_3_0.x.xunmal> </javaee/web-app_3_0. Configure initialization parameters of WEB application --> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/test</param-value> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
Получите параметры инициализации веб -приложения, код заключается в следующем:
пакет gacl.servlet.study; import java.io.ioexception; import javax.servlet.servletcontext; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletresponse; открытый класс ServletContextDemo3 Extends httpservlet {public void Doget (httpservletrequest, httpservesceson this.getServletContext (); // Получить параметры инициализации всего строки веб -сайта contextInitParam = context.getInitParameter ("url"); response.getWriter (). print (contextInitParam); } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }}Результаты работы:
3.3. Используйте ServletContext для реализации пересылки запросов
ServletContextDemo4
Package gacl.servlet.study; импорт java.io.ioexception; import java.io.printwriter; import javax.servlet.requestdispatcher; импорт javax.servlet.servletcontext; import javax.servlet.servlet.servletexception; importcervlet.httple.https.hervlet.servletexception; import.servlet.httplet.hervlet. javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletrespons Ответ) Throws ServletException, ioException {string data = "<h1> <font color = 'red'> abcdefghjkl </font> </h1>"; response.getOutputStream (). write (data.getbytes ()); Context vervletContext = this.getServletContext (); // get servletContext ObjectDispatcher rd = context.getRequestDispatcher ("/servlet/servletcontextDemo5"); // gate request proquaring obj Httpservletresponse response) Throws ServletException, ioException {}} ServletContextDemo5
Пакет gacl.servlet.study; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservlectrequest; import javax.servlet.httpsevonses. Extends httpservlet {public void doget (httpservletrequest, httpservletresponse response) throws ServletException, ioException {response.getOutputStream (). write ("ServletDemo5" .getBytes ()); } public void Dopost (httpservletRequest, httpservletresponse response) throws servletexception, ioexception {this.doget (запрос, ответ); }}Результаты работы:
Доступ ServletContextDemo4, но браузер отображает содержимое ServletContextDemo5. Это использование ServletContext для реализации пересылки запросов.
3.4. Используйте объект ServletContext для чтения файлов ресурсов
Структура каталога проектов заключается в следующем:
Пример кода: используйте ServletContext для чтения файлов ресурсов
пакет gacl.servlet.study; import java.io.fileinputstream; импорт java.io.filenotfoundexception; import java.io.ioexception; импорт java.io.inputStream; импорт java.text.messageformat; импорт java.util.properties; import javax.servlet.sersersex; javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletrespons Doget (httpservlectrequest-запрос, httpservletresponse response) throws servletexception, ioexception { /*** response.setContentType ("text /html; charset = utf-8"); Цель состоит в том, чтобы управлять браузером для декодирования с помощью UTF-8; * Таким образом, не будет китайского искаженного кода */ response.setheader ("контент-тип", "Text/ html; charset = utf-8"); readsrcdirpropcfgfile (response); // Читать ответ на конфигурацию. readwebrootdirpropcfgfile (response); // Читать ответ на конфигурацию. readwebrootdirpropcfgfile (response); // Читать ответ на конфигурацию. readpropcfgfile (response); // Читать файл конфигурации DB3. readpropcfgfile2 (response); // Читать файл конфигурации DB4. readpropcfgfile2 (httpservletresponse response) Throws ioException {inputStream in = this.getServletContext (). getResourCeasStream ("/web-inf/classe/gacl/servlet/stecking/db4.properties"); Свойства prop = новые свойства (); prop.load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("имя пользователя"); String password = prop.getProperty ("пароль"); response.getWriter (). response.getWriter (). } /** * Прочтите файл конфигурации db3.properties в пакете db.config в каталоге src * @param response * @throhs filenotfoundexception * @throws ioexception * /private void readpropcfle (httpservlectrespons this.getServletContext (). getRealPath ("/web-inf/classes/db/config/db3.properties"); InputStream in = new FileInputStream (path); Свойства prop = новые свойства (); prop.load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("имя пользователя"); String password = prop.getProperty ("пароль"); response.getWriter (). println («Прочитайте файл конфигурации DB3. response.getWriter (). } /*** Прочтите файл конфигурации свойств в каталоге WebRoot через объект ServletContext* @param response* @throws ioexception* /private void readwebrootdirpropcfgfile (httpservletresponse) каталог*/ inputStream in = this.getServletContext (). getResourCeasStream ("/ db2.properties"); Свойства prop = новые свойства (); prop.load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("имя пользователя"); String password = prop.getProperty ("пароль"); response.getWriter (). Println («Прочитайте файл конфигурации DB2. response.getWriter (). print (messageformat.format ("Driver = {0}, url = {1}, username = {2}, password = {3}", драйвер, URL, имя пользователя, пароль)); } / *** Прочтите файл конфигурации свойств в каталоге SRC через объект ServletContext* @param response* @throws ioexception* / private void redateRsrcdirpropcfgfile (httpservletrespons this.getServletContext (). getResourCeasStream ("/web-inf/classes/db1.properties"); Свойства prop = новые свойства (); prop.load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("имя пользователя"); String password = prop.getProperty ("пароль"); response.getWriter (). response.getWriter (). } public void Dopost (httpservletRequest, httpservletresponse response) throws servletexception, ioexception {this.doget (запрос, ответ); }}Результаты работы следующие:
Пример кода: прочитать файлы ресурсов с использованием загрузчика класса
пакет gacl.servlet.study; import java.io.fileoutputstream; импорт java.io.ioexception; import java.io.inputstream; импорт java.io.outputstream; импорт java.text.messageformat; импорт java.util.properties; import javax.servlet.servletex; javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse;/*** gacl * */public class servletcontextdemo7 extends httpservlet {public void doget (httpservlectrequest, httpservletresponse response) Throws ServletException, ioException {/** * response.setContentType ("text/html; charsection = utf -8"); Цель состоит в том, чтобы управлять браузером, чтобы декодировать с помощью UTF-8; * Это не приведет к тому, что китайский искажен */ response.setheader ("контент-тип", "text/ html; charset = utf-8"); test1 (ответ); response.getWriter (). println ("<hr/>"); test2 (ответ); response.getWriter (). println ("<hr/>"); // test3 (); test4 (); } /** * Читать файлы ресурсов в рамках ClassPath * @param response * @throws ioexception * /private void test1 (httpservletresponse response) Throws ioException {// Получить загрузчик класса, который загружает текущий класс ClassLoader Loader = ServletContextDemo7.class.getClassloader (); // Использование загрузчика класса для чтения файла конфигурации DB1.Properties в SRC Directory InputStream in = Loader.GetResourCeasStream ("db1.properties"); Свойства prop = новые свойства (); prop.load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("имя пользователя"); String password = prop.getProperty ("пароль"); response.getWriter (). response.getWriter (). } /** * Читать файлы ресурсов ниже пути и пакета класса * @param response * @throhs ioexception * /private void test2 (httpservletresponse response) throws ioexception {// Получить загрузчик класса, который загружает текущий класс Classloader Loader = ServletContextDemo7.class.getClassloader ();); // Использование загрузчика класса для чтения файла конфигурации DB4. Свойства prop = новые свойства (); prop.load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("имя пользователя"); String password = prop.getProperty ("пароль"); response.getWriter (). response.getWriter (). } / *** Примечания по чтению файлов ресурсов через загрузчик класса: он не подходит для загрузки больших файлов, в противном случае это приведет к переполнению памяти JVM* / public void test3 () { / *** 01.avi - это файл с более чем 150 м. ServletContextDemo7.class.getClassLoader (). GetResourCeasStream ("01.avi"); System.out.println (in); }/*** Читать 01.avi и копировать в каталог e:/root* 01.avi Файл слишком большой, вы можете использовать только ServletContext для чтения* @Throws ioException*/public void test4 () Throws ioException {// path = g:/java Learning Video/javaweb Learn this.getServletContext (). getRealPath ("/web-inf/classes/01.avi"); /** * path.lastindexof ("//") + 1-очень замечательный способ написать его */string filename = path.substring (path.lastindexof ("//") + 1); // Получить имя файла inputstream in = this.getServletContext (). getResourceasStream ("/web-inf/01.avi"); байтовый буфер [] = новый байт [1024]; int len = 0; OutputStream out = new FileOutputStream ("e: //" + filename); while ((len = in.read (buffer))> 0) {out.write (buffer, 0, len); } out.close (); in.close (); } public void Dopost (httpservletRequest, httpservletresponse response) throws servletexception, ioexception {this.doget (запрос, ответ); }}Результаты работы следующие:
4. Кэшируйте вывод сервлета на стороне клиента
Для данных, которые не часто меняются, в сервиле может быть установлено разумное значение времени кэша, чтобы часто избежать отправки запросов на сервер и повышения производительности сервера. Например:
Package gacl.servlet.study; импорт java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservlectrequest; import javax.servlet.http.htptRequestRequest; javax.servlet.http.httpservletresponse; public class servletdemo5 расширяет httpservlet {public void doget (httpservletrequest запрос, httpservletresponse response) throws servletexception, ioexception {String Data = "abcddfwerwesfasfsAdf, ioException {String Data =" abcddfwerwesfsfsAdf "; / *** Установите разумное значение времени кэша данных, чтобы избежать частых запросов из браузера, чтобы улучшить производительность сервера* Здесь нужно установить время кэша данных на 1 день*/ response.setDateHeader («истекает», System.CurrentTimeMillis () + 24* 3600* 1000); response.getOutputStream (). write (data.getbytes ()); } public void Dopost (httpservletRequest, httpservletresponse response) throws servletexception, ioexception {this.doget (запрос, ответ); }}Вышеуказанное посвящено этой статье, и я надеюсь, что для каждого будет полезно овладеть технологией разработки сервлетов Javaweb.