# JavaWeb 概述 **網站發佈和部署一定要依托技術語言嗎:** 不一定,一個網站可以直接發佈和部署,因為因為瀏覽器能夠識別網頁只需要兩樣東西,網路和靜態頁面,還有一個裝在他們的容器,比如 nginx。 **靜態頁面面臨的問題:** - 1:靜態網頁是固定的,是不可變的。如果一個網站比如騰訊首 ...
JavaWeb 概述
網站發佈和部署一定要依托技術語言嗎:
不一定,一個網站可以直接發佈和部署,因為因為瀏覽器能夠識別網頁只需要兩樣東西,網路和靜態頁面,還有一個裝在他們的容器,比如 nginx。
靜態頁面面臨的問題:
-
1:靜態網頁是固定的,是不可變的。如果一個網站比如騰訊首頁,這裡需要 1000 文章,那麼就必須編寫 1000 的 html 頁面。
-
2:難以管理維護,而且需要大量人工去查詢和維護。
-
3:難以修改,如果需要修改某頁面中的錯別字,就必須要找到這個頁面,再進行修改才可以生效。
JavaWeb 技術解決了什麼問題:
JSP + Servlet 解決靜態網頁的動態渲染問題,MySQL 解決數據存儲的問題。
JavaWeb 技術是如何解決的:
-
1:將所有的靜態頁面的數據進行結構化,存儲到 MySQL 資料庫中。
-
2:JavaWeb 對 MySQL 的伺服器提供客戶端支持,Java可以通過資料庫驅動去連接 MySQL 服務,去實現數據的維護工作,也就是 CRUD。
-
3:Java 通過 JDBC 查詢數據後把數據放到對象中,如果是多個數據就放到集合中。
-
4:將存儲數據的對象,通過 Servlet 放入到作用域中。
-
5:通過 EL 表達式或者標簽等技術,將作用域中的對象的數據提取出來渲染到 JSP 模板中。
具體的執行過程是怎麼樣的:
查詢資料庫數據 → Serlvet 放入到作用域中(request、session、application、pageContext)→ JSP 模板通過 EL 表達式 + 標簽 → 將其作用域中存儲的對象取出來動態替換。
查詢資料庫數據 → SpringMVC 放入到作用域中(ModelMap、Model、ModelAndView、request)→ Freemarker / Thymeleaf 模板通過 EL 表達式 + 標簽 → 將其作用域中存儲的對象取出來動態替換。
這個具體的執行過程其實就是經典 MVC 的開始架構設計模式。
MVC 架構設計提出的意義:
1:分層架構
2:解耦
3:各司其職(單一職能原則)
MVC 設計模式的由來
MVC 模式的概念:
MVC 模式並不是 JavaWeb 項目中獨有的,MVC 是一種軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller),是一種軟體設計的典範。
MVC 模式的詳解:
控制器 Controller:控制請求的處理邏輯,對請求進行處理,負責請求轉發,
視圖 View:用戶看到並與之交互的界面,比如 HTML(靜態資源),JSP(動態資源)等等。
模型 Model:一種企業規範,也就是業務流程、狀態的處理以及業務規則的規定。業務流程的處理過程對其他層來說是不透明的,模型接受視圖數據的請求,並返回最終的處理結果。業務模型的設計可以說是 MVC 的核心。
MVC 模式的應用:
MVC 模式被廣泛用於 Java 的各種框架中,比如早期的 Struts2 框架和目前市面上主流的 SpringMVC 框架都用到了這種思想。
JavaWeb 的經典三層架構
JSP Model1 第一代:
JSP Model1 是 JavaWeb 早期的模型,它適合小型 Web 項目,開發成本低。Model1 第一代時期,伺服器端只有 JSP 頁面,所有的操作都在 JSP 頁面中,連訪問資料庫的 API 也在 JSP 頁面中完成。也就是說,所有的東西都耦合在一起,對後期的維護和擴展極為不利。
"""
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<sql:query var="user" sql="select * from user">
${user.id} == ${user.nickname}
</sql:query>
</body>
</html>
"""
JSP Model1 第二代:
JSP Model1 第二代有所改進,把業務邏輯的內容放到了 JavaBean 中,而 JSP 頁面負責顯示以及請求調度的工作。雖然第二代比第一代好了些,但還讓 JSP 做了過多的工作,JSP 中把視圖工作和請求調度(控制器)的工作耦合在一起了。
"""
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<%
Connection connection = null;
PreparedStatement preparedStatement = connection.prepareStatement("sql");
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
User user = new User();
user.setId(1);
user.setNickname("xpy");
pageContext.setAttribute("user",user);
%>
${user.id}===${user.nickname}
<jsp:useBean id="user" type="com.kuangstudy.bean.User" scope="page">
<jsp:getProperty name="user" property="id"/>
<jsp:getProperty name="user" property="nickname"/>
</jsp:useBean>
</body>
</html>
"""
JSP Model2:
-
JSP Model2 模式已經可以清晰的看到 MVC 完整的結構。
-
JSP:視圖層,用來與用戶打交道。負責接收用來的數據,以及顯示數據給用戶。
-
Servlet:控制層,負責找到合適的模型對象來處理業務邏輯,轉發到合適的視圖。
-
JavaBean:模型層,完成具體的業務工作,例如開啟、轉賬等。
JSP Model2 適合多人合作開發大型的 Web 項目,各司其職,互不幹涉,有利於開發中的分工,有利於組件的重用。但是 Web 項目的開發難度加大,同時對開發人員的技術要求也提高了。
"""
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
try {
Connection connection = null;
PreparedStatement preparedStatement = connection.prepareStatement("sql");
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
User user = new User();
user.setId(1);
user.setNickname("xpy");
request.setAttribute("user", user);
request.getRequestDispatcher("index.jsp").forward(request,response);
}catch (Exception ex){
ex.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
"""
"""
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
${user.id}===${user.nickname}
<jsp:useBean id="user" type="com.kuangstudy.bean.User" scope="page">
<jsp:getProperty name="user" property="id"/>
<jsp:getProperty name="user" property="nickname"/>
</jsp:useBean>
</body>
</html>
"""