iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用springmvc
  • 177
分享到

如何使用springmvc

2023-06-25 11:06:38 177人浏览 八月长安
摘要

小编给大家分享一下如何使用springMVC,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.配置阶段根据WEB.xml ,先定义DispatcherServle

小编给大家分享一下如何使用springMVC,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

1.配置阶段

如何使用springmvc

根据WEB.xml ,先定义DispatcherServlet并且定义该sevlet传入的参数和路径。

2.初始化阶段

如何使用springmvc

初始化阶段中又可以分为ioc、DI和mvc阶段:

  • (1)IOC:初始化配置文件和ioC容器,扫描配置的包下的类,通过反射机制将需要实例化的类放入IOC容器,既将带有spring注解的类进行实例化后存放到 IOC 容器中。IOC容器的实质就是一个集合

  • (2)DI:DI阶段(其实就是依赖注入)。对需要赋值的实例属性进行赋值(一般较多都是处理带有注解的@Autowrized的属性)

  • (3)MVC:构造出HandlerMapping集合,主要作用就是用于存放对外公开的api和Method之间的关系,一个API一般会对应一个可执行的Method.

3.运行阶段

如何使用springmvc

运行阶段中,当接受到一个url后,会到HandleMapping集合中,找到对应Method、通过反射机制去执行invoker,再返回结果给调用方。

这样就大体完成了springmvc整个运行阶段,所描述的都仅为个人观点,如果有误请在评论中指出。

其整体流程可以参照下图:

如何使用springmvc

接下来就来尝试手写一个类似springmvc的框架了,这个手写的过程还是相当有成就感的!

创建一个空的javaweb工程,引入依赖,其实因为我们是要手写spring,所以基本不需要什么外部的依赖工具,只需要导入servlet-api即可,如下:

<dependency>      <groupId>javax.servlet</groupId>      <artifactId>servlet-api</artifactId>      <version>2.5</version>      <scope>provided</scope> </dependency>

根据上述的流程描述,接下来就是对web.xml进行配置:

 <servlet>        <servlet-name>appServlet</servlet-name>        <servlet-class>com.wanGCw.cwframework.sevlet.CwDispatcherServlet</servlet-class>        <init-param>          <param-name>contextConfigLocation</param-name>          <param-value>application.properties</param-value>        </init-param>        <load-on-startup>1</load-on-startup>      </servlet>      <servlet-mapping>        <servlet-name>appServlet</servlet-name>        <url-pattern> import java.lang.annotation.*; @Target({ElementType.TYPE})         @Retention(RetentionPolicy.RUNTIME)  @Documentedpublic @interface CwController {     String value() default "";}
 import java.lang.annotation.*; @Target({ElementType.FIELD})        @Retention(RetentionPolicy.RUNTIME)  @Documentedpublic @interface CwAutowried {     String value() default "";}
 import java.lang.annotation.*; @Target({ElementType.TYPE, ElementType.METHOD})          @Retention(RetentionPolicy.RUNTIME) @Documentedpublic @interface CwRequestMapping {     String value() default "";}
 import java.lang.annotation.*; @Target({ElementType.PARAMETER})        @Retention(RetentionPolicy.RUNTIME)  @Documentedpublic @interface CwRequestParam {     String value() default "";}
 import java.lang.annotation.*; @Target({ElementType.TYPE})         @Retention(RetentionPolicy.RUNTIME) @Documentedpublic @interface CwService {     String value() default "";}

创建一个简单的控制层和业务层交互 Demo,加上自定的注解,具体注解的功能,后面赘述。

Controller.java

@CwController  @CwRequestMapping("/demo")public class Controller {        @CwAutowried    private Service service;       @CwRequestMapping("/query")    public void query(httpservletRequest req, HttpServletResponse resp,@CwRequestParam("name") String name) throws IOException {              resp.getWriter().write(service.query(name));      }        @CwRequestMapping("/add")     public void add(HttpServletRequest req, HttpServletResponse resp, @CwRequestParam("a") Integer a, @CwRequestParam("b") Integer b) throws IOException {          resp.getWriter().write("a+b="+(a+b));      }  }

Service.java

public interface Service {          String query(String name); }

ServiceImpl.java

@CwServicepublic class ServiceImpl implements Service{        @Override      public String query(String name) {            return "I am "+name;      }  }

上面的controller层和service层已经把我们上述的自定注解都使用上去了,接下来我们开始手写spring的核心功能了,也就是实现CwDispatcherServlet.java这个HttpServlet的子类。

首先需要重写父类中的init方法,因为我们要在Init过程中实现出跟spring一样的效果。

理一理init()过程中都需要做哪些事情呢?整理了一下init()中主要需要以下几步操作

 @Override    public void init(ServletConfig config)  {                 doLoadConfig(config.getInitParameter("contextConfigLocation"));                  doScanner(contextConfig.getProperty("scanPackage"));                  doInstance();                  doAutowired();                  initHandlerMapping();     }

