发表于: 2017-11-06 21:57:49

1 811


一.今日完成

整理Sprng MVC框架关于注解驱动的控制器,处理方法的数据绑定和视图与视图解析器相关知识点.

1.注解驱动的控制器

(1)@RequestMapping支持Ant风格的和带{XXX}占位符的URL

Ant风格的资源地址支持3中匹配符:

?:匹配文件中的一个字符

*:匹配文件名中的任意字符.

**:匹配多层路径

以下URL都是合法的.

/user/*/createUser:匹配/user/aaa/createUser,/user/bbb/createUser等URL.

/user/**/createUser:匹配/user/createUser,/user/aaa/bbb/createUser等URL.

/user/createUser??:匹配/user/createUseraa,/user/createUserbb等URL

/user/{userId}:匹配user/123,user/567等URL

/user/**/{userId}:匹配user/aaa/bbb/123,user/aaa/456等URL

company/{companyId}/user/{userId}/detail:匹配company/123/user/456/detail等URL

通过@PathVariable可以将URL中的占位符参数绑定到控制器方法的入参中去

@RequestMapping(value="/{userId}")
public ModelAndView showDetail(@PathVariable("userId") String userId){
ModelAndView mav = new ModelAndView();
mav.setViewName("user/showDetail");
mav.addObject("user", userService.getUserById(userId));
return mav;
}

类级别的@RequestMapping的URL占位符也可以这样处理.

@RequestMapping的value,method,params以及headers分别表示请求URL,请求方法,请求参数以及报文头的映射条件.

2.请求处理方法签名

Spring MVC对控制器处理方法签名的限制比较宽松,在必要时对方法及方法入参标注相应和注解即可

一般情况下,处理方法的返回值类型为ModelAndView或String,前者包含模型和逻辑视图名,而后者仅代表一个逻辑视图名

典型的处理方法签名:

// ①请求参数按名称匹配的方式绑定到方法入参中,方法返回对应的字符串代表逻辑视图名
@RequestMapping(value = "/handle1")
public String handle1(@RequestParam("userName") String userName,
@RequestParam("password") String password,
@RequestParam("realName") String realName) {
return "success";
}

// ②将Cooke值及报文头属性绑定到入参中、方法返回ModelAndView
@RequestMapping(value = "/handle2")
public ModelAndView handle2(@CookieValue("JSESSIONID") String sessionId,
@RequestHeader("Accept-Language") String accpetLanguage) {
ModelAndView mav = new ModelAndView();
mav.setViewName("success");
mav.addObject("user", new User());
return mav;
}

// ③请求参数按名称匹配的方式绑定到user的属性中、方法返回对应的字符串代表逻辑视图名
@RequestMapping(value = "/handle3")
public String handle3(User user) {
return "success";
}

// ④直接将HTTP请求对象传递给处理方法、方法返回对应的字符串代表逻辑视图名
@RequestMapping(value = "/handle4")
public String handle4(HttpServletRequest request) {
return "success";
}

1)使用@RequestParam绑定请求参数

@RequestParam注解有3个参数:

value参数名。

required:是否必需,默认为uue,表示请求中必须包含对应的参数名,如果存在则抛出异常。

defaultvalue:默认参数名,在设置该参数时,自动将required设为false。极少情况需要使用该参数,也不推荐使用该参数。

下面的实例将userName和age请求参数分别绑定到handle11o方法的userName age中,并自动完成类型转换。如果不存在age请求参数,则将抛出异常。

@RequestMapping(value = "/handle11")
public String handle11(
@RequestParam(value = "userName", required = false) String userName,
@RequestParam("age") int age) {
return "success";
}

2)使用@CookieValue绑定请求中的Cookie值

使用@CookieValue可以让处理方法入参绑定某个Cookie的值,与@RequestParam有3个一样参数

@RequestMapping(value = "/handle12")
public String handle12(
@CookieValue(value = "sessionId", required = false) String sessionId,
@RequestParam("age") int age) {
return "success";
}

