赞
踩
spring框架:解决了创建对象并管理对象的问题,需要哪一个对象只需要去Spring容器去获取就行了,不需要去new了,
包括一个类的属性,它需要有值,我们可以通过自动装配的形式给它一个值,或者读配置文件里面用@value注解给值,就不用自己给值了。
1、Spring帮助创建bean并统一管理这些bean
2、Spring是轻量级的(jar比较小)的开源的javaEE框架(解决企业应用开发的复杂性)
3、Spring的核心是IOC和AOP
(1)IOC:控制反转,把创建对象的过程交给Spring管理
(2)AOP:面向切面,在不修改代码的情况下进行功能增强
4、关于Spring框架的特点
(1)方便解耦,简化代码
(2)AOP支持
(3)方便测试(整合Junit4)
(4)方便和其他的框架结合(也可以自己单独使用,整合框架如Struts2,Hibernate等)
(5)降低JavaEE API的使用难度(JDBC)
(6)方便对事物的操作
下面是一些百度百科:
编辑
本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
编辑
Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。 [2] Spring是一个开源容器框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。 [3] Spring是独特的,因为若干个原因:
它定位的领域是许多其他流行的framework没有的。Spring致力于提供一种方法管理你的业务对象。
Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。
它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。
Spring对你的工程来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。
编辑
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。它的底层设计模式采用了工厂模式,所有的 Bean 都需要注册到Bean工厂中,将其初始化和生命周期的监控交由工厂实现管理。程序员只需要按照规定的格式进行Bean开发,然后利用XML文件进行bean 的定义和参数配置,其他的动态生成和监控就不需要调用者完成,而是统一交给了平台进行管理。 [4] 控制反转是软件设计大师 Martin Fowler在 2004 年发表的”Inversion of Control Containers and the Dependency Injection pattern”提出的。这篇文章系统阐述了控制反转的思想,提出了控制反转有依赖查找和依赖注入实现方式。控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的名字就可以得到这个类的实例,与传统的编程方式有了很大的不同,“不用你找,我来提供给你”,这就是控制反转的含义 [5] 。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
编辑
强大的基于 JavaBeans的采用控制反转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组件更加快捷简易。一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。
数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。
内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的 JTA 或者 EJB CMT 相反。
JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量。 再次利用JDBC时,你无需再写出另一个 '终止' (finally) 模块。并且面向JDBC的异常与Spring 通用数据访问对象(Data Access Object) 异常等级相一致.
以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的反转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题。所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范。
灵活的基于核心Spring 功能的 MVC网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。
提供诸如事务管理等服务的面向切面编程(AOP)框架。
编辑
1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
7.Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
编辑
Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有API的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经我们可能对类是否有某个属性会感到迷惑,因此我们不得不去看它的javadoc或源码。自从有了Spring,你可很简单地看到类的JavaBean属性。反转控制的使用(在下面讨论)帮助完成这种简化。
Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
使用Spring构建的应用程序易于单元测试。
Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
1.低侵入式设计,代码污染极低
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
Spring提供许多功能,在此我将快速地依次展示其各个主要方面。
首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。
Spring的主要目的是使JavaEE易用和促进好编程习惯。
Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/R mapping层,对此,已有友好的解决办法如Hibernate和JDO。Spring的目标是使已存在的技术更加易用。
例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。
Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,像许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)
Spring也得益于内在的一致性。
所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。
并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。
Spring在应用服务器之间是可移植的。
当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户。
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图所示:
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开 [3] 。
2、Spring 上下文:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
3、Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
4、Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5、Spring ORM:负责框架中对象关系映射,提供相关ORM 接入框架的关系对象管理工具 [2] 。Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6、Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
7、Spring MVC 框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立应用程序、测试环境之间重用。
下载和安装Spring请按如下步骤进行。
(1)登录站点,下载Spring的最新稳定版本。最新版本为spring-framework-5.0.建议下载spring-framework-spring-framework-4.0.0.M2-dist这个压缩包不仅包含Spring的开发包,而且包含Spring编译和运行所依赖的第三方类库。
解压缩下载到的压缩包,解压缩后的文件夹应用如下几个文件夹。
dist:该文件夹下放Spring的jar包,通常只需要Spring.jar文件即可。该文件夹下还有一些类似spring-Xxx.jar的压缩包, 这些压缩包是spring.jar压缩包的子模块压缩包。除非确定整个J2EE应用只需要使用Spring的某一方面时,才考虑使用这种分模块压缩包。通常建议使用Spring.jar
docs:该文件夹下包含spring的相关文档、开发指南及API参考文档。
lib:该文件夹下包含spring编译和运行所依赖的第三方类库,该路径下的类库并不是spring必需的,但如果需要使用第三方类库的支持,这里的类库就是必需要的。
samples:该文件夹下包含Spring的几个简单例子,可作为Spring入门学习的案例。
src:该文件夹下包含Spring的全部源文件,如果开发过程中有地方无法把握,可以参考该源文件,了解底层实现。
test:该文件夹下包含Spring的测试示例。
tiger:该路径下存放关于JDK的相关内容
解压缩后的文件夹下,还包含一些关于Spring的License和项目相关文件
(2)将spring.jar复制到项目的CLASSPATH路径下,对于Web应用,将spring.jar文件复制到WEB-INF/lib路径下,该应用即可以利用Spring框架了。
(3)通常Spring的框架还依赖于其他一些jar文件,因此还须将lib下对应的包复制到WEB-INF/lib路径下,具体要复制哪些jar文件,取决于应用所需要使用的项目。通常需要复制cglib,dom4j,jakarta-commons,log4j等文件夹下的jar文件。
(4)为了编译java文件,可以找到Spring的基础类,将Spring.jar文件的路径添加到环境变量CLASSPATH中。当然,也可以使用ANT工具,但无须添加环境变量。如果使用Eclipse或者NetBeans等IDE时,也不需要设置环境变量。
Spring MVC主要解决了V-C交互的问题,(和M没有关系),即如何使用控制器接受请求并给与响应的问题。
MVC:Moder(数据模型)+View(视图)+Controller(控制器)
SpringBoot框架可以简单的当作为一个“加强版的SpringMVC框架”,相比直接创建SpringMVC框架的项目,如果创建的是
SpringBoot框架的项目,可以不必添加非常用依赖,也可以省去大量的常规配置!
简化了配置的问题
SpringBoot里面有大量的自动配置,目前SpringBoot框架已经成为了行业的主流的基础的框架,相当于“组装”
创建项目时,选择 Spring Initializr 的创建向导:
当创建项目时,在以上界面点击下一步后长时间无响应时,应该在以上界面的右侧选中 Custom ,并使用 https://start.springboot.io 网址并再次点击下一步。
在接下来的界面中确定当前项目的一些参数,例如Group、Artifact、Java Version等:
在选择依赖的界面,在左侧选择 Web ,在右侧勾选 Spring Web :
完成后,项目即创建完成,第1次使用时,开发工具会自动下载大量依赖。
注意:这个包是SpringBoot默认指定的组件扫描的包,所以,项目中的各组件都必须放在这个包或其 子孙包中!
在这个包中,默认已经存在 SpringmvcApplication 类,类的名称是创建项目时指定的Artifact决定 的:
这个类中有 main() 方法,执行这个 main() 方法就可以启动整个项目,所以,这个类也称之为“启动 类”。
启动成功后,控制台输出内容例如:
通过启动日志可以看到,启动当前项目时是启动了Tomcat的,并将项目部署在 8080 端口,这个 Tomcat是当前项目内置的!
另外,通过以上启动日志可以看到Tomcat在部署当前项目时配置的Context Path是空值:
所以,后续在访问当前项目时,在URL中端口号的右侧不必再添加项目名称或对应的路径值!
在项目的 src/main/resources 下默认就存在 application.properties 文件,这个文件是项目的配 置文件:
SpringBoot框架会自动读取项目中的配置,并且,SpringBoot还约定框架相关配置的属性名称,所 以,除非是编写自定义的配置,否则,各配置的属性名称是相对固定的!
如果需要指定当前项目启动时,将Tomcat启动在哪个端口,可以添加配置:
如果使用的是MacOS或Linux操作系统,可能无法直接将端口号修改为 80 ,因为操作系统将 80 端口视为敏感端口,需要事先修改操作系统的设置才可以使用。
在SpringBoot项目中,如果创建项目时就已经勾选了 Spring Web 依赖,默认情况下在 src\main\resources 下就已经创建好了 static 文件夹:
该文件夹是SpringBoot框架默认的静态资源文件夹,项目中的静态资源应该放在这个文件夹之下,例 如 .html 、 .css 、 .js 、图片文件等,例如,在 static 文件夹下创建 index.html :
完成后,重启项目,打开浏览器,输入 http://localhost 即可访问这个页面! SpringBoot框架将 index.html 设置为默认访问的资源,所以,如果需要访问的是 http://localho st/index.html,在URL中可以不必显式的指定资源名,即使用 http://localhost 即可!
在传统Java EE项目中是使用Servlet组件(自定义类继承自 HttpServlet )作为控制器的,在 SpringMVC框架中可以自定义任何类作为控制器类,推荐使用 Controller 作为类名的最后一个单词, 并且在类的声明之前添加 @Controller 注解即可将该类配置为控制器类!例如,在 cn.tedu.springmvc 包中创建 UserController 类并添加 @Controller 注解:
在传统的Java EE中,如果需要处理客户端提交的请求,需要在Servlet类之前添加注解来配置请求路 径,并重写Servlet中的 doGet() 或 doPost() 方法来处理GET或POST类型的请求,在SpringMVC中:
例如:
完成后,重启项目,在浏览器中通过 http://localhost/hello 即可测试访问,在浏览器中将可以看到 OK 字样,并且在IntelliJ IDEA的控制台可以看到以上输出的内容!
同一个控制器中可以有若干个处理请求的方法,例如此前练习的“用户注册”页面可以将请求路径设计 为 /register :
完成后,重启项目,在浏览器重新打开 http://localhost/register.html(如果已经打开,则需要刷 新),可以不必输入任何内容,直接点击提交按钮,在浏览器将可以看到 Register OK 字样,并且在 IntelliJ IDEA的控制台可以看到以上输出的内容!
在 register.html 中,为表单中的各控件配置 name 属性就可以设置请求参数的名称,例如:
在SpringMVC中,如果需要接收这些请求参数,直接将各请求参数声明为处理请求的方法的参数即可, 例如:
完成后,即可重启项目,观察运行结果。
【练习】
自行设计 login.html 页面,页面中需要用户名、密码的输入框和提交按钮,提交请求后,服务器端可 以接收到用户名和密码的值。
使用以上做法接收请求参数时,如果客户端提交的请求参数的数量较多,就会导致处理请求的方法的参 数列表中需要声明对应的多个参数,为了避免参数的数量过多,可以将客户端提交的多个请求参数进行 封装!例如,创建 User 类:
- public class User {
- public String username;
- public String password;
- public Integer age;
- public String phone;
- public String email;
-
- // SETTERS & GETTERS // toString() }
提示:以上各属性的访问权限并不重要!
然后,将处理请求的方法的参数列表中使用该类型即可:
完成后,再次重启项目,重新提交表单,可以看到仍正常接收请求参数!
所以,在SpringMVC框架中,当需要接收客户端提交的请求参数时,可以将各参数直接声明为处理请求 的方法的参数,也可以将这些请求参考封装起来,理论上来说,如果请求参数的数量较少且可控,则直 接声明即可,如果请求参数的数量较多或可能发生调整,应该封装,实际情况是应该封装,除非请求参 数只有1个
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
在SpringBoot中,当创建项目时勾选了 Spring Web 的依赖后,默认在 src/main/resources 下就已经 创建好了 templates 文件夹:
这个 templates 文件夹就是SpringBoot项目中用于存放模版页面的文件夹!
在 templates 下创建 hello.html 文件:
然后,在 UserController 中,将原本的 hello() 方法上的 @ResponseBody 删除,并将返回值改为 hello :
完成后,重启项目,再次访问 http://localhost/hello 即可看到所设计的 hello.html 网页!
在以上操作中,首先删除了 @ResponseBody 注解,该注解的作用是“将方法返回的数据直接响应到客户 端”,简称“响应正文”! 然后,在处理请求的方法中,返回了 "hello" 字符串,是因为SpringMVC框架中,当控制器中处理请 求的方法的返回值类型是 String 时,表示“返回视图名称”,即“由哪个视图来负责响应”,当前项目是添 加了SpringBoot整合Thymeleaf的依赖,其对“视图名称”的处理方法是根据 /templates/ 与视图名称 与 .html 来确定由哪个文件负责响应,即:
"/template/" + 返回值 + ".html" = "/templates/hello.html"
所以,拼接出来的结果就是视图文件(HTML文件)的位置!所以,当HTML文件直接放在 templates 下,而并不在其子级文件夹中时,也可以简单的理解为“返回的字符串就是文件名”!
【练习】
在 templates 下创建 success.html 页面用于表示“成功”时显示的页面,再创建 error.html 用于表示 “失败”时显示的页面,当用户提交登录时,如果用户名和密码分别是 root 和 1234 ,则视为登录成功, 否则视为登录失败,无论成功或失败都应该显示对应的页面!
当控制器向模版页面转发时需要将数据交给模版页面去显示时,需要在处理请求的方法的参数列表中添 加 ModelMap 类型的参数,并在处理过程中,调用该参数对象的 addAttribute() 方法封装数据:
后续,在页面中需要显示数据时,通过Thymeleaf表达式来显示数据即可:
完成后,重启项目,在登录时分别使用错误的用户名和错误的密码即可看到执行效果!
在SpringMVC中,当控制器处理请求的方法的返回值类型是 String 且没有添加 @ResponseBody 时, 返回值使用 redirect:目录路径 即可实现重定向,例如:
附:关于IntelliJ IDEA
推荐使用 2020.1.4 版本,下载地址:https://download.jetbrains.com/idea/ideaIU-2020.1.4.e xe?_ga=2.198051626.486225534.1604541018944415361.1604541018&_gl=142h5b0gaOTQ0NDE1MzYxLjE2MDQ1NDEwMTg.ga_V0XZL7QH EB*MTYwNDU0MTAxOS4xLjEuMTYwNDU0MTAzMi4w 附:关于端口被占用的解决方案
该方法适用于Windows操作系统中所有端口被占用的情况。
在IntelliJ IDEA的终端端口中,或在操作系统的CMD命令提示符窗口中输入以下命令:
以上命令最后的80表示查找端口使用情况中与80这个数字相关的记录,如果是其它端口被占 用,则命令的80换成其它端口号。
当执行成功后,在结果的列表中找出占用80端口的进程的ID,例如以下结果中,占用80端口的 PID(Process ID)就是14788:
然后,在任务管理器中找到14788对应的进程(如果使用的是Windows 7操作系统,在任务管 理器的菜单中的“查看”菜单中“选择列”并勾选PID即可),将该进程直接终止即可:
如果在终端或CMD窗口中根本不识别netstat命令,需要将C:\Windows\System32这个路径 配置到系统的环境变量PATH中,然后,重启IntelliJ IDEA或CMD窗口再执行!
传统的web架构的view 表现层使用struts作为表现层。但是如果试用下spring自带的MVC,会发现spring 在一般场合完全可以取代struts。从某些角度来说,spring的mvc设计的更加合理,有兴趣的话不妨尝试下单个的spring的MVC。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。