当前位置: 首页 > 科技观察

分享14个顶级SpringMVC技巧!

时间:2023-03-20 00:51:52 科技观察

通常,在SpringMVC中,我们会编写一个控制器类来处理来自客户端的请求。控制器然后调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,由Spring的调度程序servlet解析以呈现结果或输出。这样就完成了一个典型的请求-响应周期往返。今天整理了写SpringMVC控制器的14个技巧。你今天收到了吗?\(≧▽≦)/1。使用@Controller原型这是创建可以处理一个或多个请求的控制器类的最简单方法。只需用构造型注释类@Controller,例如:importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassHomeController{@RequestMapping("/")publicStringvisitHome(){return"home";}}如您所见,visitHome()方法通过重定向到名为home的视图来处理来自应用程序上下文路径(/)的请求。注意:@Controller原型只有在Spring配置文件开启注解驱动时才能使用:被@Controller注解的类被配置为控制器。这是最可取的,因为它很简单:不需要在配置文件中为控制器声明bean。注意:通过使用@Controller注释,您可以拥有一个能够处理多个不同请求的多操作控制器类。例如:@ControllerpublicclassMultiActionController{@RequestMapping("/listUsers")publicModelAndViewlistUsers(){}@RequestMapping("/saveUser")publicModelAndViewsaveUser(Useruser){}@RequestMapping("/deleteUser")publicModelAndViewdeleteUser(Useruser){}}可以看上面的controller类,有3种处理方法分别处理三种不同的请求/listUsers、/saveUser、/deleteUser。2.实现控制器接口在SpringMVC中创建控制器的另一种(也许是经典的)方法是让类实现控制器接口。例如:importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework...returnnewModelAndView("main");}}实现类必须覆盖handleRequest()方法,当有匹配请求进入时,Spring调度程序servlet将调用该方法。这种控制器处理的请求URL模式在Spring的上下文配置文件中定义如下:无法处理多个请求URL。3.如果您想轻松控制支持的HTTP方法、会话和内容缓存,请扩展AbstractController类。从AbstractController类扩展你的控制器是理想的。.AbstractController;publicclassBigControllerextendsAbstractController{@OverrideprotectedModelAndViewhandleRequestInternal(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{System.out.println("You'rebig!");returnnewModelAndView("big");}}这会创建一个单一的动作控制器,配置支持的方法、会话和缓存,然后可以在控制器的bean声明中指定这些配置。例如:这个配置表示这个controller的POST处理方法仅支持此方法。SpringMVC还提供了几个为特定目的而设计的控制器类,包括:AbstractUrlViewControllerMultiActionControllerParameterizableViewControllerServletForwardingControllerServletWrappingControllerUrlFilenameViewController4.为处理程序方法指定URL映射这是编写控制器类时必须执行的强制性任务,这些类旨在处理一个或多个类更具体的要求。SpringMVC提供了@RequestMapping注解,用于指定URL映射。例如:@RequestMapping("/login")这映射了/loginURL模式,由注释的方法或类处理。当在类级别使用此注释时,该类将成为单个动作控制器。例如:importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping("/hello")publicclassSingleActionController{@RequestMapping(method=RequestMethod.GET)publicStringsayHello(){return"hello";}}在方法级别使用@RequestMapping注释时,您可以拥有一个多动作控制器。例如:importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassUserController{@RequestMapping("/listUsers")publicStringlistUsers(){return"ListUsers";}@RequestMapping("/saveUser")publicStringsaveUser(){return"EditUser";}@RequestMapping("/deleteUser")publicStringdeleteUser(){return"DeleteUser";}}@RequestMapping注解也可以用来指定一个方法处理的多个URL模式.例如:@RequestMapping({"/hello","/hi","/greetings"})此外,这个注解还有其他一些属性,在某些情况下可能会有用,比如method。5.为handler方法指定HTTP请求方法,可以使用注解的method属性指定handler方法支持哪种HTTP方法(GET、POST、PUT等)@RequestMapping。这是一个例子:importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;@ControllerpublicclassLoginController{@RequestMapping(value="/login",method=RequestMethod.GET)publicStringviewLogin(){return"LoginForm";}@RequestMapping(value="/login",method=RequestMethod.POST)publicStringdoLogin(){return"Home";}}这个控制器有两个进程Method/login用于相同的URL模式,但前者用于GET方法,后者用于POST方法。有关使用@RequestMapping注释的更多信息,请参阅@RequestMappingAnnotation。6.将请求参数映射到处理程序方法SpringMVC的一个很酷的特性是您可以使用@RequestParam注释检索请求参数作为处理程序方法的常规参数。这是将控制器HttpServletRequest的接口与ServletAPI分离的好方法。@RequestMapping(value="/login",method=RequestMethod.POST)publicStringdoLogin(@RequestParamStringusername,@RequestParamStringpassword){}Spring将方法参数username和password绑定到同名的HTTP请求参数中。这意味着您可以调用URL(如果请求方法是GET),如下所示:http://localhost:8080/spring/login?username=scott&password=tiger类型转换也是自动完成的。例如,如果你像这样声明一个整数类型的参数:@RequestParamintsecurityNumber那么Spring会在处理程序方法中自动将请求参数的值(字符串)转换为指定的类型(整数)。如果参数名称与变量名称不同,可以按如下方式指定参数的实际名称:@RequestParam("SSN")intsecurityNumber@RequestParam注解还有两个附加属性,在某些情况下可能会有用。该属性指定参数是否是必需的。例如:required@RequestParam(required=false)Stringcountry这表示参数country是可选的;因此,请求中可能缺少它。在上面的示例中,如果请求中不存在此类参数,则country变量将为null。另一个属性是defaultValue,可以在请求参数为空时作为回退值。例如:@RequestParam(defaultValue="18")intageMap如果方法参数是类型的,Spring也允许我们将所有参数作为对象Map来访问。例如:doLogin(@RequestParamMapparams)则map参数以键值对的形式包含了所有的请求参数。有关使用@RequestParam注释的更多信息,请参阅@RequestParam注释。关注微信公众号:Java技术栈,后台回复:spring,可以获取我整理的最新Spring教程,都是干货。7.返回模型和视图一旦处理完业务逻辑,处理程序方法应该返回一个视图,然后由Spring的调度程序servlet进行解析。Spring允许我们的ModelAndView从处理程序方法返回String或Object。在下面的示例中,处理程序方法返回一个String并表示一个名为LoginForm的视图:@RequestMapping(value="/login",method=RequestMethod.GET)publicStringviewLogin(){return"LoginForm";}这是返回的视图最简单的命名方式。但是,如果要向视图发送额外的数据,则必须返回一个ModelAndView对象。考虑以下处理程序方法:@RequestMapping("/listUsers")publicModelAndViewlistUsers(){ListlistUser=newArrayList<>();//从DAO获取用户列表...ModelAndViewmodelView=newModelAndView("UserList");modelView.addObject("listUser",listUser);returnmodelView;}如您所见,此处理程序方法返回一个ModelAndViewUser对象,其中包含视图名称UserList和可在该视图中使用的对象集合。春季面试7大题,推荐阅读。Spring也非常灵活,因为您可以将ModelAndView对象声明为处理程序方法的参数,而不是创建一个新对象。因此,上面的例子可以重写为:@RequestMapping("/listUsers")publicModelAndViewlistUsers(ModelAndViewmodelView){ListlistUser=newArrayList<>();//从DAO获取用户列表...modelView.setViewName("UserList");modelView.addObject("listUser",listUser);returnmodelView;}有关该类的更多信息,请参见:ModelAndView类。8.将对象放入模型在遵循MVC架构的应用程序中,控制器(C)应该将数据传递到模型(M),然后在视图(V)中使用。正如我们在前面的示例中看到的,ModelAndView类的addObject()方法以名称-值对的形式将对象放入模型中:modelView.addObject("listUser",listUser);modelView.addObject("siteName",newString("CodeJava.net"));modelView.addObject("用户",1200000);同样,Spring非常灵活。您可以在处理程序方法中声明Map类型的参数。Spring使用这个映射来存储模型的对象。让我们看另一个例子:@RequestMapping(method=RequestMethod.GET)publicStringviewStats(Mapmodel){model.put("siteName","CodeJava.net");model.put("pageviews",320000);return"Stats";}这比使用ModelAndView对象更简单。根据您的喜好,您可以使用Map或使用ModelAndView对象。在这里要感谢Spring的灵活性。9.处理方法中的重定向如果你想在满足条件的情况下将用户重定向到另一个URL,请在URL前附加redirect:/。下面的代码片段给出了一个例子://Checkforloginstatus....if(!isLogin){returnnewModelAndView("redirect:/login");}//返回上面代码中的用户列表,/如果不是登录,则登录,用户将被重定向到此URL。10.处理表单提交和表单验证Spring通过提供用于绑定表单字段的@ModelAttribute注释来表单支持对象和用于验证表单字段的BindingResult接口,使得处理表单提交变得容易。以下代码片段显示了负责处理和验证表单数据的典型处理程序方法:@ControllerpublicclassRegistrationController{@RequestMapping(value="/doRegister",method=RequestMethod.POST)publicStringdoRegister(@ModelAttribute("userForm")Useruser,BindingResultbindingResult){if(bindingResult.hasErrors()){//表单验证错误}else{//表单输入正常}//注册过程...返回“成功”;}}参考Spring官方文档更多关于@ModelAttribute注解的信息和BindingResult接口:在方法参数上使用@ModelAttribute使用@ModelAttribute接口在方法上绑定结果11.处理文件上传在处理程序方法中处理文件上传变得很容易。Spring使用ApacheCommonsFileUpload作为底层的多部分解析器。以下代码片段显示了从客户端上传文件是多么容易存储上传文件aFile.transferTo(newFile(aFile.getOriginalFilename()));}return"Success";}12.在controller中自动组装业务类controller要把业务逻辑的处理委托给相关的业务类。为此,可以使用@Autowired注解让Spring自动将业务类的实际实现注入到控制器中。关注微信公众号:Java技术栈,后台回复:sp,可以获得我整理的最新的SpringBoot教程,都是干货。考虑以下控制器类的代码片段:@ControllerpublicclassUserController{@AutowiredprivateUserDAOuserDAO;publicStringlistUser(){//列出所有用户处理程序userDAO.list();}publicStringsaveUser(Useruser){//保存/更新用户处理程序userDAO.save(user);}publicStringdeleteUser(Useruser){//删除用户处理方法userDAO。delete(user);}publicStringgetUser(intuserId){//获取用户的处理方法userDAO.get(userId);}}这里,所有与用户管理相关的业务逻辑都是由UserDAO接口的实现提供的。例如:interfaceUserDAO{Listlist();voidsave(Useruser);voidcheckLogin(Useruser);}有关@Autowired注释的更多信息,请参阅注释类型自动装配。13、访问HttpServletRequest和HttpServletResponse在某些情况下,你需要在handler方法中直接访问HttpServletRequest或HttpServletResponse对象。借助Spring的灵活性,只需要在处理方法中添加相关参数即可。例如:@RequestMapping("/download")publicStringdoDownloadFile(HttpServletRequestrequest,HttpServletResponseresponse){//访问请求//访问响应返回"DownloadPage";}Spring检测并自动将HttpServletRequest和HttpServletResponse对象注入到方法中。然后,您可以访问请求和响应,例如获取InputStream、OutputStream或返回特定的HTTP代码。14.遵循单一职责原则最后,在设计和编写SpringMVC控制器时应该遵循两个好的实践:1)控制器类不应该执行业务逻辑。相反,它应该将业务处理委托给相关的业务类。这使控制器专注于它设计用于控制应用程序的工作流。例如:@ControllerpublicclassUserController{@AutowiredprivateUserDAOuserDAO;publicStringlistUser(){userDAO.list();}publicStringsaveUser(Useruser){userDAO.save(user);}publicStringdeleteUser(Useruser){userDAO.delete(user);}publicStringgetUser(intuserId){userDAO.get(userId);}}2)为每个业务域创建每个单独的控制器。例如,UserController用于控制用户管理的工作流程,OrderController用于控制订单处理的工作流程等。例如:@ControllerpublicclassUserController{}@ControllerpublicclassProductController{}@ControllerpublicclassOrderController{}@ControllerpublicclassPaymentController{}这14个技巧可以帮助您在SpringMVC中正确有效地编写控制器类。