Lombok使用及JavaWeb知識點小結

一、JavaWeb

1、什麼是Javaweb

就是使用 java語言寫Web網站

靜態網站和動態網站的區別

  • 靜態網站:HTML、CSS、JS
  • 動態網站:Servlet/JSP,等和數據庫連接

項目中導入依賴的方式

  • 手動導入需要的jar包,然後將jar包添加到項目的依賴中
  • 使用Maven,在https://mvnrepository.com/ 上查找相關的依賴,然後配置到在pom.xml中,項目會自動導入所需要的jar包

HTTP:請求和響應

  • 請求

    客戶端通過請求獲得服務器上的一定資源

    任何一個請求都會在服務器上找到對應的資源

  • 響應

    服務器針對客戶端的請求,給客戶端返回一定的資源

    常見響應狀態碼

    200:正常響應

    404:沒有找到資源,資源路徑報錯

    500:後臺代碼有問題

    3XX:轉發或者重定向

    502:網關問題

Web項目的結構

- WEB-INF
	- web.xml
	- lib依賴
	- class,Java編譯過後的class文件
- index.jsp
- ...

2、如何創建一個Web項目

1、創建一個Maven項目

定位一個Maven項目的三要素:GAV(分組、項目名、版本)

Maven項目中的文件夾含義:

  1. pom.xml:依賴管理
  2. java:寫Java代碼的
  3. resource:存放資源的
  4. test:測試

如何將普通的Maven項目變成Web項目

在項目名稱上右鍵,選擇Add Framework Support,然後選擇web框架,然後項目中會多一個Web目錄,這樣子項目就成了Web項目

在開始頁面使用Maven模板創建的項目和創建Maven項目再導入Web支持的項目的區別

  1. 使用Maven模板創建的項目默認導入junit包
  2. 使用Maven模板創建的不是標準的Maven項目,沒有Java包、resource包,需要手動去導入
  3. 使用Maven模板創建的項目的項目wed.xml版本太舊了,需要將版本換成新的

3、Servlet

1、導入依賴的方式

  1. 將lib包導入,然後手動導入

  2. 使用Maven倉庫,在pom.xml中導入依賴。scope是依賴的使用範圍

2、IDEA中創建Servlet的方式

  1. 創建Java類,繼承HttpServlet類

  2. 右鍵選擇直接創建Servlet

    兩種方法都間接的實現了Servlet接口,本質上是一樣的

3、運行Servlet

在web.xml配置文檔中註冊Servlet標籤和Servlet-mapping標籤,Tomcat服務器會根據配置的路徑找到對應的Servlet來處理請求

4、使用Servlet在瀏覽器輸出HTML網頁

package org.westos.servlet;

import javax.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;


public class HelloServlet extends HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.print("<html>");
        out.print("  <head>");
        out.print("     <title>HelloServlet</title>");
        out.print("  </head>");
        out.print("<body>");
        out.print(" <h1>Hello,Servlet</h1>");
        out.print("</body>");
        out.print("</html>");
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doPost(request, response);
    }
}

4、request和response對象

request:通過請求對象request,可以獲得請求的一些信息

response:通過響應對象response,可以給前端響應一些信息

Servlet中的信息的傳遞都是使用流來實現的,流使用完畢以後要關閉資源

5、cookie和session(含例題)

從請求中獲得cookie和session對象

cookie:客戶端拿着

session:服務器拿着,服務器資源比較寶貴

1、獲得session和cookie

package org.westos.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;


public class HelloServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //得到session
        HttpSession session = request.getSession();
        //查看sessionId
        System.out.println(session.getId());
        //獲得請求中的所有的cookie
        Cookie[] cookies = request.getCookies();
        //遍歷打印
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + ":" +
                    cookie.getValue());
        }

        //給客戶端響應一個cookie
        Cookie cookie = new Cookie("key1", "value1");
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

2、使用cookie判斷用戶第幾次來

package org.westos.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;


@WebServlet(name = "CookieDemo")
public class CookieDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //亂碼解決
        response.setContentType("text/html;charset=utf-8");
        //獲得響應流
        PrintWriter out = response.getWriter();
        //獲得cookies
        Cookie[] cookies = request.getCookies();
        //判斷
        if (cookies != null) {
            out.write("上次訪問的時間");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("lastTime")) {
                    long l = Long.parseLong(cookie.getValue());
                    Date date = new Date(l);
                    out.write(date.toLocaleString());
                }
            }
        } else {
            out.write("first coming");
        }

        //設置cookie
        Cookie lastTime = new Cookie("lastTime", System.currentTimeMillis() + "");
        //設置Cookie的過期時間
        lastTime.setMaxAge(24 * 60 * 60);
        //添加Cookie
        response.addCookie(lastTime);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

6、JSP

JSP:Java Servlet Page

  1. Servlet本質

    本質上其實就是一個Java類,間接實現了Servlet接口。其實就是Servlet,只是在Servlet中一些代碼我們要自己寫,而在JSP中已經封裝好了,比較方便。

    在電腦C盤用戶目錄下,有一個IntelliJIdea2018.2\system\tomcat目錄,點開目錄下的項目,便可以看到IDEA裏面的***.jsp文件都變成了***_jsp.java文件,使用記事本打開看到裏面的源碼就是Java類

    JSP中默認調用了_jspService()方法,jsp文件中的代碼會被轉換爲out.write("");代碼進行執行

  2. jsp爲什麼過時

    jsp是視圖層的,視圖層用來控制視圖、編寫頁面,進行HTML/CSS/取值之類的操作,但是JSP本是又是Servlet,能夠進行控制層的操作,在JSP中使用Servlet的操作不利於網頁結構的分層,會增加程序的耦合度,不利於解耦

    所有的業務邏輯都應該使用Servlet進行編寫,所以JSP很少使用了,爲了程序的解耦,MVC分層思想

