JavaWeb—Servlet
靜態資源和動態資源
服務器上有兩種資源:
靜態資源:用戶每次訪問結果都是一樣的資源叫做靜態資源 (html、Css、JavaScript)
動態資源:用戶每次訪問結構都是不一樣的資源(jsp、PHP)
每次服務器再給瀏覽器響應的時候:動態資源必須要先轉換成靜態資源纔可以發送
先說一下Servlet配置:
1.可以通過web—WEB-INF----web.xml文件中配置
要配置:
<servlet>
<servlet-name>類名稱</servlet-name>
<servlet-class>包名+類名</servlet-class>
</servlet>
<servlet-maping>
<servlet-name>
類名稱
</servlet-name>
<url-pattern>
資源路徑
</url-pattern>
</servlet-maping>
servlet訪問:localhost:8080/資源路徑
通過資源路徑訪問到servlet-name—>進而訪問到 servlet的servlet-name—>進而訪問到類的全名稱,找到類
創建servlet —> 創建 request/response —>通過request 的到請求數據 —>通過response響應
還有一種配置方法:
在servlet3.0之後支持註解方式配置:
@WebServlet("/xxx") 配置單個路徑
@WebServlet("/xxx/xxx")(多層結構目錄結構)
@Webservlet("/xxx/*") *代表通配符 可以訪問任意資源路徑
@WebServlet("*.do") 統配符
1.serlet聲明週期:
init()------->Servlet初始化方法(僅在servlet第一次訪問的時候調用一次)
service()------->Servlet服務方法(每次調用Servlet方法的時候都會被調用)
destory()------->Servlet銷燬方法(服務器關閉的時候調用一次)
service和doXXX()方法?
service()方法 是servlet的入口 doXXX()方法是更具不同的提交方式來 判斷調用那種方法
一般在具體業務中要覆蓋doXXX()方法。
2.單例多線程
//由於一個Servlet程序只會創建一個Servlet程序,所以是單例的,可以根據這個特短獲取servlet的訪問人數
@WebServlet("/count")
public class countServlet extends HttpServlet {
int count=1;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
synchronized (this){
response.getWriter().print("當前訪問人數是"+count);
count++;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
3.Servlet域對象
PageContext jsp
HttpRequestContext 一次請求
HttpSession 一次會話
ServletContext 整個階段
1.通用方法獲取參數
1.getParameter(String name)
2.getParameterNames()
3.getParameterMap()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Parameter</title>
</head>
<body>
<form action="/parameter" method="get">
姓名:<input type="text" name="username" placeholder="文本框"><br>
密碼:<input type="password" name="password"><br>
<input type="radio" name="gender" value="男"> 男
<input type="radio" name="gender" value="女"> 女
<br>
<input type="checkbox" name="hobby" value="抽菸"> 抽菸
<input type="checkbox" name="hobby" value="喝酒"> 喝酒
<input type="checkbox" name="hobby" value="燙頭"> 燙頭
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
@WebServlet("/parameter")
public class ParameterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password=request.getParameter("password");
System.out.println("用戶名:密碼"+username+":"+password);
System.out.println("----------------獲取所有的屬性名稱-----------------");
Enumeration<String> name=request.getParameterNames();
while (name.hasMoreElements()){
String names=name.nextElement();
System.out.println(names+"="+request.getParameter(names));
}
System.out.println("------------Map集合----------------");
Map<String,String[]> map=request.getParameterMap();
Set<String> set=map.keySet();
for (String names:set){
String[] str=map.get(names);
System.out.print(names+":");
for(String i:str){
System.out.print(i+"、");
}
System.out.println();
}
}
}
2.私有方法,獲取參數
1.Get方式提交通過getQueryString()獲取參數
- Post方式提交 getInputStream();
3請求轉發(非法路徑) [服務器步驟]
(普通方式)
**獲取全局管理者對象:
**獲取轉發對 RequestDisParcher()
**轉發 forword方法
(簡寫方式)
request.getRequestDisParcher().forward(request,response);
@WebServlet( "/context")
public class ContextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* ServletContext context=this.getServletContext();
RequestDispatcher dispatcher=context.getRequestDispatcher("/count");
dispatcher.forward(request,response);*/
request.getRequestDispatcher("/count").forward(request,response);
}
}
防盜鏈
@WebServlet("/referer")
public class RefererServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String head=request.getHeader("referer");
if(head!=null){
if(head.contains("/day14")){
System.out.println("播放電影");
}else {
System.out.println("去優酷看電影");
}
}
}
}
4.重定向 :[瀏覽器操作,需要帶虛擬路徑]
原理:location響應頭+302狀態碼
可以response.setHeader(“location”,"/jsp或html");
response.setStatus(302);
(簡寫方式 )
response.sendRedirect(“jsp或者html”);
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向會有兩個Servlet,訪問服務器外部的資源
/* response.setHeader("location","/hello.jsp");
response.setStatus(302);*/
response.sendRedirect("/hello.jsp");
}
}