Spring MVC 基础(转载于网络)

常用注解元素

@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")

    publicvoid novoid(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();

      }

来源:http://blog.sina.com.cn/s/blog_a43be7b001011lx9.html



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值