- Controller注解:用于标记一个类,使用该注解标记过的类就是一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类,分发器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。eg:@Controller
public class newHelloController {} - @RequestMapping注解:可以用来注释一个控制器类,这时候类中的所有方法都将映射为相对于类级别的请求。eg:@Controller
@RequestMapping(value=”/user”)//注解类,该类下的所有方法都对应改路径
public class userController {} 访问路径:http://localhost:8080/SpringMVCTest/user/register ;注释方法时,被注释的方法将成为一个请求处理方法。eg:@RequestMapping(value=”/hello”)
public String hello(Model model){}
- value属性:是@RequestMapping注释的默认属性,如果只有唯一的属性则可以省略属性名。
- method属性:用来指示该方法仅仅处理哪些HTTP请求。
- consumes属性:指定处理请求的提交内容类型。
- produces属性:指定返回的内容类型。
- params属性:指定request中必须包含某些参数值时才让该方法处理。
- header属性:指定request中必须包含某些指定的header值,才让该方法处理请求。
- Model和ModelMap
- Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器.如果处理方法的参数为Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数.在处理方法内部,开发者就可以通过调用这个参数对象访问模型数据中的所有数据,也可以向模型中添加新的属性数据.示例代码如下:
@ModelAttribute 注解注释的方法会优先调用,负责接收前台jsp页面传入的参数。
package com.xing.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*@author xpengfei
*@creat 3:25:30 PM Sep 15, 2017
*/
@Controller
public class userTestModelAndModelMap {
private static final Log logger=LogFactory.getLog(userTestModelAndModelMap.class);
@ModelAttribute
public void userModel(String username,String password,Model model){
logger.info("***********userModel方法***********");
//创建User对象存储jsp页面传入的参数
User user=new User();
user.setUsername(username);
user.setPassword(password);
//将user对象添加到Model中
model.addAttribute("user", user);
}
@RequestMapping(value="login1")
public String login(Model model){
logger.info("login1---------------------");
//从Model中获取User对象
User user=(User)model.asMap().get("user");
user.setTestName("hhhhhh1111111111");
System.out.println(user+"************************");
return "result1";
}
}
package com.xing.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*@author xpengfei
*@creat 3:38:43 PM Sep 15, 2017
*/
@Controller
public class userTestModelAndModelMap2 {
private static final Log logger=LogFactory.getLog(userTestModelAndModelMap2.class);
@ModelAttribute //@ModelAttribute注解修饰的方法会先于login调用,用于接收前台jsp页面传入的参数
public void userModel2(String username,String password,ModelMap modelMap){
logger.info("userModel2***********");
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setTestName("hhhhh2222222222");
modelMap.addAttribute("user", user);
}
@RequestMapping(value="/login2")
public String login2(ModelMap modelMap){
logger.info("login2***************");
User user=(User)modelMap.get("user");
System.out.println(user+"---------------------");
return "result2";
}
}
4.ModelAndView的使用示例:
package com.xing.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
*@author xpengfei
*@creat 4:14:52 PM Sep 15, 2017
*/
@Controller
public class userTestModelAndModelMap3 {
private static final Log logger=LogFactory.getLog(userTestModelAndModelMap3.class);
@ModelAttribute
public void userModel3(String username,String password,ModelAndView modelAndView){
logger.info("userModel3*************");
User user=new User();
user.setUsername(username);
user.setPassword(password);
//将user对象添加到ModelAndView的Model中
modelAndView.addObject("user", user);
}
@RequestMapping(value="login3")
public ModelAndView login3(ModelAndView modelAndView){
logger.info("login3-----------");
User user =(User)modelAndView.getModel().get("user");
System.out.println(user);
user.setTestName("333333hhhhhhhhhhhhhh");
//设置返回的视图名称
modelAndView.setViewName("result3");
return modelAndView;
}
}
5.@RequestParam注解:
属性:
- name 类型String 用于指定请求头绑定的名称
- value 类型String name属性的别名
- required 类型 boolean 指示参数是否必须绑定
- defaultValue 类型String 如果没有传递参数而使用的默认值
使用示例代码:
package com.xing.controller;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;
/**
*@author xpengfei
*@creat 2:56:32 PM Sep 15, 2017
*/
@Controller
@RequestMapping(value="/user")//注解类,该类下的所有方法都对应改路径
public class userController {
//定义静态User类型的list用于代替数据库保存用户注册的信息
private static List<User>userList;
//构造类,初始化List
public userController(){
userList=new ArrayList<User>();
}
private static final Log logger=LogFactory.getLog(userController.class);
@RequestMapping(value="/register",method=RequestMethod.GET)
//响应请求http://localhost:8080/SpringMVCTest/user/register 支持get方法
public String registerForm(){
logger.info("register get 方法被调用-------------------");
//跳转到注册页面
return "register";
}
@RequestMapping(value="/register",method=RequestMethod.POST)
//响应请求http://localhost:8080/SpringMVCTest/user/register 支持post方法
public String register(
//将请求中的username参数的值赋给username变量,其他两个同样处理
@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("testName") String testName
){
logger.info("register post 方法被调用------");
//创建User对象
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setTestName(testName);
//模拟数据库存储user
userList.add(user);
//跳转到登录界面
return "login";
}
//响应请求http://localhost:8080/SpringMVCTest/user/login
@RequestMapping(value="/login")
public String login(
//将请求中的username参数的值赋给username变量,其他两个做同样处理
@RequestParam("username") String username,
@RequestParam("password") String password,
Model model
){
logger.info("登录名:"+username+"\t密码:"+password);
//在集合中查找用户是否存在,
for(User user:userList){
//若用户名和密码不匹配,则不会跳转到欢迎页面
if(user.getUsername().equals(username)
&& user.getPassword().equals(password)){
model.addAttribute("user", user);
return "welcome";
}
}
return "login";
}
}
程序运行结果如下图:
6.@PathVariable、@RequestHeader、@CookieValue注解
- @PathVariable注解:可以非常方便的获得请求URL中的动态参数,该注解只支持一个属性value,类型为String表示绑定的名称,如果省略则默认绑定同名参数。
- @RequestHeader注解:将请求的头部信息区数据映射到功能处理方法的参数上。name属性 用于指定头部绑定的名称 类型为String;value属性 是name属性的别名 类型为String;required属性 表示参数是否必须绑定 类型为Boolean;defaultValue属性:如果没有传递参数而是用的默认值 类型String;
- @CookieValue注解:用于将请求的Cookie数据映射到功能处理方法的参数上。属性和@RequestHeader的属性相同;
示例:
package com.xing.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*@author xpengfei
*@creat 6:01:57 PM Sep 15, 2017
*@PathVariable、@RequestHeader、@CookieValue注解的示例
*/
@Controller
@RequestMapping(value="/user")
public class PRCController {
private static final Log logger=LogFactory.getLog(PRCController.class);
// 跳转到jsp页面
@RequestMapping(value="/PRCController")
public String PRCController(){
return "PRCController";
}
/*
* 测试@PathVariable注解
* 该方法映射的请求为:
*/
@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(
@PathVariable Integer userId
){
logger.info("通过@PathVariable获取的数据:"+userId);
}
/*
* 测试方法@RequestHeader注解
* 该方法映射的请求为:
*/
@RequestMapping(value="/requestHeaderTest")
public void requestHeaderTest(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[]accepts
){
logger.info("通过@RequestHeader注解获得的数据:"+userAgent);
for(String accept: accepts){
logger.info(accept+"-------------");
}
}
/*
* 测试@CookieValue注解
*/
@RequestMapping(value="/CookieValueTest")
public void cookieValueTest(
@CookieValue(value="JSEEIONID",defaultValue="")String sessionId
){
logger.info("通过@CookieValueTest获得的数据:"+sessionId);
}
}
结果如下:
7.@SessionAttributes属性:允许我们选择性的指定Model中的哪些属性需要转存到HttPSession中.
- names属性: String[]类型,是Model中属性的名称,即存储在HttpSession当中的属性名称。
- value属性:String[]类型,name属性的别名。
- types属性:Class <”?”>类型,指示参数是否必须绑定。
PS:上边<>中的?单独打的是否排版有问题,就加了引号.
eg:
//将Model中属性名为user的属性放入HttpSession对象中
@SessionAttributes(“user”)
public class userController {}
这样user对象就被放到了session中了.
还可以写为:@SessionAttributes(types={User.class},value=”user”)
还可以放置多个对象到HttpSession中:
@SessionAttributes(types={User.class,Dept.class},value={“user”,”dept”})
types属性是用来指定放入HttpSession当中的对象类型.
8.@ModelAttribute注解:只支持一个属性value,类型为String,表示绑定的属性名称。
- 被@ModelAttribute注解注释的方法会在Controller每个方法执行前被执行,因此当一个Controller映射到多个URL时,需要谨慎使用。
- @ModelAttribute(value=“”)注释:返回具体类的方法。
- @ModelAttribute 注释void返回值的方法:model属性的名称和值由void方法内部model.addAttribute()方法实现,前提是要在方法的参数列表中出入一个Model类型的参数。
- @ModelAttribute注释返回具体类的方法
例如:
@ModelAttribute
public User userModel(
@RequestParam(“username”) String username,
@RequestParam(“password”)String password
){
return find(username,password);
}
在此例中userModel方法的返回值类型隐含表示,在这个例子中返回的是User类型,则model属性的名称就是user。
- @RequestMapping和@ModelAttribute同时注释一个方法时,方法返回的不再是视图名称:
例如:
@RequestMapping(value=“login”)
@ModelAttribute(value=“username”)
public String login(){
return “admin”;
}
这种使用方法不是返回名为admin的视图,而是相当于在request中封装了username(相当于key)=admin(相当于value);
- @ModelAttribute注释一个方法的参数
- 这时参数就是model的属性
未完待续……