当前位置: 首页 > news >正文

鲜花网站建设规模设想手机网站怎么搭建

鲜花网站建设规模设想,手机网站怎么搭建,网页编程代码,网站ip域名查询转载自 Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分——Spring Web MVC的强大功能及其内部工作原理。 这篇文章的源代码可以在GitHub上找到。 项目安装 在本文中#xff0c;我们将使用最新、最好的Spring Framework 5。我们将重点介绍Spring的经典…转载自  Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分——Spring Web MVC的强大功能及其内部工作原理。 这篇文章的源代码可以在GitHub上找到。 项目安装 在本文中我们将使用最新、最好的Spring Framework 5。我们将重点介绍Spring的经典Web堆栈该堆栈从框架的第一个版本中就崭露头角并且现在依然是用Spring构建Web应用程序的主要方式。 对于初学者来说为了安装测试项目最好使用Spring Boot和一些初学者依赖项还需要定义parent parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.0.M5/versionrelativePath/ /parent dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependency /dependencies 请注意为了使用Spring 5我们还需要使用Spring Boot 2.x。截止到撰写本文之时这依然是里程碑发布版可在Spring Milestone Repository中找到。让我们把这个存储库添加到你的Maven项目中 repositoriesrepositoryidspring-milestones/idnameSpring Milestones/nameurlhttps://repo.spring.io/milestone/urlsnapshotsenabledfalse/enabled/snapshots/repository ​​​​​​​/repositories 你可以在Maven Central上查看Spring Boot的当前版本。 示例项目 为了理解Spring Web MVC是如何工作的我们将通过一个登录页面实现一个简单的应用程序。为了显示登录页面我们需要为上下文根创建带有GET映射的Controller注解类InternalController。 hello()方法是无参数的。它返回一个由Spring MVC解释为视图名称的String在示例中是login.html模板 import org.springframework.web.bind.annotation.GetMapping; GetMapping(/) public String hello() {return login; } 为了处理用户登录需要创建另一个用登录数据处理POST请求的方法。然后根据结果将用户重定向到成功或失败的页面。 请注意login()方法接收域对象作为参数并返回ModelAndView对象 import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; PostMapping(/login) public ModelAndView login(LoginData loginData) {if (LOGIN.equals(loginData.getLogin()) PASSWORD.equals(loginData.getPassword())) {return new ModelAndView(success, Collections.singletonMap(login, loginData.getLogin()));} else {return new ModelAndView(failure, Collections.singletonMap(login, loginData.getLogin()));} } ModelAndView是两个不同对象的持有者 Model——渲染页面数据的键值映射 View——填充模型数据的页面模板 连接这些是为了方便这样控制器方法可以一次返回它们。 要渲染HTML页面使用Thymeleaf作为视图模板引擎该引擎具有可靠和开箱即用的与Spring的集成。 Servlet作为Java Web应用程序的基础 那么当在浏览器中输入http:// localhost:8080/时按Enter键然后请求到达Web服务器实际发生了什么你如何从这个请求中看到浏览器中的Web表单 鉴于该项目是一个简单的Spring Boot应用程序因此可以通过Spring5Application运行它。 Spring Boot默认使用Apache Tomcat。因此运行应用程序时你可能会在日志中看到以下信息 2017-10-16 20:36:11.626 INFO 57414 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2017-10-16 20:36:11.634 INFO 57414 --- [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2017-10-16 20:36:11.635 INFO 57414 --- [main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.23 由于Tomcat是一个Servlet容器因此发送给Tomcat Web服务器的每个HTTP请求自然都由Java servlet处理。所以Spring Web应用程序入口点是一个servlet这并不奇怪。 简单地说servlet就是任何Java Web应用程序的核心组件它是低层次的不会像MVC那样在特定的编程模式中诸多要求。 一个HTTP servlet只能接收一个HTTP请求以某种方式处理然后发回一个响应。 而且从Servlet 3.0 API开始你现在可以超越XML配置并开始利用Java配置只有很小的限制条件。 DispatcherServlet作为Spring MVC的核心 作为一个Web应用程序的开发人员我们真正想要做的是抽象出以下繁琐和模板化的任务并专注于有用的业务逻辑 将HTTP请求映射到某个处理方法 将HTTP请求数据和标题解析成数据传输对象DTO或域对象 模型 – 视图 – 控制器集成 从DTO、域对象等生成响应 Spring DispatcherServlet能够提供这些。它是Spring Web MVC框架的核心此核心组件接收所有请求到应用程序。 正如你所看到的DispatcherServlet是非常可扩展的。例如它允许你插入不同的现有或新的适配器进行大量的任务 将请求映射到应该处理它的类或方法HandlerMapping接口的实现 使用特定模式处理请求如常规servlet更复杂的MVC工作流或POJO bean中的方法HandlerAdapter接口的实现 按名称解析视图允许你使用不同的模板引擎XMLXSLT或任何其他视图技术ViewResolver接口的实现 通过使用默认的Apache Commons文件上传实现或编写你自己的MultipartResolver来解析多部分请求 使用任何LocaleResolver实现解决语言环境包括cookie会话Accept HTTP头或任何其他确定用户所期望的语言环境的方式 处理HTTP请求 首先我们将简单的HTTP请求的处理追踪到在控制器层中的一个方法然后返回到浏览器/客户端。 DispatcherServlet具有很长的继承层次结构自上而下地逐个理解这些是有价值的。请求处理方法最让我们感兴趣。 理解HTTP请求无论是在本地还是远程的标准开发中都是理解MVC体系结构的关键部分。 GenericServlet GenericServlet是Servlet规范的一部分不直接关注HTTP。它定义了接收传入请求并产生响应的service()方法。 注意ServletRequest和ServletResponse方法参数如何与HTTP协议无关 public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; 这是最终被任何请求调用到服务器上的方法包括简单的GET请求。 HttpServlet 顾名思义HttpServlet类就是规范中定义的基于HTTP的Servlet实现。 更实际的说HttpServlet是一个抽象类有一个service()方法实现service()方法实现通过HTTP方法类型分割请求大致如下所示 protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method req.getMethod(); if (method.equals(METHOD_GET)) { // ...doGet(req, resp);} else if (method.equals(METHOD_HEAD)) { // ...doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp); // ...} HttpServletBean 接下来HttpServletBean是层次结构中第一个Spring-aware类。它使用从web.xml或WebApplicationInitializer接收到的servlet init-param值来注入bean的属性。 在请求应用程序的情况下doGet()doPost()等方法应特定的HTTP请求而调用。 FrameworkServlet FrameworkServlet集成Servlet功能与Web应用程序上下文实现了ApplicationContextAware接口。但它也能够自行创建Web应用程序上下文。 正如你已经看到的HttpServletBean超类注入init-params为bean属性。所以如果在servlet的contextClass init-param中提供了一个上下文类名那么这个类的一个实例将被创建为应用程序上下文。否则将使用默认的XmlWebApplicationContext类。 由于XML配置现在已经过时Spring Boot默认使用AnnotationConfigWebApplicationContext配置DispatcherServlet。但是你可以轻松更改。 例如如果你需要使用基于Groovy的应用程序上下文来配置Spring Web MVC应用程序则可以在web.xml文件中使用以下DispatcherServlet配置 dispatcherServletorg.springframework.web.servlet.DispatcherServletcontextClassorg.springframework.web.context.support.GroovyWebApplicationContext 使用WebApplicationInitializer类可以用更现代的基于Java的方式来完成相同的配置。 DispatcherServlet统一请求处理 HttpServlet.service()实现会根据HTTP动词的类型来路由请求这在低级servlet的上下文中是非常有意义的。然而在Spring MVC的抽象级别方法类型只是可以用来映射请求到其处理程序的参数之一。 因此FrameworkServlet类的另一个主要功能是将处理逻辑重新加入到单个processRequest()方法中processRequest()方法反过来又调用doService()方法 Override protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {processRequest(request, response); } Override protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {processRequest(request, response); }// … DispatcherServlet丰富请求 最后DispatcherServlet实现doService()方法。在这里它增加了一些可能会派上用场的有用对象到请求Web应用程序上下文区域解析器主题解析器主题源等 request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext()); request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver); request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver); request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource()); 另外doService()方法准备输入和输出Flash映射。Flash映射基本上是一种模式该模式将参数从一个请求传递到另一个紧跟的请求。这在重定向期间可能非常有用例如在重定向之后向用户显示一次性信息消息 FlashMap inputFlashMap this.flashMapManager.retrieveAndUpdate(request, response);if (inputFlashMap ! null) {request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap)); } request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap()); 然后doService()方法调用负责请求调度的doDispatch()方法。 DispatcherServlet调度请求 dispatch()方法的主要目的是为请求找到合适的处理程序并为其提供请求/响应参数。处理程序基本上是任何类型的object不限于特定的接口。这也意味着Spring需要为此处理程序找到适配器该处理程序知道如何与处理程序“交谈”。 为了找到匹配请求的处理程序Spring检查HandlerMapping接口的注册实现。有很多不同的实现可以满足你的需求。 SimpleUrlHandlerMapping允许通过URL将请求映射到某个处理bean。例如可以通过使用java.util.Properties实例注入其mappings属性来配置就像这样 /welcome.htmlticketController /show.htmlticketController 可能处理程序映射最广泛使用的类是RequestMappingHandlerMapping它将请求映射到Controller类的 RequestMapping注释方法。这正是使用控制器的hello()和login()方法连接调度程序的映射。 请注意Spring-aware方法使用GetMapping和PostMapping进行注释。这些注释依次用RequestMapping元注释标记。 dispatch()方法还负责其他一些HTTP特定任务 在资源未被修改的情况下GET请求的短路处理 针对相应的请求应用多部分解析器 如果处理程序选择异步处理该请求则会短路处理该请求 处理请求 现在Spring已经确定了请求的处理程序和处理程序的适配器是时候来处理请求了。下面是HandlerAdapter.handle()方法的签名。请注意处理程序可以选择如何处理请求 自主地编写数据到响应对象并返回null 返回由DispatcherServlet呈现的ModelAndView对象 NullableModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; 有几种提供的处理程序类型。以下是SimpleControllerHandlerAdapter如何处理Spring MVC控制器实例不要将其与 Controller注释POJO混淆。 注意控制器处理程序如何返回ModelAndView对象并且不自行呈现视图 public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return ((Controller) handler).handleRequest(request, response); } 第二个是SimpleServletHandlerAdapter它将常规的Servlet作为请求处理器。 Servlet不知道任何有关ModelAndView的内容只是简单地自行处理请求并将结果呈现给响应对象。所以这个适配器只是返回null而不是ModelAndView public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {((Servlet) handler).service(request, response); return null; } 我们碰到的情况是控制器是有若干RequestMapping注释的POJO所以任何处理程序基本上是包装在HandlerMethod实例中的这个类的方法。为了适应这个处理器类型Spring使用RequestMappingHandlerAdapter类。 处理参数和返回处理程序方法的值 注意控制器方法通常不会使用HttpServletRequest和HttpServletResponse而是接收和返回许多不同类型的数据例如域对象路径参数等。 此外要注意我们不需要从控制器方法返回ModelAndView实例。可能会返回视图名称或ResponseEntity或将被转换为JSON响应等的POJO。 RequestMappingHandlerAdapter确保方法的参数从HttpServletRequest中解析出来。另外它从方法的返回值中创建ModelAndView对象。 在RequestMappingHandlerAdapter中有一段重要的代码可确保所有这些转换魔法的发生 ServletInvocableHandlerMethod invocableMethod createInvocableHandlerMethod(handlerMethod); if (this.argumentResolvers ! null) {invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); } if (this.returnValueHandlers ! null) {invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); } argumentResolvers对象是不同的HandlerMethodArgumentResolver实例的组合。 有超过30个不同的参数解析器实现。它们允许从请求中提取任何类型的信息并将其作为方法参数提供。这包括URL路径变量请求主体参数请求标头cookies会话数据等。 returnValueHandlers对象是HandlerMethodReturnValueHandler对象的组合。还有很多不同的值处理程序可以处理方法的结果来创建适配器所期望的ModelAndViewobject。 例如当你从hello()方法返回字符串时ViewNameMethodReturnValueHandler处理这个值。但是当你从login()方法返回一个准备好的ModelAndView时Spring会使用ModelAndViewMethodReturnValueHandler。 渲染视图 到目前为止Spring已经处理了HTTP请求并接收了ModelAndView对象所以它必须呈现用户将在浏览器中看到的HTML页面。它基于模型和封装在ModelAndView对象中的选定视图来完成。 另外请注意我们可以呈现JSON对象或XML或任何可通过HTTP协议传输的其他数据格式。我们将在即将到来的REST-focused部分接触更多。 让我们回到DispatcherServlet。render()方法首先使用提供的LocaleResolver实例设置响应语言环境。假设现代浏览器正确设置了Accept头并且默认使用AcceptHeaderLocaleResolver。 在渲染过程中ModelAndView对象可能已经包含对所选视图的引用或者只是一个视图名称或者如果控制器依赖于默认视图则什么都没有。 由于hello()和login()方法两者都指定所需的视图为String名称因此必须用该名称查找。所以这是viewResolvers列表开始起作用的地方 for (ViewResolver viewResolver : this.viewResolvers) {View view viewResolver.resolveViewName(viewName, locale);if (view ! null) {return view;} } 这是一个ViewResolver实例列表包括由thymeleaf-spring5集成库提供的ThymeleafViewResolver。该解析器知道在哪里搜索视图并提供相应的视图实例。 在调用视图的render()方法后Spring最终通过发送HTML页面到用户的浏览器来完成请求处理。 REST支持 除了典型的MVC场景之外我们还可以使用框架来创建REST Web服务。 简而言之我们可以接受Resource作为输入指定POJO作为方法参数并使用RequestBody对其进行注释。也可以使用ResponseBody注释方法本身以指定其结果必须直接转换为HTTP响应 import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; ResponseBody PostMapping(/message) public MyOutputResource sendMessage(RequestBody MyInputResource inputResource) {return new MyOutputResource(Received: inputResource.getRequestMessage()); } 归功于Spring MVC的可扩展性这也是可行的。 为了将内部DTO编组为REST表示框架使用HttpMessageConverter基础结构。例如其中一个实现是MappingJackson2HttpMessageConverter它可以使用Jackson库将模型对象转换为JSON或从JSON转换。 为了进一步简化REST API的创建Spring引入了RestController注解。默认情况下这很方便地假定了ResponseBody语义并避免在每个REST控制器上的明确设置 import org.springframework.web.bind.annotation.RestController; RestController public class RestfulWebServiceController {GetMapping(/message)public MyOutputResource getMessage() {return new MyOutputResource(Hello!);} } 结论 在这篇文章中我们详细了介绍在Spring MVC框架中请求的处理过程。了解框架的不同扩展是如何协同工作来提供所有魔法的可以让你能够事倍功半地处理HTTP协议难题。
http://www.huolong8.cn/news/309802/

