您的位置 首页 java

新年伊始:2022,这10大最佳Java框架值得你选择

新年伊始:2022,这10大最佳Java框架值得你选择

Java框架

Java 是一种强大的 编程语言 ,当与框架结合时,Java 可以为任何领域提供最佳解决方案,无论是电子商务、银行、 云计算 、金融、大数据、股票市场、IT 等。

如果您刚开始使用 Java,请通过此博客( )来看看 Java 是个什么鬼,它将带您了解开始使用框架所需的所有重要概念。

1.何为Java 框架?

作为模板或骨架而预先编写的代码主体,然后开发人员可以使用和重用这些代码来创建应用程序,要做的就是根据需要编写相应的代码,以使应用程序按照他们的意图作为框架实际构成而工作。框架的重用使开发人员能够对其关注业务应用而进行编程,无需从头开始创建每一行代码而耗费资源。

Java 框架特定于 Java 编程语言,用作开发软件应用程序和 Java 程序的平台。

Java 框架包括而不限于用于处理、输入和管理硬件设备以及与系统软件交互的预定义类和函数。这取决于框架的类型、程序员的技能水平、想要完成的任务以及他们的偏好等。

2.为什么是框架?

简而言之,框架为您的应用程序提供了一个基础性主体结构。例如,如果我们有一个合适的测试框架,我们可以自动化很多事情并获得准确和一致的结果。同样,如果有用于 ORM、Web 应用程序、日志记录、数据管理等的框架,它将使开发人员的生活变得简单,并帮助他们更专注于业务逻辑,而不用担心跨域或应用程序而使用的通用代码片段。

认识到这些以后,我来看看你都有哪些热门流行的Java框架。

3.10大热门框架

虽然有很多框架是基于 Java 构建的,但这里有一些非常常用的不同类型的框架——Web 应用程序、网络应用程序、日志记录、测试、ORM 等。 注意,每一个都有自己的好处或优势,且最适合不同的业务用例或应用场景。严格的说,我们不能说哪个更好,因为它们在各自不同的场景中都很好——各有各的特点。

下面就来简要地介绍下这些人们的Java框架。

1) Spring 框架

Spring 凭借其依赖注入的概念和面向方面编程的特性,席卷了开发世界。它是一个用于企业级应用程序的开源框架。

使用 Spring,开发人员可以创建松散耦合的模块,其中依赖项由框架处理,而非依赖代码中处理的库。

Spring框架包罗万象,涵盖了很多特性,包括安全性和配置性,简单 易学 。此外,由于它是最流行的 Web 框架,因此您可以找到大量文档和活跃的社区。

配置完所有内容后,您的代码将变得干净且易于理解。其中主要概念如下:

  • u 依赖注入 (Dependency Injection (DI) 也称为控制反转(Inversion of Control) )——在这个原理中,不是应用程序按顺序控制流,而是将控制权交给驱动流的外部控制器。外部控制器是事件。当某个事件发生时,应用程序流程将继续。这为应用程序提供了灵活性。在 Spring 中, IoC 是通过 DI 完成的,DI 分为三种类型——setter 注入、方法注入和构造函数注入。
  • u bean s 和 Spring Context ——在 Spring 中,对象被称为 bean,并且有一个 BeanFactory 来管理和配置这些 bean。您可以将 beanfactory 视为实例化、配置和管理 bean 的容器。大多数应用程序使用 xml (beans.xml) 进行配置。 ApplicationContext 是 BeanFactory 的超集,用于需要事件传播、声明机制和与 Spring 面向方面的特性集成的更复杂的应用程序。
  • u Spring框架的核心模块有( ):

ü Spring Context:用于依赖注入(DI)

ü Spring DAO:使用DAO模式进行数据库操作

ü Spring JDBC :用于 JDBC 和数据源支持

ü Spring ORM:用于对 hibernate 等 ORM 工具支持

ü Spring AOP:面向切面编程

ü Spring Web 模块:用于创建 Web 应用程序(Spring MVC)

ü 其它与时俱进的新模块等。

2)Struts框架

Apache Struts 是另一个强大的 Web 应用程序开源框架。它遵循MVC(模型-视图-控制器)模型并扩展了 JSP API。在传统的 servlet-JSP 方法中,如果用户提交了一个包含他的详细信息的表单,那么信息就会进入 servlet 进行处理,或者控制权会转移到下一个 JSP(Java 服务器页面——您可以在HTML中编写 Java 代码 )。这对于复杂的应用程序来说变得混乱,因为“视图”或表示层理想情况下不应该有业务逻辑。

