一、@Controller和@RequestMapping
1.1@Controller注解
在Spring MVC 中使用 org.springframework.stereotype.Controller注解类型声明某类的实例是控制器
定义控制器步骤如下:
1、为控制器类加注解@Controller
@Controller
public class HelloController {
}
2、扫描控制器所在的包<context:component-scan/>
<!-- 将控制器扫描到容器中 -->
<context:component-scan base-package="controller"/>
1.2@RequestMapping注解
在Spring MVC 中使用 @RequestMapping 将请求与处理方法一一对应 @RequestMapping负责将不同请求映射到对应的控制器方法中
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
@RequestMapping不仅仅可以定义在方法处,还可以定义在类上
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
如果@RequestMapping注解定义在类上的话,请求的url应该是:类注解url+方法注解的url。建议一般在类上也定义@RequestMapping,这样方便维护程序。
在上面的代码中,如果想要访问hello()方法的话,就必须输入如下url:
http://localhost:8080/springmvc/hello/hello
在@RequestMapping指定的URL中可以含有变量参数,使用@PathVariable指定形参接收url中的参数值
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello/{username}")
public String hello(@PathVariable("username") String username){
System.out.println(username);
return "hello";
}
}
@RequestMapping 可以通过 method 属性来限制请求的类型,如GET、POST等。
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello/{username}",method=RequestMethod.GET)
public String hello(@PathVariable("username") String username){
System.out.println(username);
return "hello";
}
}
@RequestMapping也可以使用组合注解来限制方法接收请求的类型
二、前后端数据交互
2.1视图向控制器传参
前端是指前端视图,比如:jsp页面,后端指我们的控制器Controller 前后端数据交互包括: 视图向控制器传参,控制器向视图传参
1、第一种方式使用HttpServletRequest接收请求参数
使用HttpServletRequest 作为Action的参数来接收用户请求,从用户请求中获取参数值
@RequestMapping("/doLogin")
public String doLogin(HttpServletRequest request){
String username=request.getParameter("username");
String password=request.getParameter("password");
boolean success= service.isSuccess(name, pass);
if (success) {
return "/login/login_succ";
}else{
return "/login/login_fail";
}
}
2、第二种方式:使用简单数据类型接收请求参数(这种方式要保证方法形参名要和用户请求参数名保持一致)
@RequestMapping("/doLogin")
public String doLogin(String username,String password){
boolean isLogin= false;
Login login =new Login();
isLogin=login.isSuccess(username.password);
if (isLogin) {
return "/login/login_succ";
}else{
return "/login/login_fail";
}
}
如果不一致,则使用@RequestParam指定
@RequestMapping("/doLogin")
public String doLogin(@RequestParam("username")String uname,
@RequestParam("password")String pass){
boolean success= loginService.isSuccess(uname.pass);
if (success) {
return "/login/login_succ";
}else{
return "/login/login_fail";
}
}
3、第三种方式:使用实体类对象接收请求参数
在项目下新建“entity”包,包下新建一个实体类“LoginParam”用于接收参数
在Action中使用“LoginParam”对象作为参数来接收表单数据
@RequestMapping("/doLogin")
public String doLogin(LoginParam param){
boolean success= loginService.isSuccess(param.getUsername(), param.getPassword());
if (success) {
return "/login/login_succ";
}else{
return "/login/login_fail";
}
}
2.2控制器向视图传参
1、第一种方式通过HttpServletRequest传递数据
@RequestMapping("/doLogin")
public String doLogin(LoginParam param,HttpservletRequest request){
boolean success = loginService.isSuccess(param.getUsername(),param.getPassword());
if(success){
request.setAttribute("param", param);
SimpleDateFormat df = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
request.setAttribute ("current", df.format(new Date()));
return "/login/login_succ";
}else{
return "/login/login_fail";
}
}
2、第二种方式使用Model或者Map或者ModelMap传递数据
可以使用SpringMVC提供的Model对象来完成控制器和视图之间数据的传递, Model是一个Map的数据结构,也可以使用Map/ModelMap作为入参
@RequestMapping("/doLogin")
public String doLogin(LoginParam param,Model model){
boolean success = loginService.isSuccess(param.getUsername(),param.getPassword());
if(success){
model.setAttribute("param", param);
SimpleDateFormat df = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
request.setAttribute ("current", df.format(new Date()));
return "/login/login_succ";
}else{
return "/login/login_fail";
}
}
3、第三种方式使用ModelAndView传递数据
@RequestMapping("/doLogin")
public ModelAndView doLogin(LoginParam param){
boolean success = loginService.isSuccess(param.getUsername(),param.getPassword());
ModelAndView mv=new ModelAndView();
if(success){
SimpleDateFormat df = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
mv.setViewName("/login/login_succ");
mv.addObject("param",param);
mv.addObject("current",current);
}else{
mv.setViewName("/login/login_fail");
}
return mv;
}