相关文章:

  • 郑州企业网站制作怎么做wordpress 评论ajax分页
  • seo网站排名优化软件是什么wordpress增加评论验证
  • 360建筑网官网网址宁波seo推荐
  • 国内专门做旅游攻略的网站wordpress学院主题
  • 家具网站建设食品购物网站建设
  • 怎建立自己网站做淘宝客餐饮管理培训课程
  • 自己做网站卖什么好郴州建设网站的公司
  • 企业网站建设市场前景公司取名字
  • 网站做优化按点击收费wordpress热门文章查询
  • 流量打不开网站怎么办优化什么意思
  • 网站开发岗位职责做网站备案实名需要钱吗
  • 网站建设进度及实过程网站备案单位查询系统
  • 中小型企业网站建设东营网站建设制作
  • 网站建设报价模块船舶cms是什么意思
  • 新网站多久被收录wordpress调用文章排序
  • 成都园林设计公司宁波正规优化seo公司
  • 网站建设专员工作总结电商平台要投资多少钱
  • 威海城乡建设局网站筹建网站信息技术
  • 营销型网站建设的特点深圳做网站 汉狮网络
  • 郑州东区做网站电话两岸统一最新消息
  • h5免费模板网站win7iis部署asp.net网站
  • 网站前台图片设置遵义市住房和城乡建设局官方网站6
  • 廊坊网站建设选择青橙网络温州营销网站公司
  • 网站建设推广软件新闻稿代写
  • 社交网站 ui工商局网站年检怎么做
  • so域名的网站有哪些中国建设银行网站忘记密码怎么办
  • 西安网站推广慧创科技业务型网站首页
  • 武昌做网站哪家好网站设计模板图片
  • 域名购买网站高端手机网站定制
  • 怎么用vscode做网站赣州唯宅汇科技有限公司