客戶端瀏覽器通過HTTP請求,訪問控制器,然后控制器讀取配置文件,然后執行服務器端跳轉,執行相應的業務邏輯,然后,在調用模型層,取得的結果展示給jsp頁面,最后返回給客戶端瀏覽器
組成部分struts視圖標簽庫控制器action模型層ActionFrom JavaBean
maven 安裝
官網 : https://struts.apache.org/
<dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.20</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
此時將會自動處理好依賴
一直采用的是直接打包好war包的方式的
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
創建攔截器,攔截所有請求.交給struts控制器執行
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> </struts>
此時項目目錄結構如下
創建控制器類,完成頁面的信息的傳遞
package com.ming; public class HelloWorldAction { private String name; public String execute() throws Exception { return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
此時,定義私有String類型的name,定義set,get方法,當執行的時候,調用execute方法.
此為控制器,起到連接兩者的視圖層,和模型層之間的關系.
定義頁面提交視圖層
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Hello World</title> </head> <body> <h1>Hello World From Struts2</h1> <form action="hello"> <input type="text" name="name"/> <input type="submit" value="提交"/> </form> </body> </html>
此時,定義表單.提交內容,將會發送到hello控制里
定義數據接收層
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World</title> </head> <body> Hello World, <s:property value="name"/> </body> </html>
再次編寫配置文件,兩者聯合起來
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 定義調試 --> <constant name="struts.devMode" value="true" /> <!-- 定義數據包 --> <package name="helloworld" extends="struts-default"> <!-- 定義處理邏輯 name為指定處理的名稱 class 處理的包文件 method 處理將會調用的方法--> <action name="hello" class="com.ming.HelloWorldAction" method="execute"> <!-- 成功返回頁面 --> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
目前 jsp已經基本廢棄 所以標簽庫已經基本沒人用了.
struts起的作用,更多的是控制器的作用,請求送給spring
當我們說Java Web框架時,最流行的兩個名字是Spring和Struts。由于Java語言缺乏內部組織,Spring和Struts都提供了一個Web開發框架,允許用戶專注于開發可靠的Web應用程序。
什么是 Spring 框架?
Spring 框架(Spring)是一個開源應用程序框架,通過提供基礎設施支持來支持Java應用程序的開發。Spring 是使用最廣泛的Java企業版 (Java EE) 框架之一,它允許開發人員使用普通的舊Java對象 (POJO) 設計高性能應用程序。
Spring被認為是一個安全、靈活、低成本的框架。由于Spring是輕量級的,因此可以有效地利用系統資源。它提高了編碼效率并減少了整體應用程序開發時間。
它支持各種框架,包括Struts、Tapestry、Hibernate、EJB、JSF等。在更大的意義上,該框架可以被視為一種結構,我們可以在其中發現各種技術難題的解決方案。Spring框架中有幾個模塊,如IOC、DAO、AOP、ORM、Context、WEB MVC等。
什么是Struts框架?
Struts框架是一個開源Web應用程序框架,用于輕松快速地開發Java企業版 Web 應用程序。
Struts通過利用和擴展Java Servlet API來促進模型-視圖-控制器 (MVC) 架構。
Struts框架的目標是將“模型”(與數據庫通信的應用程序邏輯)與“視圖”(呈現給客戶端/用戶的HTML頁面)和“控制器”分開,這是在模型和客戶端視圖之間傳遞數據的實例。
Struts已經包含控制器,它只是一個名為ActionServlet的Java servlet,它生成視圖模板。Web應用程序程序員接下來必須編寫模型代碼,并通過擴展編寫連接模型、視圖和控制器的“struts-config.xml”中央配置文件。
Spring與Strut重要的關鍵差異
spring 與struts MVC之間最顯著的區別是面向方面編程(AOP)和面向對象編程之間的區別。Spring使用依賴注入,這使得應用程序松散鏈接。IoC容器位于 Spring框架的核心。
OOP可以做AOP可以做的所有事情,但方式不同。換句話說,AOP通過對程序結構提供不同的視角來補充OOP。有時你需要對多個文件進行相同的修改。使用Struts將相同的代碼添加到數百個文件應該是乏味的。同時,Spring在其他地方寫入新的更改并將它們注入到文件中。
現在,讓我們看看重要的關鍵區別——Spring與Struts:
1.Spring框架被描述為非侵入性的,這意味著它不會強制開發人員實現或修改由 spring API定義的類或接口。另一方面,Struts具有侵入性,因為它迫使開發人員擴展由struts API提供的基類。
2.Spring框架之所以受歡迎,主要是因為它具有各種優點,例如消息傳遞支持、事務管理以及與其他框架的連接。同時,Struts框架因其對業界廣泛使用的標簽庫的強大支持以及與各種客戶端技術的簡單結合而廣受歡迎。這是在Spring與 Struts中需要考慮的重要事項。
3.Spring具有獨立的層,使與其他框架的接口變得簡單,而Struts使其更復雜。
Spring支持 Velocity、JSP、Excel、Free Maker 和 PDF 用于查看組件。同時,只有JSP才能查看Struts中的組件。
4.盡管Spring MVC支持基本的HTML表單標記,但struts提供了大量替代 JSF 樣式的復合和復雜標記。
5.Spring MVC 中提供了更多處理程序映射。在Struts中使用動作映射而不是特定的處理程序映射。
6.在Spring與Struts中,中間件服務很重要。Spring包括了日志、事務、連接池等中間件服務。相比之下,Struts沒有內置中間件服務。
7.容器是通過激活類在Sprin中提供的。另一方面,Struts通過顯式配置類來提供容器。
8.spring清除MVC(模型、視圖和控制器)之間的模塊劃分。另一方面,控制器和模型混合在支柱中。
9.Spring MVC代碼更容易測試。與Spring相比,Strut代碼的可測試性較差。
總結
我們已經討論了有關spring與struts的所有重要細節。兩者都是用于開發Web 應用程序的優秀Java框架。你可以根據需求為你的項目選擇最佳框架。希望現在你對Spring與Struts有一個清晰的概念,你將根據需要選擇更好的Java Web框架。
ervlet web 我們天天使用很熟悉,那什么是 Reactive web 呢?兩者的區別是啥?今天阿粉就給大家介紹一下。
打開 Spring 的官方文檔我們在 Reactive 一欄中可以看到下面的架構圖,其中可以很明顯的看到 Reactive 的技術棧跟 Servlet 技術棧是完全并行的。意思是說我們日常開發的 Servlet web 類型只是一半的內容,還有另外一半世界就是 Reactive,兩者對應的依賴如下所示。
<!--Servlet web 依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Reactive web 依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
servlet-reactive
通過架構圖我們可以知道常用的 Servlet web 就是我們經常說的 Spring MVC,底層的技術棧支持 JDBC 等,而 Reactive web 就是 Spring WebFlux 底層的持久層支持 Mongo 等但是不支持 JDBC。
由上圖我們看到 Spring WebFlux 是一個異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的并發請求。相對于 Spring MVC 來說的話,Spring MVC 構建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型。
由于 Spring WebFlux 底層是使用響應式編程,基于事件的異步驅動,所以可以在很大程度上提升系統的吞吐量。但是要知道這并不會縮短請求的響應時間,只是提升吞吐量。
而且根據上面的架構圖我們可以發現,Spring WebFlux 底層的持久層是不支持 JDBC 的,也就是說不支持 MySQL 等事務性數據庫,
前面說了這么多那 Spring WebFlux 到底是怎么開發的呢?下來通過一個簡單的 case 來給大家演示一下。在演示之前通過官方文檔我們可以發現,Spring WebFlux 和 Spring MVC 是可以共用很多組件的,比如 @Controller,Tomcat 等,但是也會存在很多差異。
Spring 官方 Reactive 地址為:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
springmvc-springwebflux
基于我們之前的 demo-reactive 項目的代碼,或者小伙伴也可以在 starter.spring.io 上面下載一個 SpringBoot 的項目代碼,增加上 spring-boot-starter-webflux 依賴即可。
定義 DTO
package com.example.reactive.demoreactive.dto;
public class User {
private String name;
private int age;
//省略 getter setter
}
定義 Controller
package com.example.reactive.demoreactive.controller;
import com.example.reactive.demoreactive.dto.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.List;
@RestController
public class UserController {
@GetMapping("/hello")
public String sayHello() {
return "hello";
}
@GetMapping("/user/get")
public Mono<User> getUser() {
User user = new User();
user.setName("Java極客技術");
user.setAge(18);
return Mono.just(user);
}
@GetMapping("/user/list")
public Flux<List<User>> getAllUser() {
User user = new User();
user.setName("Java極客技術");
user.setAge(18);
List<User> list = new ArrayList<>();
list.add(user);
return Flux.just(list);
}
}
隨后啟動我們的服務,再通過瀏覽器訪問我們的接口就可以了。
上面三個接口的訪問結果如下
hello
user-get
user-list
可以看到我們在瀏覽器可以正常獲取到數據,上面的代碼跟我們平時寫 SpringMVC 的代碼很相似,不太一樣的地方是有兩個類 Mono 和 FLux。
關于 Mono 和 Flux 是反應式編程的概念,Mono 是返回 0 或 1 個元素,Flux 是返回 0 - N 個元素,更詳細的內容大家可以通過官方文檔 https://projectreactor.io/docs/core/release/api/ 來查看
雖然從上面的寫法來看,Spring WebFlux 的寫法與 SpringMVC 的寫法沒有很大的區別,但是兩者的底層機制是完全不一樣的,而且技術棧也不完全相同,所以大家在日常技術選型的時候需要根據實際情況去選擇。
阿粉這里給出的建議就是,如果當下的項目就是 SpringMVC 的,那么不要想著換成 Spring WebFlux 架構,因為沒必要,如果說要新開發一個項目,需要高吞吐量而且底層也不依賴事務性數據庫的話,那么可以嘗試使用一下 Spring WebFlux。
原文:https://mp.weixin.qq.com/s/PJUsmaNFDF76ShM79SkLSA
如果感覺本文對你有幫助,點贊關注支持一下
*請認真填寫需求信息,我們會在24小時內與您取得聯系。