Servlet相關知識

Servlet

Servlet介紹

servlet是用於開發動態web資源的技術;若是須要發一個動態web資源,須要編寫一個java類,並實現servlet接口,並把開發好的java類部署到web服務器中。通常狀況下,咱們把實現了servlet接口的java程序稱爲Servlet。Servlet接口有兩個默認的實現類,分別是GenericServlet和HTTPServlet。他們的關係能夠在HTTPServlet和GenericServlet的源碼中詳細學習。html

web服務器之一Tomcat

Tomcat做爲Web服務器之一,具備性能優良,很是的小(它是符合Web服務器最小的服務器)的特色。下載tomcat:http://tomcat.apache.org/——找到download——下載完成後,解壓到任意目錄。前端

Tomcat目錄結構:java

1. bin:春芳可執行文件、啓動和關閉;
  2. conf:存放Tomcat的配置文件;
  3. lib:存放服務器須要的jar包;
  4. logs:日誌文件;
  5. temp:臨時文件;
  6. webapps:存放網站和web目錄;
  7. work:Tomcat的工做目錄;

使用IDEA搭建Web開發環境:mysql

  1. 打開idea,並建立一個微博項目;web

  2. 配置Tomcat服務器sql

    在Run/Debug Comfigurations中,找到Tomcat Server中的local;經過更更名字,修復警告,修改項目名稱等來完成搭建。數據庫

本章節常見的HTTP :超文本傳輸協議響應

302:表示重定向;apache

404:表示請求的文件不存在,路徑寫錯等問題;瀏覽器

500:服務器代碼寫錯了,可能文件中的java代碼有誤。tomcat

使用IDEA開發Servlet

idea開發Servlet須要準備而且導入Servlet須要的jar包。能夠經過如下操做進行自動下載jar包:

在IDEA中新建一個web項目,並新建一個package,在其中新建一個Servlet文件。此idea會自動生成一個實現了HttpServlet並重寫了doGet和doPost方法的java文件,但文件的Servlet字樣都是報紅出錯的。須要咱們利用idea的只能糾錯功能,就能夠很是快捷的導入jar包。也能夠手動將jar包導入項目的lib文件夾中。最終程序中的Servlet字樣不報紅,lib目錄下有jar包,就是導入成功。

response

重定向

簡單來講,就是將一個請求,轉換到另外一個地址。java中,語法以下:

response.sendRedirect("success.jsp");//重定向到成功頁面

經過servletContext對象實現數據共享

  1. 新建一個properties文件:

    driver=com.mysql.jdbc.Driver
    username=root
    password=123456
    url=jdbc:mysql://localhost:3306/smbms
  2. 編寫Servlet類:

    package com.kuang.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;
    
    //讀取properties配置文件
    public class ServletDemo03 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 {
            //讀取配置文件
            //1.得到配置文件的路徑
            String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties");
            System.out.println("取得的路徑爲:"+realPath);
            Properties properties = new Properties();
            FileInputStream is = new FileInputStream(realPath);
            properties.load(is);//把文件流加載到配置文件的對象中;
            String driver = properties.getProperty("driver");
            String username = properties.getProperty("username");
            String password = properties.getProperty("password");
            String url = properties.getProperty("url");
            //響應到網頁
            resp.getWriter().println(driver);
            resp.getWriter().println(username);
            resp.getWriter().println(password);
            resp.getWriter().println(url);
            //==================================
            System.out.println(driver);
            System.out.println(username);
            System.out.println(password);
            System.out.println(url);
        }
    }
  3. 配置web.xml

    <servlet>
        <servlet-name>Demo01</servlet-name>
        <servlet-class>com.David.servlet.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/d1</url-pattern>
    </servlet-mapping>
  4. 運行,訪問查看localhost:8080/demo02/q3

Request

亂碼問題解決方案:

全部能設置編碼的地方都統一設置:數據庫,數據庫字段,Servlet程序,請求,響應 , 前端,瀏覽器。

request.setCharacterEncoding("UTF-8");//處理亂碼問題
response.setCharacterEncoding("UTF-8");//處理亂碼問題

request經常使用的方法

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //查看request對象的方式
        System.out.println(request.getContextPath()); //得到web項目路徑
        System.out.println(request.getRequestURI()); //請求的URL路徑
        //Remote 遠程
        System.out.println(request.getRemoteUser()); //得到遠程的用戶名
        System.out.println(request.getRequestedSessionId()); //得到SessionId;
        System.out.println(request.getServletPath()); //請求servlet的url
        System.out.println(request.getLocalAddr()); //得到本地地址  防火牆
        System.out.println(request.getLocalName()); //得到本地名字
        System.out.println(request.getLocalPort()); //得到訪問的端口號
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