Struts 将 View、Controller 和 Model(数据)分开,并通过一个配置文件 struts-config.xml 提供它们之间的绑定。

模型 (Model)用来关联数据层的相关处理。

控制器 (Controller)是一个 ActionServlet,您可以在其中为视图编写模板,并且使用 ActionForm JavaBean 维护用户数据。 Action 对象负责转发应用程序流。

视图 (View)由一组丰富的标签库维护。

与单独使用 servlet 和 JSP 的传统 MVC 方法相比,Struts 易于设置并提供更多的灵活性和可扩展性。它可以成为您作为 Web 开发人员职业生涯的良好起点。

3)Hibernate

尽管 Hibernate 不是一个全栈框架,但它彻底改变了我们看待数据库的方式。 作为Java Persistence API ( JPA ) 的实现,Hibernate 是 Java 应用程序的 数据库对象关系映射 (ORM)。就像 SQL 一样,Hibernate 中的查询被称为 HQL (Hibernate Query Language)。其实后来企业级Java规范中出现的JPA,正式受到了Hibernate的影响而来的。

Hibernate 直接将 Java 类映射到相应的数据库表,反之亦然。

hibernate 中的主要文件是 hibernate.cfg.xml 文件,其中包含有关将 Java 类与数据库配置映射的信息。

Hibernate 解决了 JDBC 的两个主要问题——JDBC 不支持对象级关系,如果你决定迁移到不同的数据库,旧的查询可能无法工作——意味着很多变化——即时间和金钱支出!

Hibernate 提供了一个抽象层,以便代码与数据库松散耦合。诸如建立数据库连接、执行 CRUD 操作之类的事情都由 Hibernate 处理——因此开发人员不需要实现这些,从而使代码独立于所使用的数据库。

4)Apache Wicket

如果您已经使用过 JSP,那么学习Wicket将是小菜一碟。 Wicket 是一个简单的 Java Web 框架,具有面向组件的结构,您只需要了解 Java 和 HTML 。绝对没有 XML 或配置文件!

Wicket 的主要特性是它的 POJO 模型,其中组件是具有 OOP 特性的简单(普通的)Java 对象。这些组件作为可重用的包捆绑在一起,包含图像、按钮、表单、链接、页面、容器、行为等,以便开发人员可以自定义它们。

Wicket 是轻量级的,您可以非常快速地构建应用程序。对用 Wicket 编写的代码进行单元测试也很容易。

5) JSF (Java Server Faces)

不要将 JSF 与 JSP 混淆,后者只是一个可以包含静态和动态内容的文本文档。 JSF 由 Oracle 开发,作为 企业级Java规范的的一部分。

它是一个基于组件的 MVC 框架,并为基于服务器的应用程序提供了可重用的 UI 组件。主要思想是封装各种客户端技术,如 CSS 、JavaScript 和 HTML,这将允许开发人员在不深入了解这些技术的情况下创建 UI。他们只需拖放 UI 组件,就可以更专注于他们的表示层细节。

JSF 中的默认模板系统是 FaceLets。 JSF 与 Struts 非常相似。

JSF 可以进一步与支持 AJAX 的组件无缝集成,通过添加用于验证和方法调用的 Ajax 事件来丰富用户体验。

有很多优秀的第三方JSF标准实现库可以直接使用。

6)Dropwizard

另一个名副其实的 Java 框架 – wizard(向导)。这个轻量级框架让您可以非常快速地完成您的应用程序,因为它对高级配置、日志记录、应用程序指标等提供开箱即用的支持。您可以创建具有高性能、稳定和可靠的 RESTful Web 应用程序。

Dropwizard 特别神奇,因为它将 Java 生态系统中的大量库(如 Jetty、Guava、 Jersey 、Jackson 和 Metrics 等)整合到一个框架中,并为您提供了一个轻量级和精益的应用程序。

由于所有配置、安全性和性能相关任务都有集成库,因此作为开发人员,您需要做的就是构建业务逻辑。

