一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - javaweb Servlet開發總結(二)

javaweb Servlet開發總結(二)

2020-04-25 15:24孤傲蒼狼 JAVA教程

這篇文章主要為大家詳細介紹了javaweb Servlet開發總結的第二篇,感興趣的小伙伴們可以參考一下

一、ServletConfig講解

1.1、配置Servlet初始化參數

  在Servlet的配置文件web.xml中,可以使用一個或多個<init-param>標簽為servlet配置一些初始化參數。

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
 <servlet-name>ServletConfigDemo1</servlet-name>
 <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class>
 <!--配置ServletConfigDemo1的初始化參數 -->
 <init-param>
  <param-name>name</param-name>
  <param-value>gacl</param-value>
 </init-param>
  <init-param>
  <param-name>password</param-name>
  <param-value>123</param-value>
 </init-param>
 <init-param>
  <param-name>charset</param-name>
  <param-value>UTF-8</param-value>
 </init-param>
</servlet>

1.2、通過ServletConfig獲取Servlet的初始化參數

  當servlet配置了初始化參數后,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,我們通過ServletConfig對象就可以得到當前servlet的初始化參數信息。

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package gacl.servlet.study;
 
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletConfigDemo1 extends HttpServlet {
 
 /**
  * 定義ServletConfig對象來接收配置的初始化參數
  */
 private ServletConfig config;
 
 /**
  * 當servlet配置了初始化參數后,web容器在創建servlet實例對象時,
  * 會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,
  * 將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以
  * 得到當前servlet的初始化參數信息。
  */
 @Override
 public void init(ServletConfig config) throws ServletException {
  this.config = config;
 }
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //獲取在web.xml中配置的初始化參數
  String paramVal = this.config.getInitParameter("name");//獲取指定的初始化參數
  response.getWriter().print(paramVal);
  
  response.getWriter().print("<hr/>");
  //獲取所有的初始化參數
  Enumeration<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(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  this.doGet(request, response);
 }
 
}

運行結果如下:

javaweb Servlet開發總結(二)

二、ServletContext對象

  WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
  ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
  由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之為context域對象。

三、ServletContext的應用

3.1、多個Servlet通過ServletContext對象實現數據共享

范例:ServletContextDemo1和ServletContextDemo2通過ServletContext對象實現數據共享

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package gacl.servlet.study;
 
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletContextDemo1 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String data = "xdp_gacl";
  /**
   * ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,
   * 可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
   */
  ServletContext context = this.getServletConfig().getServletContext();//獲得ServletContext對象
  context.setAttribute("data", data); //將data存儲到ServletContext對象中
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package gacl.servlet.study;
 
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletContextDemo2 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  ServletContext context = this.getServletContext();
  String data = (String) context.getAttribute("data");//從ServletContext對象中取出數據
  response.getWriter().print("data="+data);
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

  先運行ServletContextDemo1,將數據data存儲到ServletContext對象中,然后運行ServletContextDemo2就可以從ServletContext對象中取出數據了,這樣就實現了數據共享,如下圖所示:

javaweb Servlet開發總結(二)

3.2、獲取WEB應用的初始化參數

在web.xml文件中使用<context-param>標簽配置WEB應用的初始化參數,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.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-app_3_0.xsd">
 <display-name></display-name>
 <!-- 配置WEB應用的初始化參數 -->
 <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>

獲取Web應用的初始化參數,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package gacl.servlet.study;
 
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
public class ServletContextDemo3 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
 
  ServletContext context = this.getServletContext();
  //獲取整個web站點的初始化參數
  String contextInitParam = context.getInitParameter("url");
  response.getWriter().print(contextInitParam);
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
 
}

運行結果:

javaweb Servlet開發總結(二)

3.3、用servletContext實現請求轉發

ServletContextDemo4

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package gacl.servlet.study;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletContextDemo4 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String data = "<h1><font color='red'>abcdefghjkl</font></h1>";
  response.getOutputStream().write(data.getBytes());
  ServletContext context = this.getServletContext();//獲取ServletContext對象
  RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");//獲取請求轉發對象(RequestDispatcher)
  rd.forward(request, response);//調用forward方法實現請求轉發
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
 }
}

ServletContextDemo5

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package gacl.servlet.study;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletContextDemo5 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.getOutputStream().write("servletDemo5".getBytes());
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  this.doGet(request, response);
 }
 
}

運行結果:

javaweb Servlet開發總結(二)

訪問的是ServletContextDemo4,瀏覽器顯示的卻是ServletContextDemo5的內容,這就是使用ServletContext實現了請求轉發

3.4、利用ServletContext對象讀取資源文件

項目目錄結構如下:

javaweb Servlet開發總結(二)

代碼范例:使用servletContext讀取資源文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 使用servletContext讀取資源文件
 *
 * @author gacl
 *
 */
