常用注解元素
@Controller
标注在Bean的类定义处
@RequestMapping
真正让Bean具备Spring MVC Controller功能的是@RequestMapping这个注解
@RequestMapping可以标注在类定义处,将Controller和特定请求关联起来;
还可以标注在方法签名处,以便进一步对请求进行分流
配套的属性有:
value 需要跳转的地址
method基于RestFul的跳转参数,有RequestMethod.get post put delete等
params 符合某个参数的时候才调用该方法
Headers 符合头信息的时候才调用
@SessionAttributes
将结果放入session内
@ModelAttribute
存储在响应内容ModelMap或者ModelAndView进行保存值传到前台,当如果你需要保存值比较少
的时候可以采用这种方式进行保存值并且保存到前台显示
在默认情况下,ModelMap中的属性作用域是 request 级别,相当于HttpServletRequest中的request.setAttribute()一样,在JSP视图页面中通过request.getAttribute(“attributename”)或者通过
${ attribute name } EL表达式访问模型对象中的属性对象
如果希望在ModelMap 的作用域范围为 session,可以有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现 如:
@Controller
@RequestMapping("/login.do")
@SessionAttributes("currUser")
public class BbtForumController{。。。。。}
@ResponseBody
标注后 返回String对象的结果为response内容体,不标注的话 作为dispatcherurl使用
@PathVariable
允许将请求路径的制定内容当做求情的参数使用
返回类型
请求处理方法入参的可选类型 说明
void 此时逻辑视图名由请求处理方法对应的URL确定,如以下的方法:
@RequestMapping("/welcome.do")
public void welcomeHandler(){
}
对应的逻辑视图名为“welcome”
String 此时逻辑视图名为返回的字符,如以下的方法:
@RequestMapping(method =RequestMethod.GET)
public StringsetupForm(@RequestParam("ownerId") int ownerId, ModelMap model){
Owner owner = this.clinic.loadOwner(ownerId);
model.addAttribute(owner);
return "ownerForm";
}
对应的逻辑视图名为“ownerForm”
ModelMap 和返回类型为void一样,逻辑视图名取决于对应请求的URL,
如下面的例子:
@RequestMapping("/vets.do")
public ModelMap vetsHandler(){
return new ModelMap(this.clinic.getVets());
}
对应的逻辑视图名为“vets”,返回的ModelMap将被作为请求对应的模型对象,
可以在JSP视图页面中访问到。
ModelAndView
返回方式
1使用无返回方法跳转,如果使用返回方法进行跳转的话,则会通过视图解析器进行以
prefix(前缀)+方法名+suffix(后缀)组成的页面文件名称.
2使用一个返回的字符串方法作为跳转,使用字符串跳转的话好处就是在return的时候可
以自己指定返回的名字,JSP组成是prefix(前缀)+返回的字符串+suffix(后缀)
3返回一个ModelAndView类型,使用setViewName方法则可以跳转到指定的页面.
路径匹配形式
1、单一Controller 对应 单一的请求路径
2、单一Controller 对应多个请求路径
3、单一Controller 对应多个请求路径,且路径内可以含有参数的形式
Demo code andUseCase
@Controller
@RequestMapping("/login.do")
publicclass SinglePathWithController{}
@Controller
@SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"})
publicclass AdapterMultiPathController{}
@Controller
@RequestMapping(value ="/rest")
publicclass RestWithController{}
无返回
//无返回值 无参数返回的是根据prefix前缀+@RequestMapping value+suffix
后缀组成
@RequestMapping("/springmvc/common")
publicvoidnovoid(HttpServletRequest request){
request.setAttribute("message","novoid方法被调用");
}
返回字符串
1、 作为视图路径方式
//根据路径直接匹配
@RequestMapping("/springmvc/multiReqPath1.do")
publicString multiReqPath1(HttpServletRequestrequest){
request.setAttribute("message","multiReqPath1方法被调用");
return"springmvc/common";
}
@RequestMapping("/springmvc/multiReqPath2.do")
publicString multiReqPath2(HttpServletRequestrequest){
request.setAttribute("message","multiReqPath2方法被调用");
return"/springmvc/common";
}
//根据参数匹配
@RequestMapping(params = "m=method1",method =RequestMethod.GET)
publicString method1(){
return"login/success";
}
//有参数 参数名和请求url内的变量名一致
@RequestMapping(params = "m=method2")
publicString method2(Stringname,Stringpwd){
returnname;
}
//有参数参数名和请求url内的变量名不一致
@RequestMapping(params = "m=method3",method =RequestMethod.GET)
publicString method3(@RequestParam("loginName")Stringname,@RequestParam("loginPwd")Stringpwd,HttpServletRequestrequest){
request.setAttribute("message",(name + " " + pwd));
return"login/"+name;
}
2、 作为Response内容方式
//无参数
@ResponseBody
@RequestMapping(params = "m=method4")
publicString method4(){
return"hello,guys";
}
//处理方法入参如何绑定URL参数
@ResponseBody
@RequestMapping(params = "m=method5",method =RequestMethod.GET)
publicString method5(Stringname,Stringpwd,intdelay){
return"name:"+name+","+"pwd:"+pwd+","+"delay:"+delay;
}
@ResponseBody
@RequestMapping(params = "m=method6",method =RequestMethod.GET)
publicString method6(@RequestParam("userName")Stringname,DnTesttest){
return"DnTest:"+test.toString();
}
URL参数:userName参数将绑定到name上 其他与DnTest类内属性名称一致的参数将绑定到test的对应的属性上,如果参数不全 也不会报错
返回ModelAndView
@RequestMapping("/springmvc/modelAndView")
publicModelAndView modelAndView(){
ModelAndViewmav = newModelAndView();
mav.setViewName("/springmvc/common");
mav.addObject("message","modelAndView 方法被调用");
returnmav;
}
返回ModelMap
@RequestMapping("/springmvc/modelMap")
publicModelMap modelMap(ModelMapmodMap){
List<String> names =newArrayList<String>();
names.add("Rick");
names.add("Austin");
modMap.put("names", names);
modMap.put("message","hello guys");
modMap.put("comment","hello guys");
returnmodMap;
}
返回ModelMap
@RequestMapping("/springmvc/modelMap")
publicModelMap modelAndView(ModelMapmodMap){
List<String> names =newArrayList<String>();
names.add("Rick");
names.add("Austin");
modMap.put("hello","hello guys");
modMap.put("names", names);
returnmodMap;
}
@SessionAttribute& ModMap
//注解方式
@Controller
@SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"})
publicclass AdapterMultiPathController{}
//方法体
@RequestMapping("/springmvc/modelMap2")
publicModelMap modelMapWithSession(ModelMapmodMap,HttpServletRequestrequest){
List<String> names =newArrayList<String>();
names.add("Rick");
names.add("Austin");
modMap.put("names",names);
modMap.put("message","hello guys");
modMap.put("comment","hello guys");
UserBeanuser = newUserBean();
user.setName("Rick");
user.setMobile("18938900256");
user.setTelephone(request.getParameter("userPhone"));
user.setNumber(request.getParameter("userNumber"));
modMap.put("currentUser", user);
returnmodMap;
}
//初次请求
spring mvc& reverse ajax
@ResponseBody
@RequestMapping(params = "m=method7",method =RequestMethod.GET)
publicString method7(Stringname,Stringpwd,intdelay,HttpServletRequestreq){
req.startAsync();
DatestartTime = newDate();
try{
Thread.currentThread().sleep(delay);
}catch(InterruptedExceptione) {
e.printStackTrace();
}
DateentTime = newDate();
return"name:"+name+","+"pwd:"+pwd+","+"delay:"+delay+",startTime:"+
DateUtils.formatDate(startTime,"yyyy-MM-ddHH:mm:ss:SSS")+",endTime:"+
DateUtils.formatDate(entTime,"yyyy-MM-ddHH:mm:ss:SSS");
}
RestFull
@Controller
@RequestMapping(value ="/rest")
publicclass RestWithController{}
@ResponseBody
@RequestMapping(value = "/{msg}", method =RequestMethod.GET)
publicString restString(@PathVariableString msg) {
returnmsg;
}
@ResponseBody
@RequestMapping(value = "/{path}/{value}", method =RequestMethod.GET)
publicString restXml(@PathVariableString path,@PathVariableString value) {
return"path:"+path+",value:"+value;
}
@ResponseBody
@RequestMapping(value = "/xml/{filename}", method =RequestMethod.GET)
publicString restFile(@PathVariableString filename) {
if(filename!=null) {
ProjectInitsinit = ProjectInits.getInstance();
Stringdir = init.get("resource.dir","C:/Projects/VoyagerWeb/resources");
FileUtilityfUtil = newFileUtility();
Stringcontent =fUtil.readFile(dir+"/"+filename+".xml");
returncontent;
}
else
return"Invalid xml file name["+filename+"]";
}
验证 是否支持Overload
方式一
//验证是否支持Overload
@ResponseBody
@RequestMapping(value ="/validate/overload1", method =RequestMethod.GET)
publicString overloadMethod(Stringname){
returnname;
}
@ResponseBody
@RequestMapping(value ="/validate/overload2", method =RequestMethod.GET)
publicString overloadMethod(Stringname,DnTesttest){
return"DnTest:"+test.toString();
}
方式二
/验证是否支持Overload
@ResponseBody
@RequestMapping(params ="m=method11")
publicString method11(Stringname){
returnname;
}
@ResponseBody
@RequestMapping(params ="m=method11")
publicString method11(intage,DnTesttest){
return"DnTest:"+test.toString();
}