Dropwizard 是一个与库捆绑在一起的开源框架,您可以使用 Eclipse IDE 轻松设置它并创建一个简单的项目来学习(请相信,您完全可以自己学习 Dropwizard!)。 Dropwizard 网站上的基本教程将帮助您完成每一步。

7) Grails

Grails 是一个易于学习的全栈框架,非常适合那些刚刚开始编程生涯的人。 Grails 是一个用 Groovy 编程语言编写的 Web 框架,它运行在 Java 平台上,并且与 Java 语法完美兼容。该框架基于 MVC 设计模式。

Groovy 类似于 Java,与 Java 相比,它添加了更多功能。如果您已经了解 Java,那么学习 Groovy 非常容易。

与JSP 类似,在Grails 中,渲染技术是GSP(Groovy Server Pages)。在 Grails 中为视图创建标签既简单又容易。它使用了 GORM——它是 Grails 中使用的 ORM 实现。您也可以直接使用 Hibernate 代替 GORM。 Grails 内置了对 RESTful API 的支持,因此可以轻松创建此类服务。

最棒的部分来了——您可以将现有的 Java 代码与 Grails 集成。如果您的应用程序中混合使用了 Groovy 和 Java 代码 – 它会工作得很好!

学习 Grails 的最佳方法是使用任何 Java IDE(如 Eclipse NetBeans 等)设置您自己的开发环境,然后按照教程来构建您的第一个 Web 应用程序。

8) ATG

ATG 是一个用 Java 编写的网络商业平台。它是一个可定制和可配置的框架,特别适用于与电子商务相关的网站。该产品归 Oracle 所有,支持复杂而庞大的 B2B 和 B2C 应用程序。然而,对于小规模应用,它可能是昂贵的。如果您正在开发电子商务网站,ATG 是一个很好的学习框架,它将丰富您的技术和领域知识。

ATG 平台可以在三台服务器上运行——Oracle Weblogic、IBM Websphere 和 JBoss

框架中有 3 个主要层级:

  • u Dynamo 应用框架( Dynamo Application Framework)——它是提供基于 JavaBeans 和 JSP 的开发环境的基础层。所有通用功能都有标准的 ATG 类,甚至可以通过配置文件链接组件 bean 来创建和组装自定义 Java 代码。
  • u 个性化模块(Personalization module )——这是为每个用户动态定制内容的地方。该模块有助于控制和维护定义要向特定用户显示哪些内容的用户配置文件和业务规则。该层还支持有针对性的电子邮件。
  • u 场景模块( Scenarios module)——该模块通过引入时间敏感、事件驱动的活动来管理网站访问者与一段时间内的内容之间的交互,进一步增强了个性化模块的功能。例如,限时优惠、某些会员的独家优惠等……

ATG 是一个宽泛的框架,您需要时间和耐心来学习它。 沃尔玛 梅西百货 百思买 ASDA 等几家大公司的网站都建立在 ATG 上。

9) Play

Play 是一种稍微传统和独特的框架类型,它遵循约定优于配置的方法。它基于MVC模式,是一个开源的Web应用程序框架。除了 Java,您还可以在 Scala 中编写 Play Web 应用程序。

Play 类似于 Django Ruby on Rails ASP .NET 架构,不一定遵循 J2EE Web 标准。

Play 的一些特点是:

  • ü 异步处理带来的高性能
  • ü 没有容器,没有状态,建立在反应式原则上
  • ü 使用静态类型语言,因此大多数错误是在编译时捕获的,从而在开发 生命周期 的早期节省了大量错误。
  • ü Scala 探究了真正的 OOP 以及一些函数式编程概念。它与 Java 的兼容性造就了一个优秀而强大的系统。
  • ü Play2 发布了一个新的强大的构建系统 sbt,它可以轻松地与 Maven 项目集成以及创建简单的 JAR 文件。
  • ü 内置了用于常见功能的广泛关系数据库访问库。

10) Apache Hadoop

虽然 Apache Hadoop 不是一个全栈框架,但它提供了一个 软件框架 ,并在 MapReduce 编程模型上工作。这些实用程序可以轻松处理大量数据(大数据)、存储、分析和处理它们以提供更快、更有效的结果。

我之所以将 Hadoop 包括在此列表中,因为它是当今大数据日益突出的“重要事物”。