public class ServletContextDemo6 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /**
   * response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼;
   * 這樣就不會出現中文亂碼了
   */
  response.setHeader("content-type","text/html;charset=UTF-8");
  readSrcDirPropCfgFile(response);//讀取src目錄下的properties配置文件
  response.getWriter().println("<hr/>");
  readWebRootDirPropCfgFile(response);//讀取WebRoot目錄下的properties配置文件
  response.getWriter().println("<hr/>");
  readPropCfgFile(response);//讀取src目錄下的db.config包中的db3.properties配置文件
  response.getWriter().println("<hr/>");
  readPropCfgFile2(response);//讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件
  
 }
 
 /**
  * 讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件
  * @param response
  * @throws IOException
  */
 private void readPropCfgFile2(HttpServletResponse response)
   throws IOException {
  InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/gacl/servlet/study/db4.properties");
  Properties prop = new Properties();
  prop.load(in);
  String driver = prop.getProperty("driver");
  String url = prop.getProperty("url");
  String username = prop.getProperty("username");
  String password = prop.getProperty("password");
  response.getWriter().println("讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件:");
  response.getWriter().println(
    MessageFormat.format(
      "driver={0},url={1},username={2},password={3}",
      driver,url, username, password));
 }
 
 /**
  * 讀取src目錄下的db.config包中的db3.properties配置文件
  * @param response
  * @throws FileNotFoundException
  * @throws IOException
  */
 private void readPropCfgFile(HttpServletResponse response)
   throws FileNotFoundException, IOException {
  //通過ServletContext獲取web資源的絕對路徑
  String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.properties");
  InputStream in = new FileInputStream(path);
  Properties prop = new Properties();
  prop.load(in);
  String driver = prop.getProperty("driver");
  String url = prop.getProperty("url");
  String username = prop.getProperty("username");
  String password = prop.getProperty("password");
  response.getWriter().println("讀取src目錄下的db.config包中的db3.properties配置文件:");
  response.getWriter().println(
    MessageFormat.format(
      "driver={0},url={1},username={2},password={3}",
      driver,url, username, password));
 }
 
 /**
  * 通過ServletContext對象讀取WebRoot目錄下的properties配置文件
  * @param response
  * @throws IOException
  */
 private void readWebRootDirPropCfgFile(HttpServletResponse response)
   throws IOException {
  /**
   * 通過ServletContext對象讀取WebRoot目錄下的properties配置文件
   * “/”代表的是項目根目錄
   */
  InputStream in = this.getServletContext().getResourceAsStream("/db2.properties");
  Properties prop = new Properties();
  prop.load(in);
  String driver = prop.getProperty("driver");
  String url = prop.getProperty("url");
  String username = prop.getProperty("username");
  String password = prop.getProperty("password");
  response.getWriter().println("讀取WebRoot目錄下的db2.properties配置文件:");
  response.getWriter().print(
    MessageFormat.format(
      "driver={0},url={1},username={2},password={3}",
      driver,url, username, password));
 }
 
 /**
  * 通過ServletContext對象讀取src目錄下的properties配置文件
  * @param response
  * @throws IOException
  */
 private void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException {
  /**
   * 通過ServletContext對象讀取src目錄下的db1.properties配置文件
   */
  InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
  Properties prop = new Properties();
  prop.load(in);
  String driver = prop.getProperty("driver");
  String url = prop.getProperty("url");
  String username = prop.getProperty("username");
  String password = prop.getProperty("password");
  response.getWriter().println("讀取src目錄下的db1.properties配置文件:");
  response.getWriter().println(
    MessageFormat.format(
      "driver={0},url={1},username={2},password={3}",
      driver,url, username, password));
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  this.doGet(request, response);
 }
 
}

運行結果如下:

javaweb Servlet開發總結(二)

代碼范例:使用類裝載器讀取資源文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package gacl.servlet.study;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.Properties;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 用類裝載器讀取資源文件
 * 通過類裝載器讀取資源文件的注意事項:不適合裝載大文件,否則會導致jvm內存溢出
 * @author gacl
 *
 */
