JavaWeb—Servlet

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()獲取參數

  1. 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");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章