介紹
Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作爲來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。使用 Servlet,可以收集來自網頁表單的用戶輸入,呈現來自數據庫或者其他源的記錄,還可以動態創建網頁。
生命週期
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* servlet的生命週期
* 1.web容器實例化servlet
* 2.調用init()方法
* 3.如果發生了請求 會立刻調用service()方法,根據請求的類型分別選擇get或者post方法
* 4.請求結束,相應結束servlet會銷燬 會調用destroy()方法 內存回收
*
* url配置
* 路徑
* 1.全路徑匹配 /MyServlet
* 2.通配符匹配 /xx/*
* 3.擴展名匹配 *.action *.go *.do
*
* servletConfig 代碼我當前這個servlet的一些配置信息(重要)
* 每一個servlet都有他自己獨特的servletConfig
*
*/
@WebServlet(name="MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init正在被調用");
super.init(config);
}
@Override
public void destroy() {
System.out.println("destroy正在被調用");
super.destroy();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//驗證訪問servlet的人的用戶名和密碼
String username = "xiaowang";
String password = "123456";
System.out.println("進入了MyServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
容器
@WebServlet(name = "ContextServlet")
public class ContextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//javaweb中的三種數據範圍 三種容器
//servletContext 上下文容器 web.xml
//request 請求的容器
//session 會話容器
//都有setAttribute(String key,String value);
//都有getAttribute(String key);
//
ServletContext ctx = this.getServletContext();
//當前整個項目所有的數據都共享的容器
//統計在線人數,項目配置的全局數據
HttpSession session = request.getSession();
//一次會話中的數據實現共享 一次會話和業務需要關聯
//用於登錄存儲用戶數據,驗證用戶使用系統的時候有沒有登錄
System.out.println(request);
//一定是一次請求中數據共享
//用於在進入頁面之前先進入後臺,用於轉發
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
獲取請求數據
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
*/
@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class HeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取單個請求頭的信息
String angent = request.getHeader("User-Agent");
//獲取所有請求頭的信息
Enumeration<String> enu = request.getHeaderNames();
while (enu.hasMoreElements()){
String s = enu.nextElement();
String value = request.getHeader(s);
System.out.println(s+":"+value);
}
//通過request獲取請求參數
//1.通過鍵值對獲取單個參數
// a:參數的key要和請求裏面的鍵值對要匹配
// b:後臺使用的key要和前臺表單中的name屬性一一對應
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.通過鍵值對獲取多個相同的參數
//前臺一定一個key對應多個值
//前臺只要擁有同一個key後臺就用這個key去接受,不一定是同一個表單對象
//checkbox hidden帶數組會使用
String[] hoby = request.getParameterValues("hoby");
//3.一次性獲取所有的參數(重點)
Map<String,String[]> map = request.getParameterMap();
UserBean user = new UserBean();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
//System.out.println(Arrays.toString(hoby));
//System.out.println(username + " " + password);
System.out.println("進入了LoginServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
亂碼問題
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* 亂碼產生的原因 前臺 utf-8 後臺 utf-8 tomcat ISO-8859-1
* get請求亂碼
* 1.手動轉碼 先用ISO-8859-1解碼 再用utf-8進行編碼
* 2.修改tomcat的編碼方式 在修改端口的那欄增加屬性配置 URIEncoding="utf-8"
* post請求亂碼(重點)
* 1.手動轉碼 先用ISO-8859-1解碼 再用utf-8進行編碼
* 2.一次性設置請求頭信息中的編碼
*
*
*/
@WebServlet(name = "EncodingServlet",urlPatterns = "/EncodingServlet")
public class EncodingServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//只適用於請求體中的參數設置不適用於請求行
//設置編碼一定要放在第一行
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
//String name = new String(username.getBytes("ISO-8859-1"),"UTF-8");
//String pass = new String(password.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(username+" "+password);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
響應數據
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* 相應response
*
*/
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置狀態碼
//response.setStatus(302);
//設置相應頭
//text/plain 指定輸出的格式爲純文本字符串 text/html指定輸出的格式爲網頁
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
//設置字符集編碼(重點)
//request.setCharacterEncoding("utf-8");
//設置響應體的字符集編碼
response.setContentType("text/html;charset=utf-8");
//重定向
//response.setHeader("Refresh", "3;url=http://www.baidu.com");
//response.sendRedirect("http://www.baidu.com");
//設置相應到頁面的內容
//字符流 用於相應頁面,相應文本
//response.getWriter()
//字節流 用於圖片,音頻,視頻
//response.getOutputStream()
ServletContext ctx = this.getServletContext();
String username = ctx.getInitParameter("username");
System.out.println(username);
response.getWriter().print("<h1>hello world!</h1>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
轉發
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
* 轉發
* 1.可以實現頁面跳轉
* 2.頁面的地址欄不變
* 3.轉發可以轉發其他servlet
* 4.在轉發的過程中,只要你不中斷這個過程中的所有步驟都共享一個request
* (並不是共享同一個變量,共享是同一個容器,數據互通)
*
* 同一個請求中數據傳遞
* request.setAttribute(key,value);
* request.getAttribute(key);
*
*/
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("username",username);
request.setAttribute("password",password);
//轉發,參數是轉發的地址
request.getRequestDispatcher("HeaderServlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
提供下載
/**
* class name:${NAME} <BR>
* class description: TODO <BR>
* Remark: <BR>
*如果通過a標籤下載
* 1.圖片和文件不會下載,而是直接解析
* 2.文件名如果是中文有可能會出現亂碼
* 3.只能下載除了圖片,文本之外的文件(說明書、app等)
*
* @author IGEEK)潘傑
* @version 1.00 2020-04-03 10:17
*/
@WebServlet(name = "FileServlet",urlPatterns = "/FileServlet")
public class FileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通過servlet下載,通過servlet的outputStream進行流的下載
//response.getOutputStream()
//文件下載
/*
* servletContext 上下文容器的配置(web.xml)
* servletConfig 我當前這個servlet的配置
*
* */
ServletContext ctx = this.getServletContext();
String username = ctx.getInitParameter("username");
//System.out.println(username);
//1.獲取項目的發佈的根目錄,爲了獲取文件的路徑
String fileName ="描述.csv";
String path = ctx.getRealPath("/");
System.out.println(path);
File f = new File(path+fileName);
System.out.println(f);
//2.獲取服務器的資源文件的輸入流
FileInputStream fi = new FileInputStream(f);
//3.指定response的輸出類型(默認輸出類型是text/html 網頁)
response.setContentType(ctx.getMimeType(fileName));
//4.設置文件名稱,不支持中文
//解決文件名是中文的問題(可選,可以自定義文件的名稱只要不是中文就可以)
//處理中文文件名亂碼
String header = request.getHeader("User-Agent");
if(header.contains("Firefox")){
//表示當前是火狐
BASE64Encoder base64Encoder = new BASE64Encoder();
fileName = "=?utf-8?B?" + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
}else{
//谷歌
fileName = URLEncoder.encode(fileName,"utf-8");
}
System.out.println(fileName);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
//相應字節流 tomcat會自動調用關閉和刷新方法
ServletOutputStream os = response.getOutputStream();
//5.文件複製,將文件的輸入流寫入到 response的輸出流中去
byte[] arr =new byte[1024];
int len;
while((len=fi.read(arr))!=-1){
os.write(arr, 0, len);
}
fi.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Session與Cookie
@WebServlet(name = "SessionTestServlet",urlPatterns="/SessionTestServlet")
public class SessionTestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//session 服務器存儲數據
//用於服務器各個請求之間的數據共享
//在同一次會話中實現數據的共享
//以前如果沒有session,會新創建session 如果以前創建過,直接返回之前的
HttpSession session = request.getSession();
//以前如果有session 直接獲取session,如果沒有返回null
//HttpSession session = request.getSession(false);
System.out.println(session);
String id = session.getId();
System.out.println(id);
String username = (String)session.getAttribute("username");
System.out.println(username);
//session中實現數據共享
session.setAttribute("username", "xiaowang");
Cookie c = new Cookie("JSESSIONID",id);
c.setMaxAge(20000);
response.addCookie(c);
//session的原理
//session是基於cookie技術
//使session失效的方法
session.invalidate();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//服務器創建cookie
Cookie cookie = new Cookie("username", "admin");
//Cookie默認的失效時間 在你會話關閉的時候
//一個會話 瀏覽器關閉之前 ,同一種瀏覽器
//給cookie設置失效時間
cookie.setMaxAge(0);
//刪除客戶端cookie的辦法
//cookie.setMaxAge(0);
//設置cookie的路徑
//設置成/表示此cookie在任何網站都可以訪問
//cookie.setPath("/");
System.out.println(cookie);
//將cookie交給客戶端
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}