spring mvc 是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc 是啥相关的知识,希望对你有一定的参考价值。
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由html元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.
如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
模型
模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
为什么要使用 MVC
大部分Web应用程序都是用像ASP,php,或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。
首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。
由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。
因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从mysql移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松偶合的构件。
对我来说,控制器的也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
MVC的缺点
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。
你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。
根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。
MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
MVC是一条创建软件的好途径
MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
Java开发Web Application有几种符合MVC设计模式的开发方式。
1:Jsp+Servlet+JavaBean(EJB)
2:Jsp+JavaBean(Controller)+JavaBean(EJB)(Model)
3:TDK(Turbine,Velocity...)
4:Xsp
5:Jsp+Struts+JavaBean(EJB)
附:
三层架构即“表现层”,“业务层”,“持久化层”。表现层实现的代表作品是Struts框架,业务层实现的代表作品是Spring,持久层实现的代表作品是Hibernate。
举个例子。
持久层从持久库中取出-10。
业务层按照一定的逻辑(这里我们举例取温度的逻辑)翻译成-10摄氏度。
表示层显现给用户“哎呀,今天好冷!”。
层就相当于一个黑盒子,我们不用知道它内部怎么实现,只需要知道如何去调用它就行了。每层只与上下相邻的两层打交道。当一层内部由于技术变迁发生变化时,只要接口不变,其他层不用做任何改变。分层之后灵活性提高,也便于团队分工开发。
呵呵,写的很详细吧。希望对你有帮助。 参考技术A Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。 参考技术B Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。
Spring3 MVC的优点:
1、Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。
2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)
3、Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。本回答被提问者和网友采纳 参考技术C spring mvc是一个实现MVC模式的框架,spring mvc是spring的一部分
mvc就是使你的程序能有更好的分层感 参考技术D Spring Web MVC的工作流程如下:
1. 浏览器发出spring mvc请求,请求交给前端控制器DispatcherServlet处理。
2. 控制器通过HandlerMapping维护的请求和Controller映射信息,找到相应的Controller组件处理请求。
3. 执行Controller组件约定方法处理请求,在约定方法中可以调用Service和DAO等组件完成数据库操作。约定方法可以返回一个ModelAndView对象,封装了模型数据和视图名称信息。
4. 控制器接收ModelAndView之后,调用ViewResolver组件,定位View的JSP并传递Model信息,生成响应界面结果。
在 Spring MVC 中获取当前 URL 的最佳方法是啥?
【中文标题】在 Spring MVC 中获取当前 URL 的最佳方法是啥?【英文标题】:What's the best way to get the current URL in Spring MVC?在 Spring MVC 中获取当前 URL 的最佳方法是什么? 【发布时间】:2010-12-02 05:26:35 【问题描述】:我想根据客户端用于活动请求的 URL 创建 URL。有什么比采用当前的 HttpServletRequest
对象更聪明的方法,它是 getParameter...()
方法来重建完整的 URL,包括(且仅)它的 GET 参数。
澄清:如果可能,我想放弃使用HttpServletRequest
对象。
【问题讨论】:
【参考方案1】:嗯,有两种方法可以更轻松地访问这些数据,但该界面不提供一次调用获取整个 URL 的可能性。您必须手动构建它:
public static String makeUrl(HttpServletRequest request)
return request.getRequestURL().toString() + "?" + request.getQueryString();
我不知道如何使用任何 Spring MVC 工具来做到这一点。
如果您想访问当前请求而不将其传递到任何地方,您必须在 web.xml 中添加一个侦听器:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
然后用这个来获取绑定到当前线程的请求:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
【讨论】:
好的,这与我目前所做的类似。但我正在寻找一种无需实际使用HttpServletRequest
对象的方法。这是因为我使用了几个辅助类/方法,我不想每次都传递请求对象。
好的,我知道你的意思,并添加了访问当前请求所需的信息,而无需传递它。
感谢听众的提醒。我对 Spring(以及一般的 Java Web 开发)仍然很陌生。我现在将您的代码与 Spring Security 的UrlUtils
结合使用。像魅力一样工作。
在我的例子中,它给出了相关的视图路径而不是浏览 url。对此有任何想法吗?
不使用 HttpServletRequest... Spring Boot 控制器方法中的示例,我们没有将其作为参数...然后静态调用的另一个答案看起来不错 ServletUriComponentsBuilder.fromCurrentRequest().toUriString( )【参考方案2】:
除了直接使用RequestContextHolder
,还可以使用ServletUriComponentsBuilder
及其静态方法:
ServletUriComponentsBuilder.fromCurrentContextPath()
ServletUriComponentsBuilder.fromCurrentServletMapping()
ServletUriComponentsBuilder.fromCurrentRequestUri()
ServletUriComponentsBuilder.fromCurrentRequest()
它们在底层使用RequestContextHolder
,但提供了额外的灵活性来使用UriComponentsBuilder
的功能构建新的URL。
例子:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
【讨论】:
@m4rtin 我回答了我自己的问题,不想把最初帮助我解决问题的人归功于自己。 对 Spring 5 也有好处。我已经设法在ConstraintValidator
和 ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
中获取 URL。【参考方案3】:
Java 的 URI 类可以帮你解决这个问题:
public static String getCurrentUrl(HttpServletRequest request)
URL url = new URL(request.getRequestURL().toString());
String host = url.getHost();
String userInfo = url.getUserInfo();
String scheme = url.getProtocol();
String port = url.getPort();
String path = request.getAttribute("javax.servlet.forward.request_uri");
String query = request.getAttribute("javax.servlet.forward.query_string");
URI uri = new URI(scheme,userInfo,host,port,path,query,null)
return uri.toString();
【讨论】:
只提供主机名【参考方案4】:在jsp文件中:
request.getAttribute("javax.servlet.forward.request_uri")
【讨论】:
【参考方案5】:您还可以在控制器方法的方法签名中添加UriComponentsBuilder
。 Spring 将注入从当前请求创建的构建器实例。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder)
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
使用构建器,您可以根据当前请求直接开始创建 URI,例如修改路径段。
另见UriComponentsBuilderMethodArgumentResolver
【讨论】:
注意注入的UriComponentsBuilder
不包含请求的路径和查询参数。如果您需要访问这些,请使用ServletUriComponentsBuilder.fromCurrentRequest()
或注入HttpServletRequest
的实例并使用ServletUriComponentsBuilder.fromRequest(request)
【参考方案6】:
如果您需要 URL 直到主机名而不是路径,请使用 Apache 的 Common Lib StringUtil
,并从 URL 中提取子字符串直到第三个 indexOf /
。
public static String getURL(HttpServletRequest request)
String fullURL = request.getRequestURL().toString();
return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3));
示例:如果 fullURL 是 https://example.com/path/after/url/
那么
输出将是https://example.com
【讨论】:
【参考方案7】:System.out.println(((HttpServletRequest)request).getRequestURI());
我用过。希望有用。
【讨论】:
以上是关于spring mvc 是啥的主要内容,如果未能解决你的问题,请参考以下文章
请问各位大师:spring mvc中下面报的这个错是啥原因?应该如何解决?