zzj
用戶端發給伺服器的叫請求協定,伺服器發送給用戶端的叫響應協定
http://12.0.0.1:8080/s01/ser01?name=zs
上面格式的名稱分別爲:http協定,伺服器ip,伺服器埠號,專案路徑,資源路徑,要傳入的屬性值。
請求由三部分組成:請求行、請求頭、請求正文。
響應由三部分組成:狀態行、響應頭、響應正文。
請求頭
響應頭
Tomcat的埠是可以更改的,在Tomcat安裝目錄下的conf資料夾中找到server.xml檔案,預設是8080。
@WebServlet("/ser02")
public class Servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("你好。。。");
}
}
**作用:**接受用戶端發送過來的請求資訊。
它是ServletRequest的子介面
方法:request.getParameter(「名稱」);
//通過表單進行提交
String name = request.getParameter("userName");
System.out.println(name);
System.out.println(request.getParameter("userPwd"));
//解決請求亂碼問題
request.setCharacterEncoding("UTF-8");
//同時設定伺服器端與用戶端的編碼格式
response.setContentType("text/html;charset=UTF-8");
是伺服器端跳轉,位址列不發生改變,只有一次請求,request作用域數據可以共用,請求轉發只能轉發到當前專案下的資源。
// 請求轉發到頁面
req.getRequestDispatcher("login.jsp").forward(req,resp);
// 請求到相同項目下的Servlet
req.getRequestDispatcher("ser07").forward(req,resp);
在同一次請求中有效,只能request使用。
//設定域物件內容
request.setAttribute("msg","使用者名稱不能爲空");
//獲取域物件內容
request.getAttribute("msg");
//刪除域物件
request.removeAttribute("msg");
作用:伺服器端向用戶端輸出數據。
方法:getWriter():字元流,只能響應回字元
getOutputStream():位元組流,能響應回一切數據
注意:兩個不能同時使用;
使用字元流往用戶端輸出中文的時候會出現亂碼情況,這個時候就要手動設定編碼格式: response.setContentType(「text/html;charset=UTF-8」);
//同時設定伺服器端與用戶端的編碼格式
resp.setContentType("text/html;charset=UTF-8");
//字元輸出流
PrintWriter writer=resp.getWriter();
writer.write("<h2>Hello 中國</h2>");
writer.flush();
writer.close();
//直接輸出流
/*ServletOutputStream out=resp.getOutputStream();
out.write("<h2>Hello 中國</h2>".getBytes());
out.flush();
out.close();*/
直接使用:response.setContentType(「text/html;charset=UTF-8」);可以同時解決請求亂碼和響應亂碼問題。
伺服器端指導,用戶端跳轉行爲;位址列發生改變,存在兩次請求,request作用域不共用。
// 重定向到頁面
resp.sendRedirect("login.jsp");
// 請求到相同項目下的Servlet
resp.sendRedirect("ser07");
//重定向可以跳轉到百度
resp.sendRedirect("http://www.baidu.com");
請求轉發 | 重定向 |
---|---|
伺服器端跳轉 | 伺服器端指導用戶端跳轉 |
請求一次 | 請求兩次 |
位址列不變 | 位址列改變 |
共用request作用域 | 不共用request作用域 |
只能轉發到同一專案下的資源 | 可以重定向到任意地方 |
cookie是由伺服器端建立,儲存在用戶端的,是瀏覽器技術,比如說記住密碼等。預設情況下關閉瀏覽器則cookie被銷燬。
在伺服器端建立,建立好之後發送給用戶端。
Cookie cookie=new Cookie("uName","zhangsan");
responce.addCookie(cookie);
Cookie cookie2=new Cookie("uPwd","123456");
responce.addCookie(cookie2);
通過遍歷用戶端回傳的cookie陣列實現。
//獲取cookie陣列
Cookie[] cookies = request.getCookies();
// 判斷陣列是否爲空
if (cookies != null && cookies.length > 0) {
// 遍歷cookie陣列並輸出
for (Cookie cookie : cookies){
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
正整數
表示存放在本地磁碟當中,存活指定秒數。
負整數
表示只在瀏覽器中存活,關閉瀏覽器失效。
零
表示刪除cookie。
Cookie cookie=new Cookie("aa","AA");
//cookie.setMaxAge(-1);
cookie.setMaxAge(20);
resp.addCookie(cookie);
//設定七天失效
Cookie cookie1 = new Cookie("name", "張三");
cookie1.setMaxAge(7*24*60*60);
resp.addCookie(cookie1);
情況一:在當前專案中的資源可以存取(預設)
Cookie cookie1 = new Cookie("a1","A1");
cookie1.setPath("/s03"); //可以不設定,預設
resp.addCookie(cookie1);
情況二:在指定專案中的資源可以存取 (只能在專案名是/s04的專案下的資源能存取)
Cookie cookie2 = new Cookie("a2","A2");
cookie2.setPath("/s04");
resp.addCookie(cookie2);
情況三:在當前伺服器中任意資源都可存取 (只要是放在同一伺服器下的資源)
Cookie cookie3 = new Cookie("a3","A3");
cookie3.setPath("/");
resp.addCookie(cookie3);
情況四:在指定專案下的指定資源可以存取
Cookie cookie4 = new Cookie("a4","A4");
cookie4.setPath("/s04/cook02");
resp.addCookie(cookie4);
注意:若存取的路徑包含了其它cookie的路徑的時候,這個時候就會同時獲取兩個cookie,例如:路徑爲"/s04/cook02"的cookie可以包含路徑爲"/s04"的cookie。
cookie儲存在當前瀏覽器中。不能跨瀏覽器,不能跨電腦。
cookie存在中文問題。若cookie中存在中文不解碼的話會出現亂碼問題。(不過這種方式已經過期了,一般不會存在這種情況,使用者名稱或密碼之類的一般都不會爲中文)
建立cookie時,要編碼:
String name="姓名";
String value="張三";
name = URLEncoder.encode(name);
value = URLEncoder.encode(value);
Cookie cookie=new Cookie(name,value);
resp.addCookie(cookie);
獲取cookie時要解碼:
Cookie[] cookies = req.getCookies();
if(cookies!=null && cookies.length>0){
for (Cookie cookie:cookies){
String name = URLDecoder.decode(cookie.getName());
String value = URLDecoder.decode(cookie.getValue());
System.out.println("鍵:" + name + ",值:" + value);
}
}
cookie同名問題。新的cookie會覆蓋原有的cookie。
瀏覽器中存放cookie是有一定上限的。
HttpSession是一個純粹的介面,不存在父介面,它的底層是cookie,使用request.getSession();方法獲取當前對談的session物件。
//若session物件存在,則獲取;session物件不存在,則建立
HttpSession session=request.getSession();
開啓了對談,用戶端就會建立一個JSESSIONID,並將它回傳給伺服器端。
在一次對談中數據是可以共用的,使用請求轉發或者重定向都可以共用session域物件。可以有多次請求。
HttpSession session = req.getSession();
session.setAttribute("uName","admin");
//請求轉發
//req.getRequestDispatcher("sess03").forward(req,resp);
//重定向
resp.sendRedirect("sess03");
String uName =(String) req.getSession().getAttribute("uName");
System.out.println("Session:"+uName);
預設到期時間(預設最大不活動時間)
Tomcat中預設是30分鐘失效,
可以在Tomcat的解壓目錄conf目錄下,對應的web.xml中修改 ,單位是分鐘。
手動設定最大不活動時間(單位:秒)
獲取最大不活動時間 session.getMaxInactiveInterval();
設定最大不不活動時間 session.setMaxInactiveInterval(秒數);
手動銷燬
session.invalidate();
關閉瀏覽器
session底層依賴cookie,cookie預設關閉瀏覽器失效
關閉伺服器
HttpSession session = req.getSession();
int sec = session.getMaxInactiveInterval();
System.out.println("最大不活動時間:" + sec);
session.setMaxInactiveInterval(15);
session.invalidate();
**注:**當過了15秒沒有操作時,伺服器便會建立一個新的jsessionid,並將這個迴應給瀏覽器。
它又稱爲Application物件,當web容器啓動時就會建立這個物件。
通過request物件獲取
ServletContext servletContext = request.getServletContext();
通過session物件獲取
ServletContext servletContext = request.getSession().getServletContext();
通過servletConfig物件獲取
ServletContext servletContext2 = getServletConfig().getServletContext();
直接獲取
ServletContext servletContext3 = getServletContext();
System.out.println("獲取伺服器的資訊: " + servletContext.getServerInfo());
System.out.println("獲取專案的真實路徑: " + servletContext.getRealPath("/"));
只要伺服器不關閉,則該域中的數據一直共用。
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("name","zhangsan");
String name = (String) servletContext.getAttribute("name");
servletContext.removeAttribute("name");
page域物件
pageContext:只在同一個頁面有效 。
request域物件
在一次請求中有效。請求轉發有效,重定向無效。
session域物件
在一次對談中有效。請求轉發和重定向都有效,session銷燬後無效。
ServletContext域物件
application在整個程式中有效。關閉伺服器之後無效。
表單的提交方式一定要爲post,還要設定enctype=「multipart/form-data」。
<form method="post" action="uploadServlet" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br>
檔案:<input type="file" name="myfile">
<button>提交</button>
</form>
除了使用@WebServlet(「資源路徑」)的註解之外,還要使用@MultipartConfig表示檔案上傳。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String uname = req.getParameter("uname"); // uname代表的是表單元素input的name屬性值
System.out.println("姓名: " + uname);
// 檔案上傳
// request.getPart(name) 得到上傳的檔案物件,name代表的是file檔案域的name屬性值
Part part = req.getPart("myfile");
// 得到上傳的檔案的檔名
String fileName = part.getSubmittedFileName();
System.out.println(fileName);
if(fileName!=null&&!"".equals(fileName)){
// 設定得到檔案的 存放的路徑
String realPath = req.getServletContext().getRealPath("/upload/");
System.out.println(realPath);
part.write(realPath+fileName);
}
}
<a href="1.jpg">圖片</a>
<a href="test.html">HTML</a>
<a href="Q-Dir.exe - 快捷方式.lnk">快捷方式</a>
<hr>
<a href="1.jpg" download>圖片</a>
<a href="1.jpg" download="aa.png">圖片</a>
<br><br><hr>
<form action="downloadServlet">
檔名:<input type="text" name="fileName"> <button>下載</button>
</form>