点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨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;
@Controller
publicclassHomeController {
@RequestMapping("/")
publicString visitHome() {
// do something before returning view name
return"home";
}
}
如上所示,visitHome()方法通过重定向跳转到视图名home来处理应用程序内容路径(/)收到的请求。
<annotation-driven/>
<context:component-scanbase-package="net.codejava.spring"/>
@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的内容配置文件中的定义如下:
<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;
@Controller
publicclassUserController {
@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.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) {}
@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 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);
}
List<User> listUser = userDAO.list();
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 {
}
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
猜你还想看
关注「程序员小乐」,收看更多精彩内容
来源:CSDN
作者:吧主
链接:https://blog.csdn.net/xiaole0313/article/details/103248959