7、JSP九大內置對象

是jsp內部寫好的,可以直接拿來使用

  1. pageContext

    頁面上下文,只是頁面的範圍。可以從中獲取session信息,輸出對象out,application等

    pageContext.forward()

    pageContext.getRequest()

    pageContext.getResponse()

  2. session

    一次會話

  3. application

    整個Web應用中

  4. config

    配置

  5. out

    寫出內容

  6. page

    當前頁面

  7. Exception

    異常

  8. request(繼承自HttpServlet)

  9. response(繼承自HttpServlet)

8、JSP語法

  1. 註釋

    jsp註釋

    JSP註釋在加載爲類的時候不會被加載進去,所以不會在前端網頁看到,只會給後臺程序員看到
    <%--jsp註釋--%>
    

    HTML註釋

    前端頁面可以看到
    <-- 註釋 -->
    
  2. JSP腳本表達式

    會直接在網頁上顯示錶達式或變量的值

    會直接在頁面上輸出腳本或表達式的值
    <%= 
        表達式或值
        %>
    
  3. EL表達式

    和JSP腳本表達式的作用一樣,不過一般使用EL表達式,更簡單

    ${變量或表達式}

  4. jsp腳本片段

    在裏面寫Java代碼,定義的變量是局部變量

    <%
    	//任意Java代碼,定義的變量是局部變量,在_jspService()方法中
    	int a = 0;
    %>
    
  5. JSP代碼拼接

    可以循環顯示HTML代碼等

    <%
    for(int j=0;j<10.j++){	
    %>
    
    要執行的html代碼等
    
    <%
    	}
    %>
    
  6. JSP腳本片段

    在裏面寫Java代碼,定義的變量是全局變量

    <%!
        //任意Java代碼,定義的變量是全局變量,在類中
        int a = 0;
    %>
    

9、EL表達式

  1. 格式

    ${表達式或變量}

    將變量或表達式的值直接顯示在網頁上,可以取出後臺的值

    EL表達式的取值是有範圍的

  2. EL表達式的範圍

    pageContext:在當前頁面中,出了頁面就不能用了

    request(常用):一次請求中的

    session(常用):一次會話中的,一般放用戶信息

    application:在整個Web服務器中

    作用域:就近原則,假設有多個變量在不同的作用域中重複,採用就近原則

10、Lombok配置及使用

  1. 在IDEA中安裝Lombok插件

    在setting中的plugins中搜索Lombok,安裝後重啓IDEA

  2. 配置Lombok依賴

    <!-- lombok依賴 -->
        <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <version>1.18.12</version>
        </dependency>
    
  3. 在實體類上加@Data註解

  4. 這樣子就不用每次手動去重寫類的get/set/toString/…等方法,會自動幫我們寫上

  5. 測試

    package org.westos.pojo;
    
    import lombok.Data;
    
    //註解,加上後就不用重寫那麼多方法了
    @Data
    public class Users {
        private String name;
        private String password;
        private int age;
    
        //此處並沒有加公開的get/set方法,但是仍然可以被使用
        public static void main(String[] args) {
            Users user = new Users();
            user.setPassword("123456");
            user.setName("張三");
            user.setAge(23);
            System.out.println(user);
        }
    }
    

11、模擬登錄頁面,EL表達式取值

  1. 模擬前端頁面傳來的參數

    http://localhost:8080/javaweb/login?username=admin&password=12345

  2. 編寫Servlet

    package org.westos.servlet;
    
    import org.westos.pojo.Users;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //完整的前端的請求URL
            //http://localhost:8080/javaweb/login?username=zhangsan&password=123456
            //1.先得到Session
            HttpSession session = request.getSession();
            //2.得到前端傳遞的參數
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //3.業務代碼,判斷用戶是否登錄成功,這裏將數據寫死,沒有使用數據庫,真實場景應從數據庫中查詢
            if (username.equals("admin") && password.equals("123456")) {
                //創建初始化對象
                Users user = new Users();
                user.setName(username);
                user.setPassword(password);
                user.setAge(23);
                //登陸成功,將對象放在session中
                session.setAttribute("loginUser", user);
                //登陸成功就將錯誤信息移除
                session.removeAttribute("error");
            } else {
                //登陸失敗
                //顯示錯誤信息
                session.setAttribute("error","用戶名或密碼錯誤");
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //調用doPost()方法
            doPost(request, response);
        }
    }
    
  3. 在web.xml文檔中配置

        <servlet>
            <servlet-name>LoginServlet</servlet-name>
            <servlet-class>org.westos.servlet.LoginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>LoginServlet</servlet-name>
            <url-pattern>/login</url-pattern>
        </servlet-mapping>
    
  4. 創建前端jsp頁面,顯示登錄信息

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>用戶信息</title>
    </head>
    <body>
    
    <%--從session中得到用戶的登錄信息--%>
    用戶名: ${loginUser.getName()}
    年齡:   ${loginUser.getAge()}
    
    <%--報錯信息,如果登錄成功,就會移除--%>
    ${error}
    
    </body>
    </html>
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章