Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
客戶端瀏覽器通過(guò)HTTP請(qǐng)求,訪問(wèn)控制器,然后控制器讀取配置文件,然后執(zhí)行服務(wù)器端跳轉(zhuǎn),執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,然后,在調(diào)用模型層,取得的結(jié)果展示給jsp頁(yè)面,最后返回給客戶端瀏覽器
組成部分struts視圖標(biāo)簽庫(kù)控制器action模型層ActionFrom JavaBean
maven 安裝
官網(wǎng) : 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>
此時(shí)將會(huì)自動(dòng)處理好依賴(lài)
一直采用的是直接打包好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>
創(chuàng)建攔截器,攔截所有請(qǐng)求.交給struts控制器執(zhí)行
<?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>
此時(shí)項(xiàng)目目錄結(jié)構(gòu)如下
創(chuàng)建控制器類(lèi),完成頁(yè)面的信息的傳遞
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; } }
此時(shí),定義私有String類(lèi)型的name,定義set,get方法,當(dāng)執(zhí)行的時(shí)候,調(diào)用execute方法.
此為控制器,起到連接兩者的視圖層,和模型層之間的關(guān)系.
定義頁(yè)面提交視圖層
<%@ 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>
此時(shí),定義表單.提交內(nèi)容,將會(huì)發(fā)送到hello控制里
定義數(shù)據(jù)接收層
<%@ 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>
再次編寫(xiě)配置文件,兩者聯(lián)合起來(lái)
<?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> <!-- 定義調(diào)試 --> <constant name="struts.devMode" value="true" /> <!-- 定義數(shù)據(jù)包 --> <package name="helloworld" extends="struts-default"> <!-- 定義處理邏輯 name為指定處理的名稱(chēng) class 處理的包文件 method 處理將會(huì)調(diào)用的方法--> <action name="hello" class="com.ming.HelloWorldAction" method="execute"> <!-- 成功返回頁(yè)面 --> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
目前 jsp已經(jīng)基本廢棄 所以標(biāo)簽庫(kù)已經(jīng)基本沒(méi)人用了.
struts起的作用,更多的是控制器的作用,請(qǐng)求送給spring
當(dāng)我們說(shuō)Java Web框架時(shí),最流行的兩個(gè)名字是Spring和Struts。由于Java語(yǔ)言缺乏內(nèi)部組織,Spring和Struts都提供了一個(gè)Web開(kāi)發(fā)框架,允許用戶專(zhuān)注于開(kāi)發(fā)可靠的Web應(yīng)用程序。
什么是 Spring 框架?
Spring 框架(Spring)是一個(gè)開(kāi)源應(yīng)用程序框架,通過(guò)提供基礎(chǔ)設(shè)施支持來(lái)支持Java應(yīng)用程序的開(kāi)發(fā)。Spring 是使用最廣泛的Java企業(yè)版 (Java EE) 框架之一,它允許開(kāi)發(fā)人員使用普通的舊Java對(duì)象 (POJO) 設(shè)計(jì)高性能應(yīng)用程序。
Spring被認(rèn)為是一個(gè)安全、靈活、低成本的框架。由于Spring是輕量級(jí)的,因此可以有效地利用系統(tǒng)資源。它提高了編碼效率并減少了整體應(yīng)用程序開(kāi)發(fā)時(shí)間。
它支持各種框架,包括Struts、Tapestry、Hibernate、EJB、JSF等。在更大的意義上,該框架可以被視為一種結(jié)構(gòu),我們可以在其中發(fā)現(xiàn)各種技術(shù)難題的解決方案。Spring框架中有幾個(gè)模塊,如IOC、DAO、AOP、ORM、Context、WEB MVC等。
什么是Struts框架?
Struts框架是一個(gè)開(kāi)源Web應(yīng)用程序框架,用于輕松快速地開(kāi)發(fā)Java企業(yè)版 Web 應(yīng)用程序。
Struts通過(guò)利用和擴(kuò)展Java Servlet API來(lái)促進(jìn)模型-視圖-控制器 (MVC) 架構(gòu)。
Struts框架的目標(biāo)是將“模型”(與數(shù)據(jù)庫(kù)通信的應(yīng)用程序邏輯)與“視圖”(呈現(xiàn)給客戶端/用戶的HTML頁(yè)面)和“控制器”分開(kāi),這是在模型和客戶端視圖之間傳遞數(shù)據(jù)的實(shí)例。
Struts已經(jīng)包含控制器,它只是一個(gè)名為ActionServlet的Java servlet,它生成視圖模板。Web應(yīng)用程序程序員接下來(lái)必須編寫(xiě)模型代碼,并通過(guò)擴(kuò)展編寫(xiě)連接模型、視圖和控制器的“struts-config.xml”中央配置文件。
Spring與Strut重要的關(guān)鍵差異
spring 與struts MVC之間最顯著的區(qū)別是面向方面編程(AOP)和面向?qū)ο缶幊讨g的區(qū)別。Spring使用依賴(lài)注入,這使得應(yīng)用程序松散鏈接。IoC容器位于 Spring框架的核心。
OOP可以做AOP可以做的所有事情,但方式不同。換句話說(shuō),AOP通過(guò)對(duì)程序結(jié)構(gòu)提供不同的視角來(lái)補(bǔ)充OOP。有時(shí)你需要對(duì)多個(gè)文件進(jìn)行相同的修改。使用Struts將相同的代碼添加到數(shù)百個(gè)文件應(yīng)該是乏味的。同時(shí),Spring在其他地方寫(xiě)入新的更改并將它們注入到文件中。
現(xiàn)在,讓我們看看重要的關(guān)鍵區(qū)別——Spring與Struts:
1.Spring框架被描述為非侵入性的,這意味著它不會(huì)強(qiáng)制開(kāi)發(fā)人員實(shí)現(xiàn)或修改由 spring API定義的類(lèi)或接口。另一方面,Struts具有侵入性,因?yàn)樗仁归_(kāi)發(fā)人員擴(kuò)展由struts API提供的基類(lèi)。
2.Spring框架之所以受歡迎,主要是因?yàn)樗哂懈鞣N優(yōu)點(diǎn),例如消息傳遞支持、事務(wù)管理以及與其他框架的連接。同時(shí),Struts框架因其對(duì)業(yè)界廣泛使用的標(biāo)簽庫(kù)的強(qiáng)大支持以及與各種客戶端技術(shù)的簡(jiǎn)單結(jié)合而廣受歡迎。這是在Spring與 Struts中需要考慮的重要事項(xiàng)。
3.Spring具有獨(dú)立的層,使與其他框架的接口變得簡(jiǎn)單,而Struts使其更復(fù)雜。
Spring支持 Velocity、JSP、Excel、Free Maker 和 PDF 用于查看組件。同時(shí),只有JSP才能查看Struts中的組件。
4.盡管Spring MVC支持基本的HTML表單標(biāo)記,但struts提供了大量替代 JSF 樣式的復(fù)合和復(fù)雜標(biāo)記。
5.Spring MVC 中提供了更多處理程序映射。在Struts中使用動(dòng)作映射而不是特定的處理程序映射。
6.在Spring與Struts中,中間件服務(wù)很重要。Spring包括了日志、事務(wù)、連接池等中間件服務(wù)。相比之下,Struts沒(méi)有內(nèi)置中間件服務(wù)。
7.容器是通過(guò)激活類(lèi)在Sprin中提供的。另一方面,Struts通過(guò)顯式配置類(lèi)來(lái)提供容器。
8.spring清除MVC(模型、視圖和控制器)之間的模塊劃分。另一方面,控制器和模型混合在支柱中。
9.Spring MVC代碼更容易測(cè)試。與Spring相比,Strut代碼的可測(cè)試性較差。
總結(jié)
我們已經(jīng)討論了有關(guān)spring與struts的所有重要細(xì)節(jié)。兩者都是用于開(kāi)發(fā)Web 應(yīng)用程序的優(yōu)秀Java框架。你可以根據(jù)需求為你的項(xiàng)目選擇最佳框架。希望現(xiàn)在你對(duì)Spring與Struts有一個(gè)清晰的概念,你將根據(jù)需要選擇更好的Java Web框架。
ervlet web 我們天天使用很熟悉,那什么是 Reactive web 呢??jī)烧叩膮^(qū)別是啥?今天阿粉就給大家介紹一下。
打開(kāi) Spring 的官方文檔我們?cè)?Reactive 一欄中可以看到下面的架構(gòu)圖,其中可以很明顯的看到 Reactive 的技術(shù)棧跟 Servlet 技術(shù)棧是完全并行的。意思是說(shuō)我們?nèi)粘i_(kāi)發(fā)的 Servlet web 類(lèi)型只是一半的內(nèi)容,還有另外一半世界就是 Reactive,兩者對(duì)應(yīng)的依賴(lài)如下所示。
<!--Servlet web 依賴(lài)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Reactive web 依賴(lài)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
servlet-reactive
通過(guò)架構(gòu)圖我們可以知道常用的 Servlet web 就是我們經(jīng)常說(shuō)的 Spring MVC,底層的技術(shù)棧支持 JDBC 等,而 Reactive web 就是 Spring WebFlux 底層的持久層支持 Mongo 等但是不支持 JDBC。
由上圖我們看到 Spring WebFlux 是一個(gè)異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的并發(fā)請(qǐng)求。相對(duì)于 Spring MVC 來(lái)說(shuō)的話,Spring MVC 構(gòu)建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型。
由于 Spring WebFlux 底層是使用響應(yīng)式編程,基于事件的異步驅(qū)動(dòng),所以可以在很大程度上提升系統(tǒng)的吞吐量。但是要知道這并不會(huì)縮短請(qǐng)求的響應(yīng)時(shí)間,只是提升吞吐量。
而且根據(jù)上面的架構(gòu)圖我們可以發(fā)現(xiàn),Spring WebFlux 底層的持久層是不支持 JDBC 的,也就是說(shuō)不支持 MySQL 等事務(wù)性數(shù)據(jù)庫(kù),
前面說(shuō)了這么多那 Spring WebFlux 到底是怎么開(kāi)發(fā)的呢?下來(lái)通過(guò)一個(gè)簡(jiǎn)單的 case 來(lái)給大家演示一下。在演示之前通過(guò)官方文檔我們可以發(fā)現(xiàn),Spring WebFlux 和 Spring MVC 是可以共用很多組件的,比如 @Controller,Tomcat 等,但是也會(huì)存在很多差異。
Spring 官方 Reactive 地址為:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
springmvc-springwebflux
基于我們之前的 demo-reactive 項(xiàng)目的代碼,或者小伙伴也可以在 starter.spring.io 上面下載一個(gè) SpringBoot 的項(xiàng)目代碼,增加上 spring-boot-starter-webflux 依賴(lài)即可。
定義 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極客技術(shù)");
user.setAge(18);
return Mono.just(user);
}
@GetMapping("/user/list")
public Flux<List<User>> getAllUser() {
User user = new User();
user.setName("Java極客技術(shù)");
user.setAge(18);
List<User> list = new ArrayList<>();
list.add(user);
return Flux.just(list);
}
}
隨后啟動(dòng)我們的服務(wù),再通過(guò)瀏覽器訪問(wèn)我們的接口就可以了。
上面三個(gè)接口的訪問(wèn)結(jié)果如下
hello
user-get
user-list
可以看到我們?cè)跒g覽器可以正常獲取到數(shù)據(jù),上面的代碼跟我們平時(shí)寫(xiě) SpringMVC 的代碼很相似,不太一樣的地方是有兩個(gè)類(lèi) Mono 和 FLux。
關(guān)于 Mono 和 Flux 是反應(yīng)式編程的概念,Mono 是返回 0 或 1 個(gè)元素,F(xiàn)lux 是返回 0 - N 個(gè)元素,更詳細(xì)的內(nèi)容大家可以通過(guò)官方文檔 https://projectreactor.io/docs/core/release/api/ 來(lái)查看
雖然從上面的寫(xiě)法來(lái)看,Spring WebFlux 的寫(xiě)法與 SpringMVC 的寫(xiě)法沒(méi)有很大的區(qū)別,但是兩者的底層機(jī)制是完全不一樣的,而且技術(shù)棧也不完全相同,所以大家在日常技術(shù)選型的時(shí)候需要根據(jù)實(shí)際情況去選擇。
阿粉這里給出的建議就是,如果當(dāng)下的項(xiàng)目就是 SpringMVC 的,那么不要想著換成 Spring WebFlux 架構(gòu),因?yàn)闆](méi)必要,如果說(shuō)要新開(kāi)發(fā)一個(gè)項(xiàng)目,需要高吞吐量而且底層也不依賴(lài)事務(wù)性數(shù)據(jù)庫(kù)的話,那么可以嘗試使用一下 Spring WebFlux。
原文:https://mp.weixin.qq.com/s/PJUsmaNFDF76ShM79SkLSA
如果感覺(jué)本文對(duì)你有幫助,點(diǎn)贊關(guān)注支持一下
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。