视图到控制层View to Controller
package cn.smbms.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserController {
private Logger logger=Logger.getLogger(IndexController.class);
@RequestMapping("/welcome")
public String welcome(@RequestParam String username){
logger.info("user:"+username);
return "index";
}
}
地址栏中输入:
http://localhost:8080/SMBMS_MVC/welcome?username=zhangsan
控制台信息可以看到日志信息:
2019-6-1 16:42:39[ INFO](IndexController.java:25) index:zhangsan
上述方法中如果输入:
`http://localhost:8080/SMBMS_MVC/welcome`
此时页面就会报错,因为参数username不存在导致报错,这样就需要使用@RequestMapping以及@RequestParam来解决。
@RequestMapping
负责将不同请求映射到对应的控制器方法上。最重要的是@RequestMapping是全局唯一。
1、通过请求URL进行映射
@RequestMapping("/welcome")或@RequestMapping(value="/welcome")
@RequestMapping不仅可以在方法处定义,还可以在类定义。
@Controller
@RequestMapping("/user")
public class UserController {
private Logger logger=Logger.getLogger(IndexController.class);
@RequestMapping("/welcome")
public String welcome(@RequestParam String username){
logger.info("user:"+username);
return "index";
}
}
以上的访问地址就是:
http://localhost:8080/SMBMS_MVC/user/welcome?username=zhangsan
2、通过请求参数、请求方法进行映射
package cn.smbms.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class IndexController{
private Logger logger=Logger.getLogger(IndexController.class);
@RequestMapping(value="/welcome",method=RequestMethod.GET,params="username")
public String welcome1(@RequestParam String username){
logger.info("index:"+username);
return "index";
}
}
http://localhost:8080/SMBMS_MVC/welcome?username=zhangsan
中参数不是username,也会报错,无法进入welcome的处理方法中。如果将方法的参数去掉@RequestParam,虽然不会报错,但是取不到值。
2、@RequestParam
在方法入参处指定@RequestParam的请求参数,
value:参数名
required:是否必须,默认为true。表示是否参数中必须包含对应的参数名,如果不包含,则报错。
defaultValue:默认参数名,不推荐用。
package cn.smbms.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class IndexController{
private Logger logger=Logger.getLogger(IndexController.class);
@RequestMapping(value="/welcome",method=RequestMethod.GET,params="username")
public String welcome1(@RequestParam(value="username",required=false) String username){
logger.info("index:"+username);
return "index";
}
}
运行正确,如果没有传参,也不会报错,如果传参,就能取到值。
控制层到视图Controller to view
有多种方式输出
1、ModelAndView
package cn.smbms.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController{
private Logger logger=Logger.getLogger(IndexController.class);
@RequestMapping("/index1")
public ModelAndView index(String username){
ModelAndView modelAndView=new ModelAndView();
//第一个是key值,保证爱Model作用域内唯一就可以,第二个value
modelAndView.addObject("username", username);
modelAndView.setViewName("index");
logger.info("springMVC");
return modelAndView;
}
}
访问http://localhost:8080/SMBMS_MVC/index1?username=zhangsan
,在页面中取值username------>${username},值为zhangsan
2、Model
package cn.smbms.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController{
private Logger logger=Logger.getLogger(IndexController.class);
@RequestMapping("/index2")
public String index2(String username,Model model){
model.addAttribute("username",username);
model.addAttribute(username);
return "index";
}
}
model.addAttribute(“username”,username);的key值也不是必须的,可以在页面中直接通过类型获取
username------>${string}
重新访问,得到的结果有效。
相同的道理,可以加入一个类型,例如
@RequestMapping("/index2")
public String index2(String username,Model model){
model.addAttribute("username",username);
model.addAttribute(username);
User user=new User();
user.setName(username);
model.addAttribute(user);
return "index";
}
取值时
<h1>username------>${username}</h1>
username------>${string}
User.name---->${user.name}
一样得到想要的值
3、Map
@RequestMapping("/index3")
public String index3(String username,Map<String,Object> model){
model.put("username", username);
return "index";
}
直接通过${username}获得值,Model其实就是一个Map结构,同样可以用来获取值。
springMVC一般都是使用Model取值。