public class ServletContextDemo7 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /**
   * response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼;
   * 這樣就不會出現中文亂碼了
   */
  response.setHeader("content-type","text/html;charset=UTF-8");
  test1(response);
  response.getWriter().println("<hr/>");
  test2(response);
  response.getWriter().println("<hr/>");
  //test3();
  test4();
  
 }
 
 /**
  * 讀取類路徑下的資源文件
  * @param response
  * @throws IOException
  */
 private void test1(HttpServletResponse response) throws IOException {
  //獲取到裝載當前類的類裝載器
  ClassLoader loader = ServletContextDemo7.class.getClassLoader();
  //用類裝載器讀取src目錄下的db1.properties配置文件
  InputStream in = loader.getResourceAsStream("db1.properties");
  Properties prop = new Properties();
  prop.load(in);
  String driver = prop.getProperty("driver");
  String url = prop.getProperty("url");
  String username = prop.getProperty("username");
  String password = prop.getProperty("password");
  response.getWriter().println("用類裝載器讀取src目錄下的db1.properties配置文件:");
  response.getWriter().println(
    MessageFormat.format(
      "driver={0},url={1},username={2},password={3}",
      driver,url, username, password));
 }
 
 /**
  * 讀取類路徑下面、包下面的資源文件
  * @param response
  * @throws IOException
  */
 private void test2(HttpServletResponse response) throws IOException {
  //獲取到裝載當前類的類裝載器
  ClassLoader loader = ServletContextDemo7.class.getClassLoader();
  //用類裝載器讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件
  InputStream in = loader.getResourceAsStream("gacl/servlet/study/db4.properties");
  Properties prop = new Properties();
  prop.load(in);
  String driver = prop.getProperty("driver");
  String url = prop.getProperty("url");
  String username = prop.getProperty("username");
  String password = prop.getProperty("password");
  response.getWriter().println("用類裝載器讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件:");
  response.getWriter().println(
    MessageFormat.format(
      "driver={0},url={1},username={2},password={3}",
      driver,url, username, password));
 }
 
 /**
  * 通過類裝載器讀取資源文件的注意事項:不適合裝載大文件,否則會導致jvm內存溢出
  */
 public void test3() {
  /**
   * 01.avi是一個150多M的文件,使用類加載器去讀取這個大文件時會導致內存溢出:
   * java.lang.OutOfMemoryError: Java heap space
   */
  InputStream in = ServletContextDemo7.class.getClassLoader().getResourceAsStream("01.avi");
  System.out.println(in);
 }
 
 /**
  * 讀取01.avi,并拷貝到e:\根目錄下
  * 01.avi文件太大,只能用servletContext去讀取
  * @throws IOException
  */
 public void test4() throws IOException {
  // path=G:\Java學習視頻\JavaWeb學習視頻\JavaWeb\day05視頻\01.avi
  // path=01.avi
  String path = 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/classes/01.avi");
  byte buffer[] = new byte[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 request, HttpServletResponse response)
   throws ServletException, IOException {
 
  this.doGet(request, response);
 }
 
}

運行結果如下:

javaweb Servlet開發總結(二)

四、在客戶端緩存Servlet的輸出

對于不經常變化的數據,在servlet中可以為其設置合理的緩存時間值,以避免瀏覽器頻繁向服務器發送請求,提升服務器的性能。例如:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package gacl.servlet.study;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletDemo5 extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String data = "abcddfwerwesfasfsadf";
  /**
   * 設置數據合理的緩存時間值,以避免瀏覽器頻繁向服務器發送請求,提升服務器的性能
   * 這里是將數據的緩存時間設置為1天
   */
  response.setDateHeader("expires",System.currentTimeMillis() + 24 * 3600 * 1000);
  response.getOutputStream().write(data.getBytes());
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
 
  this.doGet(request, response);
 }
 
}

javaweb Servlet開發總結(二)

以上就是本文的全部內容,希望對大家掌握javaweb Servlet開發技術有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女禁区视频无遮挡免费看 | 国产精品欧美亚洲韩国日本 | 美女扒开腿让男人桶爽动态图片 | 国产成人在线视频播放 | 91麻豆国产福利精品 | 国产精品视频第一区二区三区 | 免费观看成年人视频 | 国产精品久久久久a影院 | 午夜宅男影院 | 日本中文字幕黑人借宿影片 | www久久久| 国产色综合久久五月色婷婷中文 | 男人晚上适合偷偷看的污污 | 国产一区视频在线免费观看 | 大伊香蕉在线精品不卡视频 | 无码AV毛片色欲欧洲美洲 | 人人爱天天做夜夜爽88 | 2019aw网站 | 母乳在线播放 | 精品湿 | 青草草视频在线观看 | 国产精品边做边接电话在线观看 | 亚洲国产日韩欧美在线vip1区 | a级黄色网| 拔插拔插8x8x海外华人免费视频 | 精品国产品国语在线不卡丶 | 九九精品视频在线观看 | 亚洲女bbwxxxx另类 | 亚洲精品日韩专区在线观看 | 1024人成网站色 | 日韩在线a视频免费播放 | 日日插插 | 7777奇米四色| 99视频一区 | 肉肉小说在线阅读 | 日本高清中文字幕视频在线 | 九九热在线观看视频 | 无颜之月全集免费观看 | 亚洲精品无码久久不卡 | 免费日本在线 | 久久一本综合 |