Hadoop 使用主从设计模式帮助分布式数据存储和处理。主节点(即NameNode)的Hadoop HDFS(Hadoop分布式文件系统)层有数据节点。 MapReduce 层有 JobTracker 和 tasktracker。从节点分别有Data节点和taskTracker。

HDFS 将文件分成一组块,并在整个集群中复制这些块。

如果您想熟悉大数据和数据科学——Hadoop 是您的起点。具体可以到官网去进一步学习 Hadoop。

4.其它Java 框架还有

11) GWT

Google Web Toolkit (GWT) 是一个明显由 Google 创建的框架,用于在 Java 中创建富 Internet 应用程序。 GWT 的最佳特性之一是它将 Java 代码转换为 JavaScript 代码——也就是基于浏览器的自定义代码。我个人喜欢这个功能,因为在开发过程中,我们过去常常在浏览器测试上花费大量时间和精力。使用这套开源工具,我们可以在更短的时间内编写高性能的 Web 应用程序。如果您已经有一个代码库,您可以轻松地将它与 GWT 集成,因为 GWT 也与 Eclipse IDE、Maven 和 Junit 兼容。该框架还提供了广泛的小部件(widget)库,可以执行大多数任务,即使是 Java 初学者也可以轻松开发业务逻辑,而不必担心太多基本的东西。 GWT 框架有 3 个主要组件——Java 到 JS 编译器、位于核心 JRE 库之上的 JRE 仿真库和包含 UI 组件、历史管理和更多功能的 GWT UI 构建库。

可以在这里来学习GWT:

12) Vaadin

Vaadin 是一款旗舰产品,也是开发者可以使用 Java 进行 HTML5 Web UI 实现的平台。它是一个开源平台,包括 Java Web 框架和一组 Web 组件以及应用程序启动器和工具。这些 Web 组件构成了 Vaadin 的核心,可以进行定制,从而为桌面和移动应用程序提供高性能和多功能的代码。

Vaadin 流是 Vaadin 平台的实际 Java 框架部分,负责客户端-服务器通信以及路由。使用 Vaadin 流,您可以完全用 Java 编写 Web 应用程序,而无需大惊小怪的 JS 或 CSS。 UI 组件使用与浏览器和服务器之间的自动通信来处理用户的浏览器活动。您可以轻松地将 Vaadin 组件集成到您正在使用的任何 IDE 中,而且它是一个跨平台框架,因此无需担心将代码迁移到不同的平台。

这是一种构建 Java 应用程序的全新方法,因此您可以专注于表示层,而无需担心客户端-服务器通信。它还具有数据绑定 API,可使用类型安全的 Java 代码和抽象层将 UI 组件映射到数据库,以便您可以使用 HTML 模板和 Java 在 UI 中构建可重用的组件。

13) Spark

Spark 是 Apache 的另一个杰作,它是一个开源的 Web 开发框架,它具有与 Spring、Play 和 JAX-RS 类似的功能,但功能更强大,并且不遵循传统的 MVC 设计模式。

它是 Java 的微框架和特定领域语言,专注于开发速度。它需要非常少的配置和编码。由于内存计算,它在数据处理方面比 Hadoop 快 10 倍。 Spark 是一个完全动态的框架,支持延迟初始化和实时数据处理。

与专注于数据科学和大数据的编程语言 Scala 和 R 集成也很容易。 Spark 的主要目标是处理大量数据,还支持使用 SQL 查询、机器学习和图形算法进行高级分析。

不要认为 Spark 可以取代 Hadoop——它可以是 Hadoop 提供的功能的扩展——如果你进入数据科学领域,学习这两个框架将使你比其他框架更具优势。

14)OpenXava

一个用于快速开发 Web 应用程序的低代码平台,您可以在创纪录快的时间内启动和运行业务应用程序。它由业务组件组成,可让开发人员轻松轻松地构建复杂的应用程序。真正意义上的可扩展、可定制和面向对象,OpenXava 以 Java 类为核心对业务问题进行建模。这种模型驱动的开发方法确保了封装性。开发人员仅将模型定义为带注释的普通 Java 类,并且必要的功能都是在运行时生成的。

OpenXava 的结构和理念遵循业务组件架构,而不是传统的 MVC 架构。这里的一切都是一个业务概念,所有对某个业务概念有贡献的工件都在同一个地方,无论是关联的视图-View、模型-Model还是控制器-Controller。

