編寫Spring MVC控制器的14個技巧
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
1.使用@Controller構(gòu)造型
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/")
public String visitHome() {
return "home";
}
}
<annotation-driven />
<context:component-scan base-package="net.codejava.spring" />
@Controller
public class MultiActionController {
@RequestMapping("/listUsers")
public ModelAndView listUsers() {
}
@RequestMapping("/saveUser")
public ModelAndView saveUser(User user) {
}
@RequestMapping("/deleteUser")
public ModelAndView deleteUser(User user) {
}
}
2.實現(xiàn)控制器接口
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MainController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("Welcome main");
return new ModelAndView("main");
}
}
<bean name="/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;
public class BigController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("You're big!");
return new ModelAndView("big");
}
}
這將創(chuàng)建具有有關(guān)受支持的方法,會話和緩存的配置的單動作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:
<bean name="/big" class="net.codejava.spring.BigController">
<property name="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")
public class SingleActionController {
@RequestMapping(method = RequestMethod.GET)
public String sayHello() {
return "hello";
}
}
當@RequestMapping 注解在方法級別使用的,你可以有一個多動作控制器。例如:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@RequestMapping("/listUsers")
public String listUsers() {
return "ListUsers";
}
@RequestMapping("/saveUser")
public String saveUser() {
return "EditUser";
}
@RequestMapping("/deleteUser")
public String 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
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String viewLogin() {
return "LoginForm";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLogin() {
return "Home";
}
}
6.將請求參數(shù)映射到處理程序方法
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLogin(@RequestParam String username,
@RequestParam String password) {
}http:// localhost:8080 / spring / login?username = scott&password = tiger
@RequestParam int 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";
}
這是返回視圖名稱的最簡單方法。但是,如果要將其他數(shù)據(jù)發(fā)送到視圖,則必須返回一個 ModelAndView 對象。考慮以下處理程序方法:
@RequestMapping("/listUsers")
public ModelAndView listUsers() {
List<User> listUser = new ArrayList<>();
// 從DAO獲取用戶列表…
ModelAndView modelView = new ModelAndView("UserList");
modelView.addObject("listUser", listUser);
return modelView;
}
@RequestMapping("/listUsers")
public ModelAndView listUsers(ModelAndView modelView) {
List<User> listUser = new ArrayList<>();
//從DAO獲取用戶列表…
modelView.setViewName("UserList");
modelView.addObject("listUser", listUser);
return modelView;
}
8.將對象放入模型
modelView.addObject("listUser", listUser);
modelView.addObject("siteName", new String("CodeJava.net"));
modelView.addObject("users", 1200000);
@RequestMapping(method = RequestMethod.GET)
public String viewStats(Map<String, Object> model) {
model.put("siteName", "CodeJava.net");
model.put("pageviews", 320000);
return "Stats";
}
9.處理程序方法中的重定向
// 檢查登錄狀態(tài)....
if (!isLogin) {
return new ModelAndView("redirect:/login");
}
// 返回用戶列表
10.處理表格提交和表格驗證
@Controller
public class RegistrationController {
@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
public String doRegister(
@ModelAttribute("userForm") User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
// 表單驗證錯誤
} else {
// 表單輸入沒問題
}
// 注冊過程……
return "Success";
}
}
在方法參數(shù)上使用@ModelAttribute
在方法上使用@ModelAttribute
接口綁定結(jié)果
11.處理文件上傳
@RequestMapping(value = "/uploadFiles", method = RequestMethod.POST)
public String handleFileUpload(
@RequestParam CommonsMultipartFile[] fileUpload) throws Exception {
for (CommonsMultipartFile aFile : fileUpload){
// 存儲上傳的文件
aFile.transferTo(new File(aFile.getOriginalFilename()));
}
return "Success";
}
12.在控制器中自動裝配業(yè)務(wù)類
@Controller
public class UserController {
@Autowired
private UserDAO userDAO;
public String listUser() {
// 列出所有用戶的處理方法
userDAO.list();
}
public String saveUser(User user) {
// 保存/更新用戶的處理方法
userDAO.save(user);
}
public String deleteUser(User user) {
// 刪除用戶的處理方法
userDAO.delete(user);
}
public String getUser(int userId) {
// 獲取用戶的處理方法
userDAO.get(userId);
}
}
interface UserDAO {
List<User> list();
void save(User user);
void checkLogin(User user);
}
13.訪問HttpServletRequest和HttpServletResponse
@RequestMapping("/download")
public String doDownloadFile(
HttpServletRequest request, HttpServletResponse response) {
// 訪問請求
// 訪問響應(yīng)
return "DownloadPage";
}
14.遵循單一責任原則
控制器類不應(yīng)執(zhí)行業(yè)務(wù)邏輯。相反,它應(yīng)該將業(yè)務(wù)處理委托給相關(guān)的業(yè)務(wù)類別。這使控制器始終專注于其設(shè)計職責是控制應(yīng)用程序的工作流程。例如:
@Controller
public class UserController {
@Autowired
private UserDAO userDAO;
public String listUser() {
userDAO.list();
}
public String saveUser(User user) {
userDAO.save(user);
}
public String deleteUser(User user) {
userDAO.delete(user);
}
public String getUser(int userId) {
userDAO.get(userId);
}
}
為每個業(yè)務(wù)域創(chuàng)建每個單獨的控制器。例如,
UserController用于控制用戶管理的OrderController工作流程, 用于控制訂單處理的工作流程等。例如:
@Controller
public class UserController {
}
@Controller
public class ProductController {
}
@Controller
public class OrderController {
}
@Controller
public class PaymentController {
}
作者 | 不墜青云~
來源 | csdn.net/Summer_Lyf/article/details/102911215

評論
圖片
表情
