点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
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
程序员小乐(ID:study_tech)第 698 次推文 图片来自网络
正文
1.使用@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来处理应用程序内容路径(/)收到的请求。
<annotation-driven/>
<context:component-scanbase-package="net.codejava.spring"/>
@ControllerpublicclassMultiActionController { @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的内容配置文件中的定义如下:
<beanname="/main"class="net.codejava.spring.MainController"/>
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映射
@RequestMapping("/login")
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;@ControllerpublicclassUserController { @RequestMapping("/listUsers") publicString listUsers() { return"ListUsers"; } @RequestMapping("/saveUser") publicString saveUser() { return"EditUser"; } @RequestMapping("/deleteUser") publicString deleteUser() { return"DeleteUser"; }}@RequestMapping({"/hello", "/hi", "/greetings"})
5.为处理器方法指定HTTP请求方法
import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMappingimport org.springframework.web.bind.annotation.RequestMethod;@ControllerpublicclassLoginController { @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) {}@RequestParamint securityNumber
@RequestParam("SSN") int securityNumber
@RequestParam(required = false) String country
@RequestParam(defaultValue = "18") int age
doLogin(@RequestParam Map<String, String> params)
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 Users10.处理表单提交和表单验证
@ControllerpublicclassRegistrationController { @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.在处理器中自动注入业务类
@ControllerpublicclassUserController { @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);}List<User> listUser = userDAO.list();
13.获取HttpServletRequest和HttpServletResponse
@RequestMapping("/download")publicStringdoDownloadFile( HttpServletRequest request, HttpServletResponse response) { // access the request // access the response return"DownloadPage";}14.遵守单一职责原则
不要用控制器类来执行业务逻辑,应该用控制器类将业务处理委托到相关的业务类。这可以保证控制器专注于其指定职责,即控制应用程序的工作流。如:
@ControllerpublicclassUserController { @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控制订单处理的工作流,等等:
@ControllerpublicclassUserController {}@ControllerpublicclassProductController {}@ControllerpublicclassOrderController {}@ControllerpublicclassPaymentController {}欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
猜你还想看
关注「程序员小乐」,收看更多精彩内容
来源:CSDN
作者:吧主
链接:https://blog.csdn.net/xiaole0313/article/details/103248959