@Controller注解
使用@Controller
注解的类可以不需要集成特定的父类或者接口。 该注解标注的类就是一个SpringMVC Controller
对象。为了让Spring
能够自动找到控制器类,需要使用<context:component-scan../>
元素,该元素指定一个包,这样Spring
会自动扫描该包下的所有带有Spring
注解的累,将其作为Spring
的Bean
。当然也要加上下面的元素:
<!-- 配置annotation类型的处理映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置annotation类型的处理映射器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
@RequestMapping注解
@Controller
注解可以指定了Controller
,但是并不能指定哪个方法处理请求。@RequestMapping
注解指示Spring
用哪个类的哪一个方法处理请求动作。该注解可以用于类、方法。
@Controller
@RequestMapping(value = "/user")
public class UserController {
private static final Log logger = LogFactory.getLog(UserController.class);
//该方法的请求为 http://localhost:8080/user/register GET请求
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String registerForm() {
logger.info(" register GET 方法被调用");
return "registerForm";
}
}
- 用于类的
@RequestMapping(value = "/user")
注解表示该要访问该类下的路由都需要加上/user
; - 用于方法
registerForm
的注解@RequestMapping(value = "/register", method = RequestMethod.GET)
指定该方法处理http://localhost/user/register
请求,同时该方法只能处理GET
请求。 @RequestMapping
默认属性是value
。
@RequestMapping
注解的部分属性
属性 | 类型 | 是否必须 | 说明 |
---|---|---|---|
value | String[] | 否 | 指定请求的地址映射到方法 |
name | String | 否 | 给映射地址一个别名 |
method | RequestMethod[] | 否 | 指定请求的方法类型 |
consumes | String[] | 否 | 指定处理请求的提交内容类型(Content-Type) |
produces | String[] | 否 | 指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中包含的类型 |
params | String[] | 否 | 指定request中必须包含某些参数时,才让该方法处理请求 |
headers | String[] | 否 | 指定request中必须包含某些指定header值,才能让该方法处理请求 |
@RequestParam注解
属性 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | String | 否 | 指定请求头绑定的名称 |
value | String | 否 | name属性的别名 |
required | boolean | 否 | 指定参数是否需要绑定 |
defaultValue | String | 否 | 指定默认值 |
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
@RequestParam("username") String username) {
//...
}
@RequestParam("loginname") String loginname
将请求中的loginname
对应的值赋给loginname
参数。
@PathVariable注解
@PathVariable
注解只有一个value
属性,表示请求中绑定到参数的值的名称。
@RequestMapping(value = "/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable(value = "userId") Integer userId) {
//...
}
@RequestMapping(value = "/pathVariableTest/{userId}")
这是一个动态的请求,{userId}
对于不同的请求有不同的值,@PathVariable(value = "userId") Integer userId
这里指定请求中的userId
会赋值到参数userId
中。
@RequestHeader注解
该注解用于将请求的头信息数据映射到参数上。
@RequestMapping(value = "/requestHeaderTest")
public void requestHeaderTest(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value = "Accept") String[] accepts) {
//...
}
@RequestHeader("User-Agent") String userAgent
将请求头的User-Agent
信息注入到userAgent
参数中。
@CookieValue注解
该注解将请求的Cookie
数据映射到参数中。
public void cookieValueTest(
@CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId) {
logger.info("通过@CookieValue获得数据: " + sessionId);
}
@CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId)
将Cookie
中的JSESSIONID
值设置到sessionId
参数中。
@SessionAttribute注解
该注解可以选择Model
中哪些属性存入到HttpSession
中。
@Controller
@RequestMapping(value = "session")
//将Model中的属性名为user的属性放入HttpSession对象当中
@SessionAttributes("user")
public class SessionAttributesController {
@RequestMapping(value = "/login")
public String login(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model
) {
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
user.setUsername("admin");
model.addAttribute("user", user);
return "welcome";
}
}
@SessionAttributes("user")
指定将Model
中属性为user
的内容存到HttpSession
中。
@ModelAttribute注解
被该注解注释的方法会在Controller
每个方法执行前被执行。
1.第一种情况 ModelAttribute(value=”“)修饰返回具体类型的方法
ModelAttribute(value=”xx”),修饰的方法返回的值会被添加到Model
中,键为ModelAttribute(value="")
的xx
,值为方法返回的值。
控制器:
@Controller
@RequestMapping(value = "/model")
public class ModelAttributeController {
@ModelAttribute(value = "loginname")
public String userModel1(
@RequestParam("loginname") String name) {
return name;
}
@RequestMapping(value = "/login1")
public String login1() {
return "result1";
}
}
表单
<form action="/model/login1" method="post">
<table>
<tr>
<td><label>登录名: </label></td>
<td><input type="text" name="loginname"></td>
</tr>
<tr>
<td><input type="submit" value="登录"></td>
</tr>
</table>
</form>
表单点击登录后,调用ModelAttributeController
控制器的login1
方法,在调用该方法前会先调用userModel1
方法,该方法的返回值会被添加到Model
中,对应的键为loginname
。在视图中可以通过EL
表达式获取。
第二种情况 ModelAttribute注释void方法
控制器:
@Controller
@RequestMapping(value = "/model2")
public class ModelAttribute2Controller {
@ModelAttribute
public void userModel2(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model) {
model.addAttribute("loginname", loginname);
model.addAttribute("password", password);
}
@RequestMapping(value = "/login2")
public String login2() {
return "result2";
}
}
ModelAttribute
修饰没有返回值的方法,这时候如果要将数据添加到Model
中,就需要在参数中添加Model
参数。同样当访问.../login2
路由时,userModel2
方法会先于login2
方法调用,将URL
参数添加到Model
中。最后在视图中通过EL
表达式获取数据。
对应的视图是一个登录表单,不在给出。
第三种情况 ModelAttribute注释返回具体类的方法
控制器:
@Controller
@RequestMapping("/model3")
public class ModelAttribute3Controller {
//...
@ModelAttribute
public User userModel3(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password
) {
return find(loginname, password);
}
//...
}
@ModelAttribute
修饰在返回类的方法上,这里返回的是User
类,那么Model
中添加键为user
,值为返回对象。
第四种情况 @ModelAttritube和@RequestMapping同时修饰一个方法
控制器:
@Controller
@RequestMapping(value = "/model4")
public class ModelAttribute4Controller {
@RequestMapping(value = "/login4")
@ModelAttribute(value = "username")
public String login4() {
return "admin";
}
}
- 此时请求的视图是
/login4
。并且Model
键为username
,值为返回的admin
。
第五种情况 @ModelAttribute注释一个方法的参数
控制器:
@Controller
@RequestMapping(value = "/model5")
public class ModelAttribute5Controller {
@ModelAttribute(value = "user")
public User userModel5(
@RequestParam(value = "loginname") String loginname,
@RequestParam(value = "password") String password
) {
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
return user;
}
@RequestMapping(value = "/login5")
public String login5(@ModelAttribute("user") User user) {
user.setUsername("管理员");
return "result5";
}
}
@ModelAttribute(value = "user")
先修饰了一个方法,指定该方法返回的值插入到Model
中,键为user
。@ModelAttribute("user") User user
修饰了参数,表示login5
方法的参数user
使用Model
中键为user
的值。