第一步很简单,在类中定义一个Properties实例,用于存放Servlet初始化的配置文件。导入配置代码略过,IO常规读写即可。

private Properties contextConfig = new Properties();

第二步通过上面获取到的配置,取到需要扫描的包路径,然后在根据路径找到对应文件夹,做一个递归扫描即可。将扫描到的文件名去除后缀,保存到一个集合中,那么该集合就存放了包下所有类的类名。

String  scanFileDir = contextConfig.getProperty("scanPackage");     private List<String> classNames = new ArrayList<String>();                  String  className = scanPackage + "." + file.getName().replace(".class", "");                classNames.add(className);

第三步就是IOC阶段,简而言之就是对上面集合中所有的类进行遍历,并且创建一个IOC容器,将带有@CwController和@CwService的类置于容器内。

     private Map<String, Object> IOC = new HashMap<String, Object>(); for (String classNme : classNames){                if( 对加了 @CwController 注解的类进行初始化){                                                  String beanName = toLowerFirstCase(clazz.getSimpleName());                    IOC.put(beanName, clazz.newInstance());                } else if (对加了 @CwService 注解的类进行初始化){                          IOC.put(beanName, instance);                                    } else {                    //对于扫描到的没有注解的类,忽略初始化行为                    continue;                }            }

第四步是DI操作,将IOC容器中需要赋值的实例属性进行赋值,即带有Autowired注解的实例属性。伪代码如下:

          for(Map.Entry<String, Object> entry : IOC.entrySet()){                      Field [] fields = entry.getValue().getClass().getDeclaredFields();           for (Field field : fields){                   ....                                  field.setAccessible(true);      field.set(entry.getValue(), IOC.get(beanName));           }        }

第五步要处理Controller层的Method与请求url的匹配关系,让请求能准确的请求到对应的url。篇幅问题,此处还是上传伪代码。

   private List<Handler> handlerMapping = new ArrayList<Handler>();     for (Map.Entry<String, Object> entry : IOC.entrySet()){      Class<?> clazz = entry.getValue().getClass();                定义一个url,由带有CwController的实例类上的@CwRequestMapping注解的值和Method上@CwRequestMapping注解的值组成                                                   String regex = (url);       Pattern pattern = Pattern.compile(regex);       handlerMapping.add(new Handler(pattern,method));      }

到这里就基本完成了springmvc的初始化阶段,之后的工作就是重写一下CwDispatcherServlet.java父类的doGet()/doPost()方法。根据request中的URI和参数来执行对应的Method,并且响应结果。

        handler.method.invoke(handler.controller, paramValues);

到此整个步骤就完成了,此时可以愉快的启动项目,并访问对应的url进行测试了。

根据上面Controller定义的方法可以知道其匹配的url为 : /demo/query 和 /demo/add,并且有使用@CwRequestParam注解定义了其各个参数的名称。

测试结果如下:

http://localhost:8080/spring/demo/query?name=James

如何使用springmvc

http://localhost:8080/spring/demo/add?a=222222&b=444444

如何使用springmvc

再来测试个url,是controller中没有声明出@CwRequestMapping注解的,看看结果。

http://localhost:8080/spring/demo/testNoUrl

如何使用springmvc

springMVC介绍以及执行流程

什么是SpringMVC?

SpringMVC是一个实现了MVC设计模式的轻量级web层框架,使用起来简单方便。

SpringMVC的优势是什么?

清晰的角色划分:

  • 前端控制器(DispatcherServlet)

  • 请求到处理器映射(HandlerMapping)

  • 处理器适配器(HandlerAdapter)

  • 视图解析器(ViewResolver)

  • 处理器或页面控制器(Controller)

  • 验证器( Validator)

  • 命令对象(Command 请求参数绑定到的对象就叫命令对象)

  • 表单对象(FORM Object 提供给表单展示和提交到的对象就叫表单对象)。

分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要。

由于命令对象就是一个 POJO,无需继承框架特定 API,可以使用命令对象直接作为业务对象。

和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的。

可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。

可定制性, HandlerMapping、 ViewResolver 等能够非常简单的定制。

功能强大的数据验证、格式化、绑定机制。

利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试。

本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。

强大的 jsP 标签库,使 JSP 编写更容易。

还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。

与Struts2的对比:

共同点:都是基于MVC设计模式的表现层框架,底层实现都离不开原始的Servlet,处理请求的机制都是一个核心控制器;

区别:Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter

Spring MVC 是基于方法设计的,而 Struts2 是基于类, Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。

相比来说,SpringMVC已经全面超越了Struts2。

执行流程:

DispatcherServlet: 是整个springmvc框架的核心。

前端控制器/核心控制器:所有的请求和响应都由此控制器进行分配。

前端控制器的所有工作都是基于组件完成的:

三大组件:

  • HandlerMapping: 它负责根据客户端的请求寻找对应的hadler,找到以后把寻找的handler返回给DispatcherServlet;

  • HandlerAdapter:它负责执行寻找到的Handler的方法,方法执行完后将返回值给HandlerAdapter, HandlerAdapter将返回值传给DispatcherServlet;

  • ViewResolver:它根据DispatcherServlet指定的返回结果寻找对应的页面,找到后将结果返回给DispatcherServlet。

  • DispatcherServlet负责最终的响应,默认是转发的操作。

执行流程图:

如何使用springmvc

以上是“如何使用springmvc”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用springmvc

本文链接: https://www.lsjlt.com/news/304422.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用springmvc
    小编给大家分享一下如何使用springmvc,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.配置阶段根据web.xml ,先定义DispatcherServle...
    99+
    2023-06-25
  • springboot与springmvc如何使用
    springboot与springmvc如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一,SpringBoot–1,概述用来整合maven项目,可以和Spring框架无...
    99+
    2023-06-20
  • Controller如何在SpringMVC 中使用
    本篇文章给大家分享的是有关Controller如何在SpringMVC 中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、简介在SpringMVC 中,控制器Contro...
    99+
    2023-05-31
    springmvc controller roller
  • SpringMVC+myBatis如何结合使用
    这篇文章给大家分享的是有关SpringMVC+myBatis如何结合使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. [代码]控制器片段     ...
    99+
    2023-06-03
  • @RequestParam注解如何在SpringMVC中使用
    这期内容当中小编将会给大家带来有关@RequestParam注解如何在SpringMVC中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。自SpringMVC4.2之后,RequestParam内部有4...
    99+
    2023-05-31
    springmvc @requestparam ue
  • session如何在SpringMVC项目中使用
    session如何在SpringMVC项目中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。session保存方式:javaWeb工程通用的HttpSessi...
    99+
    2023-05-31
    springmvc session
  • 如何在AngularJs中结合SpringMVC使用
    本篇文章给大家分享的是有关如何在AngularJs中结合SpringMVC使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先我们把springmvc的环境搭好,先来web....
    99+
    2023-05-31
    angularjs springmvc
  • 使用SpringMVC如何实现整合mybatis
    这篇文章给大家介绍使用SpringMVC如何实现整合mybatis,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache softw...
    99+
    2023-05-31
    springmvc mybatis
  • springmvc如何使用map接收参数
    目录springmvc 使用map接收参数第一种情况:请求参数有多组第二种情况:所有的参数不分组用map接收参数的几个注意的问题1、接受map的参数不能写value2、对于多个同名字...
    99+
    2024-04-02
  • 如何使用idea构建springmvc项目
    这篇“如何使用idea构建springmvc项目”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • SpringMVC如何使用ResponseBodyEmitter进行异步处理
    小编给大家分享一下SpringMVC如何使用ResponseBodyEmitter进行异步处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用 Response...
    99+
    2023-06-17
  • SpringMVC如何使用ListenableFuture进行异步处理
    这篇文章主要介绍了SpringMVC如何使用ListenableFuture进行异步处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用 ListenableFuture ...
    99+
    2023-06-17
  • 一文教你如何在java中使用SpringMVC
    这期内容当中小编将会给大家带来有关一文教你如何在java中使用SpringMVC,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、简介在SpringMVC 中,控制器Controller 负责处理由Dis...
    99+
    2023-05-31
    java springmvc ava
  • 如何使用Maven搭建SpringMVC+Spring+MyBatis框架
    这篇文章主要介绍如何使用Maven搭建SpringMVC+Spring+MyBatis框架,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级...
    99+
    2023-05-30
    springmvc spring mybatis
  • SpringMVC如何使用Callable进行异步处理
    这篇文章将为大家详细讲解有关SpringMVC如何使用Callable进行异步处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用 Callable 进行异步处理使用 Callable 进行异步处理与 ...
    99+
    2023-06-17
  • SpringMVC如何使用StreamingResponseBody进行异步处理
    这篇文章主要介绍SpringMVC如何使用StreamingResponseBody进行异步处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用 StreamingResponseBody 进行异步处理如果希望跳过...
    99+
    2023-06-17
  • SpringMVC如何使用拦截器控制登录
    SpringMVC如何使用拦截器控制登录?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringMVC读取Cookie判断用户是否登录,对每一个action都要进行判断。...
    99+
    2023-05-31
    springmvc 拦截器
  • SpringMVC如何使用DeferredResult进行异步处理
    这篇文章主要介绍SpringMVC如何使用DeferredResult进行异步处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用 DeferredResult 进行异步处理DeferredResult 这个类代表...
    99+
    2023-06-17
  • 在springmvc中使用controller如何实现返回值
    这篇文章将为大家详细讲解有关在springmvc中使用controller如何实现返回值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用@RequestBody 比如代码如下:@...
    99+
    2023-05-31
    springmvc controller roller
  • 使用SpringMVC如何实现对Swagger进行集成
    使用SpringMVC如何实现对Swagger进行集成?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。添加POM依赖 <!-- Jackson --> <d...
    99+
    2023-05-31
    springmvc swagger
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作