文章目錄
一、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項目中的文件夾含義:
- pom.xml:依賴管理
- java:寫Java代碼的
- resource:存放資源的
- test:測試
如何將普通的Maven項目變成Web項目
在項目名稱上右鍵,選擇Add Framework Support,然後選擇web框架,然後項目中會多一個Web目錄,這樣子項目就成了Web項目
在開始頁面使用Maven模板創建的項目和創建Maven項目再導入Web支持的項目的區別
- 使用Maven模板創建的項目默認導入junit包
- 使用Maven模板創建的不是標準的Maven項目,沒有Java包、resource包,需要手動去導入
- 使用Maven模板創建的項目的項目wed.xml版本太舊了,需要將版本換成新的
3、Servlet
1、導入依賴的方式
-
將lib包導入,然後手動導入
-
使用Maven倉庫,在pom.xml中導入依賴。scope是依賴的使用範圍
2、IDEA中創建Servlet的方式
-
創建Java類,繼承HttpServlet類
-
右鍵選擇直接創建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
-
Servlet本質
本質上其實就是一個Java類,間接實現了Servlet接口。其實就是Servlet,只是在Servlet中一些代碼我們要自己寫,而在JSP中已經封裝好了,比較方便。
在電腦C盤用戶目錄下,有一個IntelliJIdea2018.2\system\tomcat目錄,點開目錄下的項目,便可以看到IDEA裏面的***.jsp文件都變成了***_jsp.java文件,使用記事本打開看到裏面的源碼就是Java類
JSP中默認調用了_jspService()方法,jsp文件中的代碼會被轉換爲out.write("");代碼進行執行
-
jsp爲什麼過時
jsp是視圖層的,視圖層用來控制視圖、編寫頁面,進行HTML/CSS/取值之類的操作,但是JSP本是又是Servlet,能夠進行控制層的操作,在JSP中使用Servlet的操作不利於網頁結構的分層,會增加程序的耦合度,不利於解耦
所有的業務邏輯都應該使用Servlet進行編寫,所以JSP很少使用了,爲了程序的解耦,MVC分層思想
7、JSP九大內置對象
是jsp內部寫好的,可以直接拿來使用
-
pageContext
頁面上下文,只是頁面的範圍。可以從中獲取session信息,輸出對象out,application等
pageContext.forward()
pageContext.getRequest()
pageContext.getResponse()
-
session
一次會話
-
application
整個Web應用中
-
config
配置
-
out
寫出內容
-
page
當前頁面
-
Exception
異常
-
request(繼承自HttpServlet)
-
response(繼承自HttpServlet)
8、JSP語法
-
註釋
jsp註釋
JSP註釋在加載爲類的時候不會被加載進去,所以不會在前端網頁看到,只會給後臺程序員看到 <%--jsp註釋--%>
HTML註釋
前端頁面可以看到 <-- 註釋 -->
-
JSP腳本表達式
會直接在網頁上顯示錶達式或變量的值
會直接在頁面上輸出腳本或表達式的值 <%= 表達式或值 %>
-
EL表達式
和JSP腳本表達式的作用一樣,不過一般使用EL表達式,更簡單
${變量或表達式}
-
jsp腳本片段
在裏面寫Java代碼,定義的變量是局部變量
<% //任意Java代碼,定義的變量是局部變量,在_jspService()方法中 int a = 0; %>
-
JSP代碼拼接
可以循環顯示HTML代碼等
<% for(int j=0;j<10.j++){ %> 要執行的html代碼等 <% } %>
-
JSP腳本片段
在裏面寫Java代碼,定義的變量是全局變量
<%! //任意Java代碼,定義的變量是全局變量,在類中 int a = 0; %>
9、EL表達式
-
格式
${表達式或變量}
將變量或表達式的值直接顯示在網頁上,可以取出後臺的值
EL表達式的取值是有範圍的
-
EL表達式的範圍
pageContext:在當前頁面中,出了頁面就不能用了
request(常用):一次請求中的
session(常用):一次會話中的,一般放用戶信息
application:在整個Web服務器中
作用域:就近原則,假設有多個變量在不同的作用域中重複,採用就近原則
10、Lombok配置及使用
-
在IDEA中安裝Lombok插件
在setting中的plugins中搜索Lombok,安裝後重啓IDEA
-
配置Lombok依賴
<!-- lombok依賴 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
-
在實體類上加
@Data
註解 -
這樣子就不用每次手動去重寫類的get/set/toString/…等方法,會自動幫我們寫上
-
測試
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表達式取值
-
模擬前端頁面傳來的參數
http://localhost:8080/javaweb/login?username=admin&password=12345
-
編寫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); } }
-
在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>
-
創建前端jsp頁面,顯示登錄信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用戶信息</title> </head> <body> <%--從session中得到用戶的登錄信息--%> 用戶名: ${loginUser.getName()} 年齡: ${loginUser.getAge()} <%--報錯信息,如果登錄成功,就會移除--%> ${error} </body> </html>