請求響應圖:
一:Servlet簡介與體系結構
Servlet是使用JAVA語言編寫的服務器端程序。Servlet主要運行在服務器端,並由服務器調用。
Servlet是單實例的,所以贏儘量少使用全局變量。
Servlet(接口)<——GenericServlet(抽象類)<——HttpServlet(抽象類)
二:Servlet實現方式:
方式一:實現Servlet接口,覆寫其中的方法
url倆種訪問方式:
第一種:訪問資源:http://localhost/HelloServlet/hello/login.html
第二種:訪問後臺路徑(直接與Servlet關聯)
方式二:繼承GeneriServlet類,覆寫service方法
方式三:繼承HttpServlet類
根據要求可以覆寫doGet(xxx),doPost(xxx),service(xxx),如果覆寫了service(xxx)方法,則執行service(xxx)方法,不執行doGet(xxx)和doPost(xxx)方法。
eg1:
(1)<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登錄頁面</title>
</head>
<body>
<form action="loginURL" method="post">
用戶名:<input type="text" name="username"/> <br/><br/>
密碼:<input type="password" name="pwd"/> <br/><br/>
<input type="submit" value="登錄"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
(2)<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>歡迎頁面</title>
</head>
<body>
<h3>恭喜,登錄成功!</h3>
</body>
</html>
(3)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>失敗頁面</title>
</head>
<body>
<h3>用戶名或密碼錯誤,請重新登錄!</h3>
<a href="http://localhost/HelloWeb/hello/login.html">點擊跳轉</a>
</body>
</html>
(4)package org.afanti.com;
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 LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username=req.getParameter("username");
String pwd=req.getParameter("pwd");
if("lily".equals(username) && "123789".equals(pwd)){
req.getRequestDispatcher("/hello/welcome.html").forward(req,resp);
}else{
req.getRequestDispatcher("/hello/fail.html").forward(req,resp);
}
}
}
(5)<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>HelloWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>org.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/hello/loginURL</url-pattern>
</servlet-mapping>
</web-app>
三:Servlet配置方式
方式一:註解配置 @WebServlet(urlPatterns={“/xxx”})方式二:web.xml(部署描述符)配置
注意:<load-on-startup>屬性的值爲0或正數指 明當容器啓動時就加載該Servlet,值越小,優先級越高;但是loadOnStartup的值爲負數或沒有此屬性時則當請求該Servlet時,才加載該Servlet.
加載(實例化):Servlet容器創建Servlet實例;
初始化:該容器調用init()方法;
服務:如果請求Servlet,則容器調用service()方法;
銷燬:銷燬實例之前調用destroy()方法。
“服務器端跳轉的路徑”可以是絕對路徑也可以是 相對路徑。服務器端如果是絕對路徑,要寫成: /跳轉路徑 ("/"代表的是上下文根目錄後的"/")如果客戶端跳轉的路徑使用的是絕對路徑,要寫成:
/上下文根目錄/跳轉路徑
六:JSP(Java Server Page)
1. JSP:Java服務頁,JSP是一種動態頁面技術。JSP頁面存活於Web容器中。 JSP其實就是在HTML頁面中嵌入Java代碼。 JSP=HTML+Java代碼 2 JSP與Servlet的關係是什麼? Servlet是JSP的前身,本質上是一樣的。 JSP頁面在運行時由Web容器先轉換成Servlet類, 然後編譯,再運行編譯好的.class文件, 最終轉換成HTML代碼發送給客戶端瀏覽器。
在HTML頁面中嵌入Java代碼:
使用Scriptlet代碼 1.<%! Java類、方法、全局變量(或常量) %> 2.<% Java代碼(語句),局部變量 %>
3.<%=變量或常量%> // 輸出內容
<%@page import="java.net.URLDecoder"%> <%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title></title> </head> <body> <% String username=request.getParameter("user"); // 獲取請求參數名爲user的參數值 if("tom".equals(username)){ %> <h3>歡迎Tom,你是我們的VIP用戶!你抓老鼠很厲害~~~</h3> <% }else{ %> <h3>你是<%=username%>,不歡迎!!!</h3> <% } %> </body> </html>
七:JSP四種屬性範圍
(1) page屬性範圍:
使用pageContext內置對象操作,但是習慣上將這種範圍稱爲page範圍。只在一個頁面中保存屬性,跳轉之後無效
(2)request屬性範圍
在一個請求範圍內保存屬性,例如:服務器端跳轉後想要讓屬性保存下來,則可以使用request屬性範圍。
(3)session屬性範圍( Session代表客戶端與服務器端的一次會話,保存於服務器端。)
也就是屬性可以在一個會話範圍內保存,只要是 同一個會話,則無論是客戶端跳轉還是服務端跳轉,都可以保存。
(4) application屬性範圍
將屬性設置到服務器中,這樣,所有會話都可以 訪問該屬性。不宜設置過多,因爲會影響服務器性能。
八:Cookie與Session
注意:. 在客戶端每次向服務器端發送請求時都會將之前設置的Cookie隨着頭信息一起發送到服務器上; Cookie由服務器端生成,但保存於客戶端。
(2)Cookie與Session關係:
在Cookie中保存着一個SessionId(在Tomcat中的這個Cookie名爲JSESSIONID),這樣用戶在每次發出請求時都會將此SessionID發 送到服務器端,服務器端依靠此Cookie中保存着的SessionId來區分每一個不同的客戶端。
eg1:
(1).
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Cookie</title>
</head>
<body>
<%
Cookie cookie=new Cookie("mycookie","Hello,this is my cookie!"); // 生成一個Cookie對象
response.addCookie(cookie); // 將該Cookie發送給客戶端
%>
</body>
</html>
(2).
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.util.Enumeration"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>獲取所有的請求頭信息(request headers)</title>
</head>
<body>
<h3>所有的請求頭信息如下:</h3>
<%
Enumeration<String> enumers=request.getHeaderNames(); // 獲取所有的頭信息名稱
while(enumers.hasMoreElements()){
String headerName=enumers.nextElement(); // 獲取當前的頭信息名稱
String headerValue=request.getHeader(headerName);
out.println("<h4>"+headerName+"=============>"+headerValue+"</h4>"); // 輸出到瀏覽器
}
String sessionId=session.getId();
%>
<h3>當前的SessionId是:<%=sessionId%></h3>
</body>
</html>