控制器的基本使用
使用 @RequestMapping 映射请求
1)通过 URL 映射
public class UserController {
("/user/createUser") // 等同于 @RequestMapping(path="/user/createUser")
public String createUser(){
....
return "user/createSuccess";
}
}
("/user") //以下所有 @RequestMapping 的响应 url 基于该 @RequestMapping 定义的 url
public class UserController {
("/createUser") //响应 "/user/createUser"
public String createUser(){
....
return "user/createSuccess";
}
}
/user/*/createUser:匹配类似 “user/aa/createUser”;/user/**/createUser:匹配类似 “user/aa/bbb/createUser”,“user/createUser”;/user/createUser??:匹配类似 “user/createUseraa”;
/user/{userId}:匹配类似 “user/123”;/company/{companyId}/user/{userId}:匹配类似 “/company/123/user/12345”;
("/user")
public class UserController {
("/{userId}")
public String showDetail( ("userId") String userId){
System.out.println(userId); //如果请求为 "/user/201502012",则 userId = "201502012"
...
return ...;
}
}
2)通过请求方法、请求参数,请求报头映射
("/user")
public class UserController {
/*使用请求方法和请求参数映射请求
以下例子映射一个GET请求: /user/test1?userId=xxx */
(path="/test1",method=RequestMethod.GET,params="userId")
public String test1 ( ("userId") String userId){ //使用 @RequestParam 标注请求参数
System.out.println(userId);
...
return "user/test1";
}
/*使用报头映射请求*/
(path="/test2",headers="content-type=text/*")
public String test2(){
....
return "user/deleteUserSuccess";
}
}
params="userId" :请求参数为 “userId”;params="!userId" :请求参数不为 “userId”;params="userId!=123" :请求参数为 “userId” 且参数值不为 123;params={"userId","gameId"} :请求参数为 “userId”,“gameId”;
请求处理方法签名
- 入参:Spring MVC 对控制器方法请求的限制是很宽松的,必要时可以对方法入参标注相应的注解(如:@PathVariable、@RequestParam、@RequestHeader 等);
- 返回值:一般处理方法的返回值类型为ModelAndView或 String,ModelAndView 包含模型和逻辑视图名,String 代表一个逻辑视图名;
- value:参数名;
- required:是否必须,默认为 true;
- defaultValue:默认参数名,不常用;
(path="/handle1",method= RequestMethod.POST,params={"userName","password"})
public String handle(("userName") String userName,
(value="password", required=false) String passowrd){
User user = new User(userName,passowrd);
.....
}
("/handle2")
public String handle(("userid") String userId){
......
}
("/handle3")
public String handle(("Accept-Language") String acceptLanguage){
.......
}
("/handle4")
public ModelAndView handle2(User user){
return new ModelAndView("success","user",user);
}
("/handle5")
public String handle3(HttpServletRequest request, ("userId") String userId){
request.getSession().setAttribute("userId",userId); //通过 HTTPServletRequest 对象设置 Session
return "success";
}
RequestMapping("/handle5")
public void handle5(OutputStream out) throws IOException {
Resource resource = new ClassPathResource("/image/imageTest.jpg"); //复制图片文件给ServletRequest的输出流
FileCopyUtils.copy(resource.getInputStream(),out);
}
模型数据处理
- ModelAndView:当处理方法返回值类型为ModelAndView时,方法体可以通过该对象添加模型数据;
- @ModelAttribute:在方法入参标注该注解后,入参的对象就会放置在该数据模型中;
- Map 和 Model:如果方法入参为 org.springframework.ui.Model、org.springframework.ui.ModelMap、java.util.Map 时,当处理方法返回时,Map中的数据会自动添加到模型中;
- @SessionAttribute:将模型中的某个属性暂存在 HttpSession 中,以便多个请求共享该属性;
("/handle4")
public ModelAndView handle2(User user){
ModelAndView mav = new ModelAndView();
mav.setViewName("success");
mav.addObject("user",user);
return mav;
}
//或者
("/handle4")
public ModelAndView handle2(User user){
ModelAndView mav = new ModelAndView("success");
mav.addObject("user",user);
return mav;
}
//或者
("/handle4")
public ModelAndView handle2(User user){
return new ModelAndView("success","user",user);
}
<%--通过EL表达式的Request域隐含对象获取--%>
<h1>your name is <c:out value="${user.name}"/> </h1>
<h1>your name is ${user.name} </h1>
<%--通过JSP隐式对象获取--%>
<h1>your name is <c:out value="request.getAttribute('user').getName()"/> </h1>
("/handle4")
public ModelAndView handle2(User user){
if(user == null)
return new ModelAndView("fail","error",new String("用户对象为空值".getBytes(),"UTF-8"));
//将中文字符强制转为与程序编码相同的”UTF-8“
else
return new ModelAndView("success","user",user);
}
("/handle4")
public String handle7(("user") User user){
user.setId("20130602613");
return "success";
}
("user")
public User getUser(){
User user = new User();
user.setId("20130602613");
return user;
}
("/handle4")
public String handle7(("user") User user){
return "success";
}
③ Map / Model
("/handle9",params={"name","password","credits"})
public String handle(User user,ModelMap modelMap){
modelMap.put("user",User); //将user放置到ModelMap中
return "showUser";
}
//等同于:
("/handle9",params={"name","password","credits"})
public ModelAndView handle(User user){
return new ModelAndModel("showUser","user",user);
}
//等同于:
("/handle9",params={"name","password","credits"})
public String handle(("user") User user){
return "showUser";
}
④ @SessionAttribute
//同个控制器内请求重定向,同时携带模型的示例
//整个路由过程:响应 "/user/handle1" 请求,输出到 "/user/showUser" 逻辑视图
("/user")
("user") //自动将本处理器任何处理方法属性名为"user"的模型属性透明地储存到 HttpSession 中;
public class UserController {
("/handle1")
public String handle1(("user") User user){ //获取到的 User 对象模型会自动添加到隐含对象user中
user.setName("assad");
return "redirect:/user/handle1"; //转发到 "/user/handle2" 请求,此时携带了隐含对象user
}
("/handle2")
public String handle2(ModelMap modelMap, SessionStatus sessionStatus){
User user = (User)modelMap.get("user"); //读取隐含模型中"user"模型的数据
if(user != null ){
user.setName("Vancy");
sessionStatus.setComplete(); //清除本处理器对应的会话属性,即清除HttpSession中的"user"模型
}
return "/user/showUser";
}
}
请求转发和重定向
- 转发(forward):控制器内转发请求、接受请求的处理方法之间隐含对象共享;客户端浏览器中的页面URL不变,;
- 重定向(redirect):控制器内重定向请求、接受请求的处理方法之间隐含对象不共享;客户端浏览器中的页面URL改变为重定向后的URL;
("/user")
public class UserController {
(value="/handle1",params="userId")
public String handle1(HttpServletRequest request,("userId") String userId){
request.setAttribute("userId",userId);
return "forward:/user/handle2"; //转发请求到"/user/handle2"
}
("/handle2")
public String handle2(HttpServletRequest request){
return "/user/showUser"; //在"user/showUser"中 ${userId} 可以获取到"/user/handle1"的请求参数"userId"值;
}
}
("/handle1")
public String redirectToBaidu(){
return "redirect:https://www.baidu.com"; //重定向到百度
}
("/handle2",method=RequestMethod.GET,params="keyword")
public String baiduSearch(("keyword") String keyword){
return "redirect:https://www.baidu.com?word="+keyword; //重定向到百度,并进行关键词搜索
}
518



被折叠的 条评论
为什么被折叠?



