mvc 调用其他控制器方法session丢失_吐血整理!14个编写Spring MVC控制器的超实用小技巧,建议收藏...

本文介绍了Spring MVC控制器的编写技巧,包括使用@Controller注解、实现Controller接口、继承AbstractController类等。文章还讨论了在控制器间调用导致session丢失的问题,并提供了解决方案。此外,文章还提到了@RequestMapping注解在URL映射中的应用,帮助开发者更好地处理HTTP请求。
摘要由CSDN通过智能技术生成

点击上方 "程序员小乐"关注, 星标或置顶一起成长

第一时间与你相约

每日英文

Never give up on something you really want. It’s difficult to wait, but worse to regret.

永远不要放弃你真正想要的东西。等待虽难,但后悔更甚。

每日掏心话

人生最可悲的是:生活把我们变成了当初最讨厌的那种人,可我们终究还是过不上自己想要的生活。

来自:公众号 读芯术 | 责编:乐乐

链接:dzone.com/articles/14-tips-for-writing-spring-mvc-controller

6afb5a58d7b84f88e9c820764a42a038.png

程序员小乐(ID:study_tech)第 698 次推文 图片来自网络

往日回顾:感受Lambda之美,建议收藏,需要时查阅

正文


本文介绍了编写Spring MVC框架的控制器(controller)的基础技巧和最佳操作。在Spring MVC框架中,编写控制器类通常是为了处理用户提出的请求。 编写完成后,控制器会调用一个业务类来处理业务相关任务,进而重定向客户到逻辑视图名。Springdispatcher servlet会对逻辑视图名进行解析,并渲染结果或输出。这就是一个典型的“请求—响应”的完整流程。

1.使用@controllerstereotype

创建一个能够处理单个或多个请求的控制器类,最简单的方法就是使用@controllerstereotype注解一个类,如:

  • import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassHomeController { @RequestMapping("/") publicString visitHome() { // do something before returning view name return"home"; }}

  • 如上所示,visitHome()方法通过重定向跳转到视图名home来处理应用程序内容路径(/)收到的请求。 注意:只有在Spring配置文件中启用了注解驱动,才能使用@controllerstereotype。

  • 启用注解驱动后,Spring的容器(container)会自动扫描如下包中的类:

  • 带有@controller注解的类会被标记成控制器。由于其简单方便,且不再需要对配置文件中的控制器声明beans,这一方法非常实用。 注意:使用@controller注解可以创建一个多动作控制器类,可同时处理多个不同的请求。如:

  • @ControllerpublicclassMultiActionController { @RequestMapping("/listUsers") public ModelAndView listUsers() { } @RequestMapping("/saveUser") public ModelAndView saveUser(User user) { } @RequestMapping("/deleteUser") public ModelAndView deleteUser(User user) { }}

  • 如上所示,有三个处理器(handler)在分别处理三个请求,/listUsers,/saveUser,和/deleteUser。

2.实现控制器接口

在Spring MVC中创建控制器还可以用另一个经典的方法,即对一个类实现Controller接口。如:

  • import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;publicclassMainControllerimplements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Welcome main"); returnnew ModelAndView("main"); }}

  • 实现类必须重写handleRequest()方法(当收到相匹配的请求时,Spring dispatcher servlet会调用handleRequest)。由该控制器处理的请求URL模式在Spring的内容配置文件中的定义如下:

  • 这一方法的缺点在于其控制类无法同时处理多个请求URL。

3.继承AbstractController类

如果想要轻松控制受支持的HTTP方法、会话和内容缓存,让控制类继承AbstractController类是理想的方法。如:

  • import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.AbstractController;publicclassBigControllerextends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("You're big!"); returnnew ModelAndView("big"); }}

  • 上例创建了一个配置了受支持的方法、会话和缓存的单动作控制器,能够在控制器的bean声明中被指明。如:

  • 这一配置表明该控制器handler方法仅支持POST方法。了解更多配置(如会话、缓存),参见AbstractController。 SpringMVC还提供了多个支持特定目的的控制器类,包括:

  • AbstractUrlViewController

  • MultiActionController

  • ParameterizableViewController

  • ServletForwardingController

  • ServletWrappingController

  • UrlFilenameViewController

4.为处理器指定URL映射

这是编写控制器类必不可少的一步,旨在处理一个及以上特定请求。Spring MVC提供了@RequestMapping注解,用于指定URL映射。如:

  • @RequestMapping("/login")

  • 这一步映射了URL模式/login,并用注解或注解类对其进行了处理。@RequestMapping注解用于类上时,类变成了单动作控制器。如:

  • import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping("/hello")publicclassSingleActionController { @RequestMapping(method = RequestMethod.GET) publicString sayHello() { return"hello"; }}

  • @RequestMapping注解用于方法上时,则可生成多动作控制器。如:

  • import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassUserController { @RequestMapping("/listUsers") publicString listUsers() { return"ListUsers"; } @RequestMapping("/saveUser") publicString saveUser() { return"EditUser"; } @RequestMapping("/deleteUser") publicString deleteUser() { return"DeleteUser"; }}

  • @RequestMapping注解也可用于指定多个URL模式,并用单一方法对其进行处理。如:

  • @RequestMapping({"/hello

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值