在学习这个框架之前,你绝对应该到这里()阅读这种语言背后的概念。

15)Vert.X

Vert.x 由 Eclipse 开发,是一个事件驱动的应用程序框架,它使用 Java、JS、Groovy、Scala 等多种语言。因此,它本质上是多语言的。它依赖于异步编程模型,从而使应用程序无阻塞且不受 多线程 影响。

Vert.x 可以说更像是一个工具包,它提供多种语言的 API 来执行所有 Web 应用程序所需的异步任务——日志记录、身份验证、监控、数据库连接、多集群支持等…… Vert.x中有两个主要概念:

Verticle——就像任何其他异步模型一样,有一个事件循环,其中包含消息、网络缓冲区、HTTP 请求等事件。事件循环中的每个事件都由 Verticle 处理。

Event Bus (事件总线)——不同的 Verticle使用事件总线相互通信。这是通过异步消息传递完成的。事件总线可以执行不同类型的消息传递,如点对点、广播和请求-响应。

Vert.x 最好的一点是它的非阻塞特性,这使得 Web 应用程序具有很高的性能。该框架可用于任何应用程序——小型、中型或大型。如果您理解了 Node.js ,您会更喜欢 Vert.x,因为它具有 Node.js 的所有功能以及 Java 虚拟机 的优点,这使得它成为一个强大而健壮的组合。

16)Tapestry

从概念上讲,Tapestry 类似于 JSF 和 Wicket。它是一个开源、跨平台、基于组件的 Web 应用程序开发框架,可以创建高度可扩展的应用程序。它建立在丰富的 Java Servlet API 之上,适用于任何容器或应用服务器。 Tapestry 是一个真正的面向对象的框架,因为您能使用纯 HTML 模板或纯 Java 类(对象)创建 HTML 页面。几乎不需要 XML 配置,Tapestry 使用注释(注解),从而使代码简单且易于管理。

使用 Tapestry,应用程序停机时间最小,因为即使是对 Java 类的任何更改都可以热交换(hot-swapped),而无需重新启动服务器。 Tapestry 还负责 URL 构建和重定向。与其他框架不同,这里的框架适应代码而不是相反。

Tapestry 的一些开箱即用的功能是——文件上传、分页、字段验证、日期和日历逻辑、内化、显示弹出窗口等……

很容易将 Tapestry 代码与后端框架(如 Spring、Hibernate 等)和测试框架(如 Selenium )集成。

17)Jersey

Jersey 是一个 Web 服务框架,用于创建 RESTful 服务并支持 JAX-RS API。它通过有用的特性和实用功能极大地简化了 RESTful 服务的开发。 Jersey 提供了一种抽象层,因此开发人员无需担心客户端-服务器通信的低级实现,而可以专注于主要的 Web 服务功能。

与任何其他 RESTful 框架相比,Jersey 的一个显着特点是它允许分块输出,即服务器可以部分或分块地向客户端发回响应。当必须发送大数据并且可以在准备整个响应时发送数据块时,这很有用。

Jersey 还配备了简单的测试基础设施。您可以编写主要基于 Junit 的轻量级集成测试。将测试与 Maven 环境集成也很容易。您需要做的就是在 pom.xml 中添加依赖项。

18)OSGi

OSGi 或开放服务网关倡议(Open Service Gateway initiative)定义了一个基于组件的系统。它是一种流行的 Java 框架,其中每个组件都称为一个捆绑包(bundle)。每个 bundle 都有独立的生命周期,不依赖于其他 bundle。将捆绑包视为具有 OSGi 特定标头的 jar 文件。捆绑包必须明确声明他们需要访问的包,否则 OSGi 平台将无法启动。

捆绑包使用 JVM 级别的服务注册表来发现、发布和绑定捆绑包作为服务。这就是 OSGi 的精髓——模块化应用程序架构促进适应性和快速更改,而无需太多应用程序停机时间(运行时灵活性)。

OSGi 之所以流行,主要是因为它易于与 eclipse 和基于 maven 的项目集成。

OSGi 有一些很好的概念和好处,但由于单独的独立包版本控制可能是一个问题。这可能是使用此框架而不是其他框架的一个主要缺点。然而,值得在这个框架上投入一些时间,因为模块化和隔离类加载的好处对开发人员来说是个重要的概念。

19)Drools

