Controller接受請求參數的常見方法:
1、通過Bean接受請求參數:
創建POJO實體類
創建pojo包,並在該包中創建實體類UserForm,代碼:
package pojo; public class UserForm { private String uname;//與請求參數名稱相同 private String upass; private String reupass; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpass() { return upass; } public void setUpass(String upass) { this.upass = upass; } public String getReupass() { return reupass; } public void setReupass(String reupass) { this.reupass = reupass; } }
創建控制器類,在controller包中創建控制器類IndexController和UserController
其中@RequestMapping注解的作用個人淺顯的理解就是將方法或類注解為一個“路徑”的名稱,以便在HTML,JSP(視圖)向控制器發送請求時尋找到。
IndexController代碼:
package controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller//在這里@Controller相當於@Controller(“indexController”) @RequestMapping("/index") public class IndexController { @RequestMapping("/login") public String login() { return "login";//跳轉到“/WEB-INF/jsp/login.jsp” } @RequestMapping("/register") public String register() { return "register"; } }
UserController代碼:
package controller; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import pojo.UserForm; import service.UserService; @Controller//在這里@Controller相當於@Controller(“userController”) @RequestMapping("/user") public class UserController { //得到一個用來記錄日志的對象,這樣打印信息的時候能夠標記打印的是那個類的信息 private static final Log logger = LogFactory.getLog(UserController.class); //將服務依賴注入到屬性userService @Autowired public UserService userService; /** * 處理登錄 */ @RequestMapping("/login") public String login(UserForm user, HttpSession session, Model model) { if(userService.login(user)){ session.setAttribute("u", user); logger.info("成功"); return "main";//登錄成功,跳轉到main.jsp }else{ logger.info("失敗"); model.addAttribute("messageError", "用戶名或密碼錯誤"); return "login"; } } /** *處理注冊 */ @RequestMapping("/register") public String register(@ModelAttribute("user") UserForm user) { if(userService.register(user)){ logger.info("成功"); return "login";//注冊成功,跳轉到login.jsp }else{ logger.info("失敗"); //使用@ModelAttribute("user")與model.addAttribute("user", user)功能相同 //在register.jsp頁面上可以使用EL表達式${user.uname}取出ModelAttribute的uname值 return "register";//返回register.jsp } } }
創建頁面視圖,結合視圖中更能理解@RequestMapping注解的作用,其中關於本次知識的核心代碼為<body>標簽中的內容:
創建register.jsp代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> .textSize{ width: 100pt; height: 15pt } </style> <title>注冊畫面</title> <script type="text/javascript"> //注冊時檢查輸入項 function allIsNull(){ var name=document.registForm.uname.value; var pwd=document.registForm.upass.value; var repwd=document.registForm.reupass.value; if(name==""){ alert("請輸入姓名!"); document.registForm.uname.focus(); return false; } if(pwd==""){ alert("請輸入密碼!"); document.registForm.upass.focus(); return false; } if(repwd==""){ alert("請輸入確認密碼!"); document.registForm.reupass.focus(); return false; } if(pwd!=repwd){ alert("2次密碼不一致,請重新輸入!"); document.registForm.upass.value=""; document.registForm.reupass.value=""; document.registForm.upass.focus(); return false; } document.registForm.submit(); return true; } </script> </head> <body> <form action="${pageContext.request.contextPath }/user/register" method="post" name="registForm"> <table border=1 bgcolor="lightblue" align="center"> <tr> <td>姓名:</td> <td> <input class="textSize" type="text" name="uname" value="${user.uname }"/> </td> </tr> <tr> <td>密碼:</td> <td><input class="textSize" type="password" maxlength="20" name="upass"/></td> </tr> <tr> <td>確認密碼:</td> <td><input class="textSize" type="password" maxlength="20" name="reupass"/></td> </tr> <tr> <td colspan="2" align="center"><input type="button" value="注冊" onclick="allIsNull()"/></td> </tr> </table> </form> </body> </html>
創建login.jsp代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>后台登錄</title> <style type="text/css"> table{ text-align: center; } .textSize{ width: 120px; height: 25px; } * { margin: 0px; padding: 0px; } body { font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin: 10px 10px auto; background-image: url(${pageContext.request.contextPath }/images/bb.jpg); } </style> <script type="text/javascript"> //確定按鈕 function gogo(){ document.forms[0].submit(); } //取消按鈕 function cancel(){ document.forms[0].action = ""; } </script> </head> <body> <form action="${pageContext.request.contextPath }/user/login" method="post"> <table> <tr> <td colspan="2"><img src="${pageContext.request.contextPath }/images/login.gif"></td> </tr> <tr> <td>姓名:</td> <td><input type="text" name="uname" class="textSize"></td> </tr> <tr> <td>密碼:</td> <td><input type="password" name="upass" class="textSize"></td> </tr> <tr> <td colspan="2"> <input type="image" src="${pageContext.request.contextPath }/images/ok.gif" onclick="gogo()" > <input type="image" src="${pageContext.request.contextPath }/images/cancel.gif" onclick="cancel()" > </td> </tr> </table> ${messageError } </form> </body> </html>
2、通過處理方法的形參接收請求參數
即將控制類UserConttroller中的register方法的代碼修改如下:
@RequestMapping("/register") /** *通過形參的計收請求參數,形參名稱與請求參數名稱完全相同 */ public String register(String uname,String upass,Model model) { if(userService.equals(uname)&&userService.equals(upass)){ logger.info("成功"); return "login";//注冊成功,跳轉到login.jsp }else{ logger.info("失敗"); return "register";//返回register.jsp } }
3、通過HttpServetRequest接受請求參數(推薦使用):
即將控制類UserConttroller中的register方法的代碼修改如下:
@RequestMapping("/register") public String register(HttpServletRequest request,Model model) { String uname = request.getParameter("uname"); String upass = request.getParameter("upass"); if(userService.equals(uname)&&userService.equals(upass)){ logger.info("成功"); return "login";//注冊成功,跳轉到login.jsp }else{ logger.info("失敗"); return "register";//返回register.jsp } }
其他@PathVariable、@RequestParam等不多贅述,原理相同。