客户端浏览器通过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小时内与您取得联系。