Java Servlet 基礎使用(一)

介紹

  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);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章