Request對象接收前端用戶提交的參數

  1. 寫前端註冊頁面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>註冊</title>
    </head>
    <body>
    <%--
    Form表單
        action:表明要提交的路徑,表單要提交到哪裏 ,能夠提交到一個Servlet
        //提交到Servlet須要,獲取到Web項目的路徑下的Servlet
        method: 提交表單的方式
    --%>
    <h1>註冊</h1>
    <form action="${pageContext.request.contextPath}/r2" method="post">
        <p>用戶名:<input type="text" name="username"></p>
        <p>密碼:<input type="password" name="password"></p>
        <p>
            <input type="submit">
            <input type="reset">
        </p>
    </form>
    </body>
    </html>
  2. 寫處理前端提交信息的Servlet

    package com.kuang.servlet;
    
    import javax.print.attribute.HashPrintRequestAttributeSet;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    //處理前端提交過來的數據
    public class RequestDemo02 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 {
            //經過HttpServletRequest獲取前端用戶提交的信息
            //req.getParameterValues(); 得到前端傳遞的控件信息,經過控件的name;可是能夠接受多個參數的控件,好比(多選框....)
            //req.getParameter(); 得到前端傳遞的控件信息,經過控件的name;
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            //鏈接數據庫,比較數據庫中的信息是否匹配
            if (username.equals("David")&&password.equals("1234567")){
                System.out.println("登陸成功!"); //跳轉到成功頁面
            }else {
                System.out.println("登陸失敗!"); //提示從新註冊
            }
            System.out.println(username);
            System.out.println(password);
        }
    }
  3. 配置web.xml

    <servlet>
        <servlet-name>RequsetDemo02</servlet-name>
        <servlet-class>com.David.servlet.RequestDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RequsetDemo02</servlet-name>
        <url-pattern>/d2</url-pattern>
    </servlet-mapping>
  4. 提交測試

轉發

簡單說轉發是服務器本身轉發到服務器上的另外一個請求。

轉發和重定向的區別

  1. 重定向:服務器告訴客戶端,客戶端去請求另一個地址;是一種客戶端行爲。
    1. 地址欄會變;
    2. 不能攜帶參數。
  2. 轉發:服務器本身轉發到服務器上的另外一個請求; 是一種服務器行爲。
    1. 地址欄不會變;
    2. 能夠攜帶參數。

會話

在Web中,會話表示從瀏覽器打開某個網站,在這個網站中不管操做了什麼,直到關閉瀏覽器,這一個過程,稱之爲一個會話。

會話結束的方式:

  1. 客戶端關閉了
  2. 服務端銷燬了

處理會話是由於:有時候要求,長期保持會話,不管用戶關閉少次瀏覽器,這個會話都要存在。

在客戶端留下一點東西,客戶端下次會呈現出來過來,服務器就知道客戶端以前訪問過。

cookie檢驗服務器是否訪問

package com.westos.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieTest extends HttpServlet {
    boolean flag = false;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解決亂碼問題:
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        //檢查請求的人是否帶了Cookie
        //經過用戶的請求,檢查它是否有cookie
        Cookie[] cookies = request.getCookies();
        System.out.println("cookie:"+cookies);
        if (flag){//若是flag是真,來過
            if (cookies!=null){//你有cookie
                for (int i = 0; i < cookies.length ; i++) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastLoginTime")){
                        response.getWriter().println("你上一次來的時間爲:"+cookie.getValue());
                        System.out.println("刷新了cookie");
                    }
                }
            }
        }else { //若是flag是假,沒來過
            response.getWriter().println("你是第一次來,還想享受組VIP待遇?");
            System.out.println("給該用戶一個cookie");
        }
        //創建一個cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //設置cookie保存的時間 //cookie.setMaxAge();
        //把這個cookie發給客戶端
        response.addCookie(cookie);
        //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
        flag = true;
    }
}

session

在服務器上作記錄,下次客戶端訪問的時候就能判斷出客戶端以前訪問過。

只要客戶端一旦鏈接上服務器,服務器就會自動產生Session;一個鏈接對應一個session,session能夠在一個會話中傳遞信息;經過setAttribute設置值;經過getAttribute得到值;由服務器端控制,服務器若是重啓了,信息就會丟失。

會話註銷的方法

  1. session.invalidate();//經過代碼註銷會話
  2. <!--session-config能夠設置會話自動過時,時間分鐘爲單位-->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>
相關文章
相關標籤/搜索