吐血整理!14个编写Spring MVC控制器的实用小技巧
1.使用@controllerstereotype
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
publicclassHomeController { @RequestMapping("/") publicString visitHome() { // do something before returning view name return"home"; }
}
如上所示,visitHome()方法通过重定向跳转到视图名home来处理应用程序内容路径(/)收到的请求。
@Controller
publicclassMultiActionController { @RequestMapping("/listUsers") public ModelAndView listUsers() { } @RequestMapping("/saveUser") public ModelAndView saveUser(User user) { } @RequestMapping("/deleteUser") public ModelAndView deleteUser(User user) { }
}
2.实现控制器接口
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的内容配置文件中的定义如下:
3.继承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"); }
}
<beanname="/big"class="net.codejava.spring.BigController"> <propertyname="supportedMethods"value="POST"/>
</bean>
- AbstractUrlViewController
- MultiActionController
- ParameterizableViewController
- ServletForwardingController
- ServletWrappingController
- UrlFilenameViewController
4.为处理器指定URL映射
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"; }
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
publicclassUserController { @RequestMapping("/listUsers") publicString listUsers() { return"ListUsers"; } @RequestMapping("/saveUser") publicString saveUser() { return"EditUser"; } @RequestMapping("/deleteUser") publicString deleteUser() { return"DeleteUser"; }
}
5.为处理器方法指定HTTP请求方法
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
publicclassLoginController { @RequestMapping(value = "/login", method = RequestMethod.GET) publicString viewLogin() { return"LoginForm"; } @RequestMapping(value = "/login", method = RequestMethod.POST) publicString doLogin() { return"Home"; }
}
6.将请求参数映射至处理器方法
@RequestMapping(value = "/login", method = RequestMethod.POSTpublic String doLogin(@RequestParamString username @RequestParamString password) {}
7.返回模型和视图
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String viewLogin() { return"LoginForm";
}
@RequestMapping("/listUsers")
public ModelAndView listUsers() { List<User> listUser = new ArrayList<>(); // get user list from DAO... ModelAndView modelView = new ModelAndView("UserList"); modelView.addObject("listUser", listUser); return modelView;
}
@RequestMapping("/listUsers")
public ModelAndView listUsers(ModelAndView modelView) { List<User> listUser = new ArrayList<>(); // get user list from DAO... modelView.setViewName("UserList"); modelView.addObject("listUser", listUser); return modelView;
}
8.将对象放入模型
modelView.addObject("listUser", listUser);
modelView.addObject("siteName", newString("CodeJava.net"));
modelView.addObject("users", 1200000);
@RequestMapping(method = RequestMethod.GET)
publicStringviewStats(Map<String, Object> model) { model.put("siteName", "CodeJava.net"); model.put("pageviews", 320000); return"Stats";
}
9.处理器方法中的重定向
// check login status....
if (!isLogin) { returnnew ModelAndView("redirect:/login");
}
// return a list of Users
10.处理表单提交和表单验证
@Controller
publicclassRegistrationController { @RequestMapping(value = "/doRegister", method = RequestMethod.POST) publicString doRegister( @ModelAttribute("userForm") User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { // form validation error } else { // form input is OK } // process registration... return"Success"; }
}
- Using @ModelAttribute on a method argument
- Using @ModelAttribute on a method
- Interface BindingResult
11.处理文件上传
@RequestMapping(value = "/uploadFiles", method = RequestMethod.POST)
publicStringhandleFileUpload( @RequestParam CommonsMultipartFile[] fileUpload) throws Exception { for (CommonsMultipartFile aFile : fileUpload){ // stores the uploaded file aFile.transferTo(new File(aFile.getOriginalFilename())); } return"Success";
}
12.在处理器中自动注入业务类
@Controller
publicclassUserController { @Autowired private UserDAO userDAO; publicString listUser() { // handler method to list all users userDAO.list(); } publicString saveUser(User user) { // handler method to save/update a user userDAO.save(user); } publicString deleteUser(User user) { // handler method to delete a user userDAO.delete(user); } publicString getUser(int userId) { // handler method to get a user userDAO.get(userId); }
}
interfaceUserDAO { List<User> list(); void save(User user); void checkLogin(User user);
}
13.获取HttpServletRequest和HttpServletResponse
@RequestMapping("/download")
publicStringdoDownloadFile( HttpServletRequest request, HttpServletResponse response) { // access the request // access the response return"DownloadPage";
}
14.遵守单一职责原则
- 不要用控制器类来执行业务逻辑,应该用控制器类将业务处理委托到相关的业务类。这可以保证控制器专注于其指定职责,即控制应用程序的工作流。如:
@Controller
publicclassUserController { @Autowired private UserDAO userDAO; publicString listUser() { // handler method to list all users userDAO.list(); } publicString saveUser(User user) { // handler method to save/update a user userDAO.save(user); } publicString deleteUser(User user) { // handler method to delete a user userDAO.delete(user); } publicString getUser(int userId) { // handler method to get a user userDAO.get(userId); }
}
- 给每个业务领域创建一个独立的控制器。如,用UserController控制用户管理的工作流,用OrderController控制订单处理的工作流,等等:
@Controller
publicclassUserController {
}
@Controller
publicclassProductController {
}
@Controller
publicclassOrderController {
}
@Controller
publicclassPaymentController {
}
吐血整理!14个编写Spring MVC控制器的实用小技巧相关推荐
- 编写 Spring MVC 控制器的 14 个技巧
欢迎关注方志朋的博客,回复"666"获面试宝典 通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户 ...
- requestmapping默认是get还是post_编写Spring MVC控制器的14个技巧,你今天get到了吗?...
Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 原文:http://dzone.com/articles/14-tips-for-writing-spring-mvc ...
- 换一种方式编写 Spring MVC 接口
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 通常我们编写 Spring MVC 接口的范 ...
- Spring MVC控制器的单元测试:“普通”控制器
本教程的第一部分描述了如何配置使用Spring MVC Test框架的单元测试. 现在是时候动手做,学习如何为"常规"控制器编写单元测试了. 显而易见的下一个问题是: 什么是普通控 ...
- Spring MVC控制器的单元测试:REST API
Spring MVC提供了一种创建REST API的简便方法. 但是,为这些API编写全面而快速的单元测试一直很麻烦. Spring MVC测试框架的发布使我们可以编写可读,全面且快速的单元测试. 这 ...
- Spring MVC控制器的单元测试:配置
传统上,为Spring MVC控制器编写单元测试既简单又成问题. 尽管编写调用控制器方法的单元测试非常简单,但问题是这些单元测试不够全面. 例如,我们不能仅通过调用已测试的控制器方法来测试控制器映射, ...
- Spring MVC控制器JUnit测试
JUnit测试Spring MVC控制器并非易事 . 但是最近,一个新项目 (即将在Spring推出)提供了新工具来简化此工作. 这篇文章说明了如何通过JUnit测试来测试一个简单的控制器. 该代码是 ...
- Spring Controller – Spring MVC控制器
Spring Controller annotation is a specialization of @Component annotation. Spring Controller annotat ...
- Java项目:(小程序)前台+后台相结合在线点餐系统(spring+spring mvc+mybatis+layui+微信小程)
源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统功能包括: 1 .微信小程序扫码点单 2 .微信小程序外卖点单 3 .后台可对微信小程序主页进行自定义(如颜色.布局. ...
最新文章
- CocosCreator TOUCH_MOVE事件
- 面试收集--卡特兰数(Catalan数)应用
- VIM入门必读(转)
- BAT无线工程师面试流程详细解析
- C#中数据类型的安全转换(is,as)
- c现代方法8.2节 deal.c程序自己编写
- postman断言之常用函数
- android 空白占位符,android textview空格占位符以及一些其他占位符汇总
- Windows环境下通过lynx查看隐藏链接识别黑链方法
- 也谈谈Javascript中的几个怪异特性(上)
- 日志平台查询异常,没有打印异常信息
- 数据规划(python实现数独自动算法之三)
- 关于正则表达式的补充(贪婪和懒惰)
- 干掉Google Base? 微软欲推Fremont服务 (转自donews.com)
- Linux测试主机之间连通性和端口是否开放的方法
- 电子签名屏什么牌子好
- win10共享打印机链接失败错误代码0x0000011b
- 【HbuilderX+微信小程序开发者工具解决报错问题】
- Linux下使用云笔记及OneNote
- 数据分析 之 渠道质量分析