本文目录
- Controller注解
- Controller 注解用法
- Controller 接收请求参数
- 通过形参接收请求参数
- 通过实体Bean 接收请求参数
- 通过HttpServletRequst接收请求参数
- 通过RequestParam注解接收请求参数
- 通过PathVariable注解接收请求参数
- 通过ModelAttribute注解接收请求参数
- 修饰的方法有返回值
- 修饰的方法没有返回值
Controller注解
在Spring中 Controller
注解用于指示Spring类的实例是一个控制器,相对于实现Controller接口变得更加简单。而且实现Controller接口只能处理一个单一的请求,而是用@Controller
注解可以支持同时处理多个请求动作,更加灵活。@Controller
用于标记一个类,使用他标记的类就是一个SpringMVC Controller
对象,即一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping
注解的方法才是真正处理请求的处理器。
在使用Controller
注解前,需要在Spring
配置文件中打开注解扫描
<context:component-scan base-package="com.lucas"/>
Controller 注解用法
在使用注解前,创建一个 SpringMVC
工程:
@Controller
public class LoginControl {
@RequestMapping(value = "/index/login")
public String login(){
return "login";
}
}
@Controller
表示该类是一个控制器类,@RequestMapping
注解用来映射一个请求,value="/index/login"
表示请求由该注解下的login
方法进行处理。
所以当请求’/index/login’的地址,可以转发到LoginControl
的login()
方法进行处理
前面的RequestMapping
注解也可以加到Controller
类上 ,如下所示,请求得到同样的结果
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
}
Controller 接收请求参数
通过形参接收请求参数
首先在之前的工程上增加如下修改
login.jsp
修改如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index/add" method="post">
<div>
名字:<input name="name" >
</div>
<div>
年龄:<input name="age" >
</div>
<div>
<input type="submit" value="添加用户">
</div>
</form>
</body>
</html>
增加success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>添加成功</h2>
</body>
</html>
在LoginControl
中添加 add()
方法,该方法增加两个参数age
和name
,该参数名称需要和表单input
中name
的名称一致。
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(int age,String name){
System.out.println("age:"+age+" name:"+name);
return "success";
}
}
请求结果如下:
控制台打印了请求参数信息
通过实体Bean 接收请求参数
在前面工程基础上新建实体类User
public class User {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
将LoginControl
中 的add()
方法参数修改如下:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(User user){
System.out.println("user:"+user );
return "success";
}
}
执行结果:
通过HttpServletRequst接收请求参数
将LoginControl
中 的add()
方法参数修改如下:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(HttpServletRequest request){
System.out.println("request age:"+ request.getParameter("age") );
System.out.println("request name:"+ request.getParameter("name") );
return "success";
}
}
打印如下:
通过RequestParam注解接收请求参数
RequestParam注解作用:把请求中的指定名称的参数传递给控制器中的形参赋值
注解属性
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供
将LoginControl
中 的add()
方法参数修改如下:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(@RequestParam(value="name",required=false)String username,@RequestParam(value="age",required=false)String age){
System.out.println("RequestParam age:"+ age);
System.out.println("RequestParam name:"+ username );
return "success";
}
}
打印如下:
通过PathVariable注解接收请求参数
PathVariable注解作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
注解属性 value:指定url中的占位符名称
优点:Restful风格的URL 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
在login.jsp
中添加一个a标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index/add" method="post">
<div>
名字:<input name="name" >
</div>
<div>
年龄:<input name="age" >
</div>
<div>
<input type="submit" value="添加用户">
</div>
</form>
<a href="${pageContext.request.contextPath}/index/hello/1">PathVariable注解请求</a>
</body>
</html>
将LoginControl
中 添加sayHello()
方法:
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@RequestMapping(value = "/add")
public String add(@RequestParam(value="name",required=false)String username,@RequestParam(value="age",required=false)String age){
System.out.println("RequestParam age:"+ age);
System.out.println("RequestParam name:"+ username );
return "success";
}
@RequestMapping(path="/hello/{id}")
public String sayHello(@PathVariable(value="id") String id) {
System.out.println("id="+id);
return "success";
}
}
通过ModelAttribute注解接收请求参数
ModelAttribute注解作用
- 出现在方法上:表示当前方法会在控制器方法执行前线执行。
- 出现在参数上:获取指定的数据给参数赋值。
修饰的方法有返回值
给User中添加一个id属性,再到UserController中添加一个parameterUser()方法,给user添加id,
在add方法中user已经被上面的parameterUser先执行了修改,已经给id赋值
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@ModelAttribute
public User parameterUser(){
User user = new User();
user.setId(1);
return user;
}
@RequestMapping(value = "/add")
public String add(User user){
System.out.println("user :"+ user);
return "success";
}
}
修饰的方法没有返回值
在上面案例基础上,把parameterUser的返回值去掉,增加一个Map来存储数据,存储的key为user,在add方法中使用@ModelAttribute(“user”)User user获取在parameterUser()方法中赋值的数据。程序运行后,add方法的user参数能取到parameterUser方法赋值的数据。 执行结果同上
@Controller
@RequestMapping("/index")
public class LoginControl {
@RequestMapping(value = "/login")
public String login(){
return "login";
}
@ModelAttribute
public void parameterUser(Map<String,User> userMap){
User user = new User();
user.setId(2);
userMap.put("user",user);
}
@RequestMapping(value = "/add")
public String add(@ModelAttribute("user")User user){
System.out.println("user :"+ user);
return "success";
}
}