【石家庄校区】总复习系列贴-springMvc(二)
1. SpringMvc常用注解
i. @Controller
1. @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
ii. @RequestMapping
1. RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。返回值会通过视图解析器解析为实际的物理视图,对于 InternalResourceViewResolver 视图解析器,会做如下的解析:通过 prefix + returnVal +suffix 这样的方式得到实际的物理视图,然后做转发操作;
<!-- 配置视图解析器:如何把 handler 方法返回值解析为实际的物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
a) value:2. RequestMapping注解有六个属性:
value:指定请求的实际地址;
b) method:
method: 指定请求的method类型, GET、POST、PUT、DELETE等
c) consumes:
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
d) produce:
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
e) params;
params: 指定request中必须包含某些参数值是,才让该方法处理。
f) headers:
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping("/helloword/?/aa")的 Ant 路径,匹配符:
? :匹配文件名的一个字符
* :匹配文件名的所有字符
**:匹配多层路径
iii. Restful请求处理
1. @PathVariable
a) 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:
@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)
public String getLogin(@PathVariable("userId") String userId,
@PathVariable("roleId") String roleId){}
2. @ResponseBody
a) 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
b) 使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
iv. @RequestParam
1. 使用@RequestParam常用于处理简单类型的绑定。
2. value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
3. required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报TTP Status 400 -Required Integer parameter 'XXXX' is not present
4. defaultValue:默认值,表示如果请求中没有同名参数时的默认值
5. 这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
v. @CookieValue
1. 作用:用来获取Cookie中的值;
2. 参数:value:参数名称 required:是否必须 defaultValue:默认值
vi. @SessionAttributes
1. @SessionAttributes即将值放到session作用域中,写在class上面。@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值),还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)。
@SessionAttributes(value = {"user"}, types = {String.class})
@RequestMapping("/springmvc")
@Controller
public class SessionAttributesTest {
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String, Object> map) {
User user = new User(1, "刘邦", "qwe", "123", "辽宁");
map.put("user", user);
map.put("school", "重庆");
return "success";
}
}
2. @ModelAttribute
a) 代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。
2. springMvc返回值
a) ModelAndView
i. controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
b) String
i. controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/item/editItem.jsp
return "item/editItem";
ii. redirect 重定向
Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。
//重定向到queryItem.action地址,request无法带过去
return "redirect:queryItem.action";
redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。
由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:
/item/queryItem?...&…..
iii. forward:请求转发
controller方法执行后继续执行另一个controller方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。
//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";
forward相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。
c) Void
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
1、使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);
2、也可以通过response页面重定向:response.sendRedirect("url")
3、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串")