在springmvc的开发中,springmvc主要做四件事:1 请求地址的映射 2 请求参数的映射 3 获取业务数据 4 确定返回视图,下面我们分别介绍。
1 请求地址映射
请求地址的映射通常我们采用@requestMapping注解来完成。该注解可以写在类上,表示窄化请求映射目的是为了支持分模块开发,一旦写在类上,该类下所有的方法请求地址都需要带上类上的路径。
[Java] 纯文本查看 复制代码 @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方法中形参名称相同,则能自动封装。
[AppleScript] 纯文本查看 复制代码 <a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a>
[Java] 纯文本查看 复制代码 @RequestMapping("/findAccount")
public String findAccount(Integer accountId,String accountName) {
System.out.println("查询了账户+accountId+","+accountName);
return "success";
}
2.2 当controller方法中形参是pojo时,请求的参数如果与pojo的属性名相同,则能自动封装到pojo中。
[Java] 纯文本查看 复制代码 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包装类是,请求的参数方式如下:
[Java] 纯文本查看 复制代码 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方法中用数组类型进行映射
[Java] 纯文本查看 复制代码 <a href="account/findAccount?name=zhangsan&name=lisi">查询账户</a>
@RequestMapping("/findAccount")
public String findAccount(String[] name) {
return "success";
}
2.5 当请求参数名称与controller方法形参名称不一致时,可以通过@RequestParam参数来进行映射,在该注解中我们还可以配置required,defaultvalue.
[Java] 纯文本查看 复制代码 @RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
System.out.println(username);
return "success";
}
2.6 当springmvc配置为支持restful风格时,我们可以通过@PathVariable 注解来映射请求路径中的占位符
[Java] 纯文本查看 复制代码 @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时,我们可以直接在方法形参上申明即可。
[Java] 纯文本查看 复制代码 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
[Java] 纯文本查看 复制代码 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;
}
}
|
|