3)使用回RequestHeader绑定请求报文头的属性值

请求报文包含了若干个报文头属性,服务器可据此获知客户端信息,通过@RequestHeader即可将报文头属性值绑定到处理方法的入参中。

@RequestMapping(value = "/handle13")
public String handle13(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
return "success";
}

4)使用命令/表单对象绑定请求参数值

所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的POJO.下面实例中User就是一个命令/表单对象。Spring MVC会按请求参数名和命令/表单对象属性名匹配的方式,自动为该对象填充属'性值。支持级联的属性名,如dept. Deptld. Dept. Address. Tel 等

@RequestMapping(value = "/handle14")
public String handle14(User user) {
return "success";
}

5)使用Servlet API对象作为入参

在Spring MVC中,控制器类可以不依赖任何Servlet API对象,但是Spring MVC允许使用Servlet API的类作为处理方法的入参。以下处理方法都可以正确地工作。

@Controller
@RequestMapping("/user")
public class UserController {

@RequestMapping(value = "/handle21")
public void handle21(HttpServletRequest request,
HttpServletResponse response) {
String userName = request.getParameter("userName");
response.addCookie(new Cookie("userName", userName));
}

@RequestMapping(value = "/handle22")
public ModelAndView handle22(HttpServletRequest request) {
String userName = WebUtils.findParameterValue(request, "userName");
ModelAndView mav = new ModelAndView();
mav.setViewName("success");
mav.addObject("userName", userName);
return mav;
}

@RequestMapping(value = "/handle23")
public String handle23(HttpSession session) {
session.setAttribute("sessionId", 1234);
return "success";
}

@RequestMapping(value = "/success")
public String success() {
return "success";
}

@RequestMapping(value = "/fail")
public String fail() {
return "fail";
}

@RequestMapping(value = "/handle24")
public String handle24(HttpServletRequest request,
@RequestParam("userName") String userName) {

return "success";
}

@RequestMapping(value = "/handle25")
public String handle25(WebRequest request) {
String userName = request.getParameter("userName");
return "success";
}

}

在使用Servkt API的类作为入参时,Spring MVC会自动将W'eb层对应的Servlei

对象传递给处理方法的入参。处理方法入参可以同时使用Servlet API类的入参和其他符合要求的入参,它们之间的位置顺序没有特殊要求。

值得注意的是,如果处理方法自行使用HttpservletResponse返回响应,则处理方法的返回值设置成void即可.

Spring MVC在org.springframework.web.context.request包中定义了若干个可代理Servlet原生API类的接口,如WebRequest和Na吉ivew@hRequest,它们也允许作为处理类的入参,通过这些代理类可访问请求对象的任何信息.

6)使用110对象作为入参

Servlet的ServletRequest拥有getlnputstream()和gettReader()方法,可以通过它们该取请求的信息。相应的,Servlet的ServletResponse拥有getoutputstream()和gelwrite()方法,可以通过它们输出响应信息。

Spring MVC允许控制器的处种方法使用java.io.Inputstream/Java.io.Reader及java.io.Outputsiream/Javai).Writer作为方法的入参,Spring MVC将获取SenvletRequest的InputStream/Reader或ServletResponse的OutputSteam/Wri ter,然后传递给控制器的处理方法。

@Controller
@RequestMapping("/user")
public class UserController {

@RequestMapping(value = "/handle31")
public void handle31(OutputStream os) throws IOException {
Resource res = new ClassPathResource("/image.jpg");
FileCopyUtils.copy(res.getInputStream(), os);
}

}


二.明日计划

1.把处理方法的数据绑定和视图与视图解析器相关知识点整理到日报中

2.参考师兄日报,学习使用Spring RMI,分离service和web层


三.遇到问题

暂无


四.收获

以上.


禅道进度:http://task.ptteng.com/zentao/task-view-10399.html



返回列表 返回列表
评论

    分享到