程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> web開發技術中Servlet技術的概述,webservlet

web開發技術中Servlet技術的概述,webservlet

編輯:JAVA綜合教程

web開發技術中Servlet技術的概述,webservlet


1.servlet是什麼:
servlet是一個位於服務器端的java應用程序
它可以像jsp一樣,直接輸出信息

servlet類必須繼承HttpServlet類,否則,不能稱為serlvet

servlet類是一個java類,但是有自己的規則
servlet必須在web.xml文件中注冊
服務器在啟動的時候,可以根據這些配置來加載servlet類.......


2.servlet作用:
C:控制層
serlvet主要用來做控制轉發,需要結合到MVC模式(套路)


3.servlet生命周期:
init
service
destroy

/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
* 在servlet被第一次訪問時,本方法將會被自動調用
* 本方法被稱為初始化方法
* 只會被調用一次
*/
public void init() throws ServletException {
// Put your code here
System.out.println("我是init方法");
}

/**
* 具體的業務方法
* 該方法將會被調用多次
* 每次訪問servlet時,該方法都會被調用
* service根據request.getMethod得到你的提交方式,然後由它來決定對doGet.doPost的調用
*/
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
super.service(request, response);
System.out.println("我是service.....................................");
}

/**
* Destruction of the servlet. <br>
* servlet被注銷的時候
* 本方法為銷毀方法
* 也只是被服務器自動調用一次

*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("destroy方法被調用..............");
}

 

 

4.定義servlet的必需的步驟
A.定義一個類,繼承HttpServlet
B.重寫doGet和doPost方法
C.實現doGet和doPost的邏輯
D.在web.xml部署描述文件中定義servlet的映射方式


5.為web應用設置一個歡迎頁面

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

 

如果第一個頁面找不到,會依次向下找

6.request和其他類的關系

HttpSession session = request.getSession();
session.setAttribute("username", "scott");

ServletContext application = this.getServletContext();
application.setAttribute("userlist", null);

RequestDispatcher rd = request.getRequestDispatcher("C.jsp");
rd.forward(request, response);

 

7,在servlet中使用session

HttpSession ss = request.getSession();
List list=new ArrayList();
list.add("SMITH");
list.add("ALLEN");
ss.setAttribute("userlist", list);

 

 

 

8.關於servlet的使用方式

servlet可以像jsp一樣被訪問
A.在地址欄內可以直接輸入地址來訪問
http://localhost:8088/myproject15/servlet/CServlet


B.超鏈接方式
<a href="servlet/CServlet?username=zhangshan&pwd=123456789">鏈接</a>

C.include或者forward標簽
<jsp:forward page="servlet/CServlet?username=wangwu&pwd=123456"></jsp:forward>


D.javascript轉向
<input type="button" value="點擊"
onclick="location.replace('servlet/CServlet?username=abcd&pwd=123');">

E.response轉向


9,在web服務器中配置errorpage

<error-page>
<error-code>500</error-code>
<location>/index.html</location>
</error-page>

<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/index.html</location>
</error-page>

 


10.關於session-config的配置

<session-config>
<session-timeout>1</session-timeout>
</session-config>

 

超時時間單位為分鐘


11.為servlet定義初始化參數
使用getInitParameter()方法來提取servlet的初始化參數

定義:

<servlet>
<servlet-name>a</servlet-name>
<servlet-class>com.sun.demo.MyServlet</servlet-class>
<init-param>
<param-name>type</param-name>
<param-value>text/html;charset=GBK</param-value>
</init-param>
</servlet>

 


提取方式:
String str = this.getInitParameter("type");

 

12.過濾器:
在到達目標頁面之前,所處理的動作
作用:
權限的校驗
日志記錄
圖片的轉換
數據的加密
等等.

 

實現步驟:
1).實現Filter接口
2).實現doFilter方法
3).傳遞過濾鏈,放請求過去
4).在web.xml文件中注冊過濾器


13.監聽器
靠事件來觸發的,比如application執行了setAttribute();


步驟
兩步:
A.實現listener接口,說出你想要做什麼
B.在web.xml文件中注冊這個監聽器

14.字符集轉換的問題

分幾類情況
A.如果頁面中使用jsp:include或jsp:forward關系,中文字符集轉換:
request.setCharacterEncoding("GBK");

B.在servlet中顯示中文:
由於無法使用jsp頁面中的編碼指令
<%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>

那麼在servlet中設置輸出編碼就應該通過:
response.setContentType("text/html;charset=GBK");


C.普通的參數傳遞
普通的參數也需要考慮到中文的問題
除了頁面顯示設置 contentType="text/html;charset=GBK"之外,我們還需要對中文字符進行字符轉換硬編碼

超鏈接:
String str = request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");


form表單:
String str= request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");

javascript轉向:
String str = request.getParameter("username");
str = new String(str.getBytes("ISO8859-1"),"gbk");


response方式轉向:
String message = "我的中文測試";
response.sendRedirect("L.jsp?message="+URLEncoder.encode(message));

接收頁面:
String message = request.getParameter("message");
message = new String(message.getBytes("ISO8859-1"),"GBK");


request等作用域
request.setAttribute("username","我的測試名稱");
session.setAttribute("passwd","我的密碼");
不需要進行轉換

 


15.編寫線程安全的servlet

java線程共享數據的概念
多線程使用的數據是共享的

boolean shutdown = true;

/**
* 線程體
*/
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (1 == 1) {
i++;
System.out.println(Thread.currentThread().getName()+"="+i);
if (shutdown == false) {
break;
}
}
System.out.println("本線程結束!");
}

 


