SpringMVC学习|注解版的SpringMVC、RestFul风格、SpringMVC结果跳转方式、实现转发和重定向、数据处理、数据显示到前端、前端提交的中文信息接收后乱码问题解决

注解版的SpringMVC

看上一篇文章估计大部分同学都能理解其中的原理了,但是我们实际开发才不会这么写,不然就疯
了,还学这个玩意干嘛!我们来看个注解版实现,这才是SpringMVC的精髓

第一步:新建一个Moudle,添加web支持!建立包结构 com.kuang.controller

第二步:在pom.xml文件引入相关的依赖

主要有Spring框架核心库、Spring MVC、servlet,JSTL等。我们在父依赖中已经引入了!

父工程中添加依赖

由于Maven可能存在资源过滤的问题,我们在子工程中添加相应依赖

第三步:配置web.xml

注意点:
注意web.xml版本问题,要最新版!
注册DispatcherServlet
关联SpringMVC的配置文件
启动级别为1
映射路径为 /[不要用/*,会404]

web.xml中主要就是注册了DispatcherServlet,这是SpringMVC的核心。并且要关联下面要配置的springmvc-servlet.xml文件

第四步:编写springmvc配置文件

SpringMVC的配置文件springmvc-servlet.xml(包含映射器、适配器、视图解析器)

这里映射器和适配器的配置被进一步简化,然后因为我们这个方式是注解实现,所以这里配置比之前多了一个自动扫描包的配置,可以自动扫描到对应包下的Controller来注入spring容器中,而不需要我们之前每写一个Controller就要在在这个配置文件中去注册并且配置访问路由。Controller注册以及配置路由,在后面只需要添加两个注解即可。

第五步:创建对应的控制类,controller

我们在上面可扫描到的包下创建Controller,可以看到这里与之前的Controller在代码量上又有减少,不用去实现Controller接口之类的,只写一个类就可,在上面添加@Controller即可被扫描到并注册到springmvc-servlet.xml中成为bean,@RequestMapping代表了对应Controller的路由,可以加到类上,也可加到方法上,可以看到注解方式,一个Controller类中可以做多个方法,来实现多个操作对应不同的路由,之前的方法一个Controller只能实现一个操作只能对应一个路由。这里return的hello就是我们执行操作后需要转发的页面,这里需要视图解析器将该路由补充完整。变成/WEB-INF/jsp/hello.jsp

第六步:完善前端视图和controller之间的对应

编写好这个hello.jsp页面,取出存在model中的msg信息。

配置Tomcat

启动项目访问localhost:8080/h1,也就是我们刚写的Controller的路由,将Hello,SpringMVCAnnotation!这个消息存在model中并命名为msg,转发到hello.jsp页面,这个页面实际上就取出了model中存的msg信息显示了出来,所以我们看到了以下界面。

小结

实现步骤其实非常的简单:
1.新建一个web项目
2.导入相关jar包
3.编写web.xml,注册DispatcherServlet
4.编写springmvc配置文件
5. 接下来就是去创建对应的控制类,controller
6,最后完善前端视图和controller之间的对应
7.测试运行调试.
使用springMVC必须配置的三大件:
处理器映射器、处理器适配器、视图解析器
通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置

实现接口Controller定义控制器是较老的办法,缺点是一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller,定义的方式比较麻烦。而注解方式一个控制器可以有多个方法,而且简化了许多配置。

RestFul风格

概念

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

资源:互联网所有的事物都可以被抽象为资源
资源操作: 使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、删除、修改、查询。

传统方式操作资源:通过不同的参数来实现不同的效果!方法单一,post 和get

使用RestFul风格操作资源 : 可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但
是功能可以不同!

理解RestFul风格的小demo

在刚才项目的基础上新建一个Controller

我们根据路由访问这个Controller的这个方法,并且我们将a,和b两个参数用普通的方式携带在路由中,可以看到接收到了这两个参数并加在了一起,存到了model中,转发到了test.jsp页面,其在model中取了出来显示在页面上了。

在SpringMVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。我们将参数a和b都加上这个注解,并且在路由中让参数以固定的形式在路由中携带/add/{a}/{b}。

再根据路由访问这个Controller的这个方法,参数的携带是/1/2的方式,也依然传递成功了,这种方式更简洁、更安全。

Spring MVC的 @RequestMapping 注解能够处理 HTTP 请求的方法,比如 GET, PUT,POST,DELETE 以及 PATCH,所有的地址栏请求默认都会是 HTTP GET 类型的

这个注解变体有如下几个: 

在Controller种定义两个方法,且路由一致,只不过一个是POST方式,一个是GET方式。

浏览器调用这个路由,发现走的是GET方式的那个方法,因为浏览器只能走GET方式。

我们写一个jsp页面,这里有个表单提交,提交后的路由是这个Controller的这两个方法,且方式定义为POST,

先去访问这个jsp页面,然后点击提交

发现此时走的是那个POST的方法。

除了@GetMapping等这几个注解来改变访问方式外,也可用@RequestMapping注解的下面这个方式来改变访问方式。

SpringMVC结果跳转方式

设置ModelAndView对象,根据view的名称,和视图解析器跳到指定的页面
页面:{视图解析器前缀)+ viewName+{视图解析器后缀)

视图解析器就是在SpringMVC的配置文件springmvc-servlet.xml(包含映射器、适配器、视图解析器)中配置的,前缀和后缀是我们自己定义的

这个veiwName就是我们在Controller中自己设置的,比如这里结束操作后需要转发的页面路由就是

localhost:8080/WEB-INF/jsp/test.jsp

SpringMVC实现转发和重定向

先在SpringMVC的配置文件springmvc-servlet.xml(包含映射器、适配器、视图解析器)中把视图解析器注释掉。

Controller执行操作后,需要转发的路由,我们需要写全。不能之前的test了,

可以看到转发成功

如果是执行操作后,需要重定向,则需要在路由前加redirect:

再访问这个Controller路由

发现页面被重定向为了index.jsp的路由,页面路由发生了变化,这就是重定向。

SpringMVC数据处理

处理提交数据

1、提交的域名称和处理方法的参数名一致

编写Controller,该方法的参数名为name

我们访问这个Controller中的这个方法,并且路由中传递的参数名称也为name,发现这个参数被顺利接收,并最终显示到了页面上。

如果在访问的路由中改变传递参数的名称,比如变为username,与Controller方法中的参数名称不一致,则发现这个参数并不能被顺利接收显示到页面上。

2、提交的域名称和处理方法的参数名不一致

遇到路由里给的参数名称与Controller方法里的参数名不一样的情况,我们只需要在方法的对应参数的前面添加@RequestParam注解,并设置与之对应的路由里给的参数名,即可顺利接收到该参数

即这个方法中的name参数的值就由在路由里给的名字为username的参数赋予。

可以看到在我们通过路由访问这个方法时,路由里给的参数名为username,即使与方法中的参数name名字不一样,也顺利被接收了,并且显示在了页面上。

3、提交的是一个对象

 在pom.xml中加入lombok依赖

编写一个User类

在Controller中编写一个方法,接收一个对象参数。

通过对应路由访问这个方法,并且参数为这个对象的每个属性,名字都与对象中的属性名字一一对照。

可以看到后台这个对象有被打印出来,说明这个对象被顺利接收。

如果我们访问这个方法的路由时,将其中一个参数的名字给改变了,与这个对象的属性名字不一致,比如name改成username。

我们就可以发现后台打印出的对象,其name属性没有被赋值,故如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

SpringMVC数据显示到前端

第一种:通过ModelAndView

第二种:通过ModelMap

第三种:通过Model(这种用的最多)

前端提交的中文信息接收后乱码问题解决

创建一个提交表单的form.jsp页面

编写这个表单提交后交给的Controller

访问这个jsp表单页面,提交中文信息

提交后,发现返回的信息乱码,也就是Controller接收这个中文参数后,接收成了乱码,存到了model中,然后被test.jsp页面取出显示了出来

解决这个问题可以自己定义一个过滤器,也可用springMVC自带的过滤器解决。

自己定义一个过滤器

创建一个过滤器类,在过滤器中设置请求与相应的编码格式为utf-8。

在web.xml中注册这个过滤器,注意这里过滤的路由不是/,而应该是/*,不然不会处理路由里的jsp,

SpringMVC提供的过滤器

不得不说,乱码问题是在我们开发中十分常见的问题,也是让我们程序猿比较头大的问题!
以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在web.xml中配置
修改了xml文件需要重启服务器!

在web.xml中配置SpringMVC自带的过滤器,注意这里过滤的路由也不是/,而应该是/*,不然不会处理路由里的jsp。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值