Drools 是一种流行的业务规则管理系统。它具有业务规则引擎 (BRE)、创作、规则管理程序以及对决策和符号模型的运行时支持。规则管理程序称为 Drools 工作台。该项目得到了 RedHat 和 JBoss 的支持。使用 Drools,开发人员可以轻松地将数据与业务逻辑分开。 Drools 的两个主要步骤是——

  • 创作 – 创建规则文件;
  • 运行时——执行规则的地方。

Drools 最重要的特性是可以随时删除和添加新规则,而无需重新启动服务器。

Drools 是依赖于许多条件才能发生某些操作的应用的合适选择。例如,检查一个人是否有资格升级他的计划,有一些设定的规则——例如,客户是否存在,客户的账单金额是否大于某个限额等等。这些规则可以定义为决策表,而不是将它们硬编码在代码中。任何更改都不需要另一个构建、完整的测试或重新部署!

20)MyBatis

MyBatis 是 Apache 的一个免费软件,它是 Java 中的一个持久性框架,其中 Java 方法与 SQL 语句映射,而 ORM 将 Java 对象映射到数据库中的表。映射引擎以声明方式使用 XML 描述符或注释将 SQL 结果映射到对象树中。

在很多方面,MyBatis 都优于 JDBC 和 Hibernate。 MyBatis 可以动态生成 SQL 语句,将它们与代码分开。它还提供查询缓存以便于访问。 API 非常简单,您无需精通 SQL 或数据库即可编写 MyBatis 代码。

MyBatis 是 Hibernate 和 JDBC 的一个很好的替代方案,当您的应用程序不太复杂,并且您想要简单的开箱即用功能,例如数据库连接、事务管理、加载数据库驱动程序、管理和释放连接等由框架完成时。 MyBatis 也可以很容易地与 Spring 框架集成。

21) Apache Mina

Apache Mina 是一个网络应用程序框架,开发人员可以使用它轻松创建高度可扩展和高性能的网络应用程序。无论您使用 TCP/IP、UDP、LDAP、NTP、DNS 等还是自定义协议,Mina 都为所有传输提供统一的 API。该框架可以提供高级和低级网络 API。 Mina 完全处理 I/O 操作,帮助开发人员完全专注于业务逻辑和其他应用程序需求。在模拟对象的帮助下很容易测试编写的代码。您可以使用 Eclipse IDE 轻松学习 Mina。它可以与 Spring 和 PicoContainer 等流行框架集成,使其成为网络应用程序的流行选择。

MINA 比 SOAP 更好,更稳定可靠。它有一个丰富的网络库来处理并发线程。

5.结论

还有许多其他 Java 框架,它们不是全栈或 Web 开发框架,但在每个应用程序中都很有用——比如用于日志记录的 log4j、用于测试的 Junit 和 Selenium 等等。尽管您可以随时随地学习它们以及您在上面列表中看到的其他框架,但了解这些是非常必要的。

您的应用程序的最佳框架应该满足您的业务需求,提供一定程度的灵活性和最佳性能,并且易于维护和吸收变化。

例如,对于全栈 Web 开发框架,如果需要更改某些内容,它应该对应用程序的影响最小,即您不必为小的更改再次构建和部署应用程序。只需更改配置就可以发挥作用。此类应用程序可节省停机时间并提供灵活性。

明智地选择合适的Java 框架,可以更好的享受 Java 提供的功能特性和优秀的基础性支持。当然还有其它一些优秀的框架如ShardingSphere等,作为2022年的开年第一篇,就写到这了—— 2022开始了,希望每位都能站在巨人的肩膀上,创造更大价值,成就更好自我!撸起袖子加油干!

你都使用了或使用过哪些框架呢?请在留言区分享出来吧,也说说你的体会和心得。

文章来源:智云一二三科技

文章标题:新年伊始:2022,这10大最佳Java框架值得你选择

文章地址:https://www.zhihuclub.com/184110.shtml

关于作者: 智云科技

热门文章

评论已关闭

6条评论

  1. This graphic shows a drug blue preventing the production of estrogen from a red chemical

  2. Cefepime for Injection, USP cefepime hydrochloride, USP is a semi synthetic, cephalosporin antibacterial for parenteral administration

  3. Your doctor may instruct you to follow a low sodium, low salt, potassium rich, or high protein diet Here is what I tell my patients

网站地图