servlet本身建立在多線程的基礎上,所以對於全局變量也存在"共享數據"的問題.

在servlet中定義一個全局變量,該數據將會被多個線程"共享",

String username;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");
PrintWriter out = response.getWriter();
username = request.getParameter("username");//張三

try {
Thread.sleep(1000*6);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.println(username);
out.close();
}

 


如果同時提交兩個請求:
http://localhost:8088/myproject19/servlet/AServlet?username=zhangshan
http://localhost:8088/myproject19/servlet/AServlet?username=smith
則:
兩個結果都將顯示為smith

這是因為第一個在訪問時,得到了zhangshan的值,後來,username的值被賦為smith
又因為username是被多個線程所共享的,所以,所有請求裡面的username都變成了smith

 

避免使用全局變量
方法中的臨時變量是在棧上分配空間,而且每個線程都有自己私有的棧空間,所以它們不會影響線程的安全

 

16.怎麼樣自動加載servlet
我們知道,servlet有一個生命周期方法,init,service,destroy,其中init在servlet第一次訪問的時候訪問,它只能被訪問一次.
如果你需要在服務器啟動時,讓servlet自動啟動,你可以通過load-on-startup來實現,這一點,我們可以通過init方法被調用來觀察出來

load-on-startup是web.xml文件中servlet的配置節點

描述我們的場景:
假如你有這樣一個需求:
為提高系統性能,在服務器啟動時,從數據庫中查詢所有的用戶名列表,以便在其他頁面中可以直接使用,而不需要從數據庫再進行查詢,如何實現?
A.ServletContextListener可以在服務器啟動時自動執行其方法
B.可以使用一個servlet,然後定義load-on-startup,讓它能夠在服務器啟動時自動執行其方法

使用<load-on-startup>1</load-on-startup>可以指定服務器加載順序


實例代碼:

/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
* 本方法在servlet被加載時訪問
* 這裡,我們在服務器啟動,自動加載一段數據,起到數據緩存的效果
*/
public void init() throws ServletException {
// Put your code here
List<String> list = new ArrayList<String>();
list.add("WARD");
list.add("JONES");
list.add("JAMES");
this.getServletContext().setAttribute("datalist",list);
}

 

配置文件設置:

<servlet>
<servlet-name>DataCacheServlet</servlet-name>
<servlet-class>com.sun.demo.DataCacheServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

 

 

 

 後記:每一天,每一動作,我們所嘗試過經歷過的,都是遼闊夜空裡微微閃爍的星光,即使微茫,

也有人站在某個角落用閃爍的眸光與你輝映!

 

 

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved