在springmvc的开发中,springmvc主要做四件事:1 请求地址的映射 2 请求参数的映射 3 获取业务数据 4 确定返回视图,下面我们分别介绍。
1 请求地址映射
请求地址的映射通常我们采用@requestMapping注解来完成。该注解可以写在类上,表示窄化请求映射目的是为了支持分模块开发,一旦写在类上,该类下所有的方法请求地址都需要带上类上的路径。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Controller
@RequestMapping
(
"/account"
)
public
class
AccountController {
@Autowired
private
AccountService accountService;
@RequestMapping
(value=
"/findAll"
,method=
"RequestMethod.GET"
)
public
String findAll(Model model){
System.out.println(
"表现层:查询所有账户..."
);
// 调用service的方法
List<Account> list = accountService.findAll();
model.addAttribute(
"list"
,list);
return
"list"
;
}
}
|
requestmapping注解中可以通过method指定请求的方式,引申出来有@GETMapping 和@POSTMapping 分别来表示get请求和post请求。
2 请求参数映射
2.1 当请求的参数名称与controller方法中形参名称相同,则能自动封装。
1
|
<
a href
=
"account/findAccount?accountId=10&accountName=zhangsan"
>
查询账户
<
/
a
>
|
1
2
3
4
5
|
@RequestMapping
(
"/findAccount"
)
public
String findAccount(Integer accountId,String accountName) {
System.out.println(
"查询了账户+accountId+"
,"+accountName);
return
"success"
;
}
|
2.2 当controller方法中形参是pojo时,请求的参数如果与pojo的属性名相同,则能自动封装到pojo中。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public
class
Account
implements
Serializable {
private
Integer id;
private
String name;
private
Float money;
//getters and setters
}
<form action=
"account/saveAccount"
method=
"post"
>
账户名称: <input type=
"text"
name=
"name"
><br/>
账户金额: <input type=
"text"
name=
"money"
><br/>
<input type=
"submit"
value=
"保存"
>
</form>
@RequestMapping
(
"/saveAccount"
)
public
String saveAccount(Account account) {
System.out.println(
"保存了账户 "
+account);
return
"success"
;
}
|
2.3 当controller方法中的形参是pojo包装类是,请求的参数方式如下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public
class
Account
implements
Serializable {
private
Integer id;
private
String name;
private
Float money;
private
Address address;
//getters and setters
}
public
class
Address
implements
Serializable {
private
String provinceName;
private
String cityName;
//getters and setters
}
<form action=
"account/saveAccount"
method=
"post"
>
账户名称: <input type=
"text"
name=
"name"
><br/>
账户金额: <input type=
"text"
name=
"money"
><br/>
账户省份: <input type=
"text"
name=
"address.provinceName"
><br/>
账户城市: <input type=
"text"
name=
"address.cityName"
><br/>
<input type=
"submit"
value=
"保存"
>
</form>
@RequestMapping
(
"/saveAccount"
)
public
String saveAccount(Account account) {
System.out.println(
"保存了账户 "
+account);
return
"success"
;
}
|
2.4 当请求参数包含相同名称的多个参数时,controller方法中用数组类型进行映射
1
2
3
4
5
|
<a href=
"account/findAccount?name=zhangsan&name=lisi"
>查询账户</a>
@RequestMapping
(
"/findAccount"
)
public
String findAccount(String[] name) {
return
"success"
;
}
|
2.5 当请求参数名称与controller方法形参名称不一致时,可以通过@RequestParam参数来进行映射,在该注解中我们还可以配置required,defaultvalue.
1
2
3
4
5
|
@RequestMapping
(
"/testRequestParam"
)
public
String testRequestParam(
@RequestParam
(name=
"name"
) String username){
System.out.println(username);
return
"success"
;
}
|
2.6 当springmvc配置为支持restful风格时,我们可以通过@PathVariable 注解来映射请求路径中的占位符
1
2
3
4
5
|
@RequestMapping
(value=
"/testPathVariable/{sid}"
)
public
String testPathVariable(
@PathVariable
(name=
"sid"
) String id){
System.out.println(id);
return
"success"
;
}
|
2.7 当我们想在controller方法中使用原生的request response session 等API时,我们可以直接在方法形参上申明即可。
1
2
3
4
5
|
public
String testServlet(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
ServletContext servletContext = session.getServletContext();
return
"success"
;
}
|
2.8 当我们不想在方法形参上申明又想使用原生的request response session 等API时,可以通过@ModelAttribute注解来提前注入request response session对象。
该注解的方法将在controller方法执行前先执行。 我们定义的controller来继承basecontroller
01
02
03
04
05
06
07
08
09
10
|
public
class
BaseController{
protected
HttpServletRequest request;
protected
HttpServletResponse response;
protected
HttpSession session;
public
void
getServletApi(HttpServletRequest request,HttpServletResponse response,HttpSession session){
this
.request = request;
this
.response = response;
this
.session = session;
}
}
|