SpringMVC常用基础知识【转】

转自:http://blog.sina.com.cn/s/blog_a43be7b001011lx9.html
常用注解元素
@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(“attribute name”) 或者通过
${ attribute name } EL 表达式访问模型对象中的 属性对象
 
如果希望在ModelMap 的作用域范围为 session,可以有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现 如:
 
@Controller
@RequestMapping("/login.do")
@SessionAttributes("currUser")   
public class BbtForumController {。。。。。}
 
 
@ResponseBody
         标注后  返回String对象的结果为response内容体,不标注的话  作为dispatcher url使用
 
@PathVariable
   允许将请求路径的制定内容当做求情的参数使用
返回类型
请求处理方法入参的可选类型                                                   说明
void                                       此时逻辑视图名由请求处理方法对应的 URL 确定,如以下的方法:
@RequestMapping("/welcome.do")
public void welcomeHandler() {
}
对应的逻辑视图名为“welcome”
 
String                                    此时逻辑视图名为返回的字符,如以下的方法:
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@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 and UseCase
@Controller
@RequestMapping("/login.do")
public class SinglePathWithController {}
 
@Controller
@SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"})
public class AdapterMultiPathController {}
 
@Controller
@RequestMapping(value = "/rest")
public class RestWithController {}
无返回
//无返回值  无参数返回的是根据 prefix前缀+@RequestMapping value +suffix
后缀组成
      @RequestMapping("/springmvc/common")
      public voidnovoid(HttpServletRequest request) {
         request.setAttribute("message", "novoid方法被调用");
      }

返回字符串
1、  作为视图路径方式
 
//根据路径直接匹配
@RequestMapping("/springmvc/multiReqPath1.do")
    public String multiReqPath1(HttpServletRequest request){
       request.setAttribute("message", "multiReqPath1方法被调用");
       return "springmvc/common";
    }
 
    @RequestMapping("/springmvc/multiReqPath2.do")
    public String multiReqPath2(HttpServletRequest request){
       request.setAttribute("message", "multiReqPath2方法被调用");
       return "/springmvc/common";
    }
 
//根据参数匹配
    @RequestMapping(params = "m=method1",method = RequestMethod.GET)
    public String method1(){
       return "login/success";
}
 
//有参数  参数名和请求url内的变量名一致
    @RequestMapping(params = "m=method2")
    public String method2(String name,String pwd){
       return name;
}
//有参数 参数名和请求url内的变量名不一致
    @RequestMapping(params = "m=method3",method = RequestMethod.GET)
    public String method3(@RequestParam("loginName")String name,@RequestParam("loginPwd")String pwd,HttpServletRequest request){
       request.setAttribute("message",(name + " " + pwd));
       return "login/"+name;
    }

 
2、  作为Response内容方式
//无参数
    @ResponseBody
    @RequestMapping(params = "m=method4")
    public String method4(){
       return "hello,guys";
}
 
//处理方法入参如何绑定 URL 参数
    @ResponseBody
    @RequestMapping(params = "m=method5",method = RequestMethod.GET)
    public String method5(String name,String pwd,int delay){
       return "name:"+name+","+"pwd:"+pwd+","+"delay:"+delay;
}
 
@ResponseBody
    @RequestMapping(params = "m=method6",method = RequestMethod.GET)
    public String method6(@RequestParam("userName")String name,DnTest test){
       return "DnTest:"+test.toString();
    }
 
URL 参数: userName参数将绑定到name上  其他与DnTest类内属性名称一致的参数将绑定到test的对应的属性上,如果参数不全  也不会报错
返回ModelAndView
@RequestMapping("/springmvc/modelAndView")
    public ModelAndView modelAndView(){
       ModelAndView mav = new ModelAndView();
       mav.setViewName("/springmvc/common");
       mav.addObject("message", "modelAndView 方法被调用");
       return mav;
    }
返回ModelMap
    @RequestMapping("/springmvc/modelMap")
    public ModelMap modelMap(ModelMap modMap){
       List<String> names = new ArrayList<String>();
       names.add("Rick");
       names.add("Austin");
        modMap.put("names", names);
       
        modMap.put("message", "hello guys");
        modMap.put("comment", "hello guys");
       
        return modMap;
    }
返回ModelMap
@RequestMapping("/springmvc/modelMap")
    public ModelMap modelAndView(ModelMap modMap){
       List<String> names = new ArrayList<String>();
       names.add("Rick");
       names.add("Austin");
      
        modMap.put("hello", "hello guys");
        modMap.put("names", names);
        return modMap;
    }
@SessionAttribute & ModMap
//注解方式
@Controller
@SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"})
public class AdapterMultiPathController {}
 
//方法体
@RequestMapping("/springmvc/modelMap2")
    public ModelMap modelMapWithSession(ModelMap modMap,HttpServletRequest request){
       List<String> names = new ArrayList<String>();
       names.add("Rick");
       names.add("Austin");
       modMap.put("names",names);
      
        modMap.put("message", "hello guys");
        modMap.put("comment", "hello guys");
       
        UserBean user = new UserBean();
        user.setName("Rick");
        user.setMobile("18938900256");
        user.setTelephone(request.getParameter("userPhone"));
        user.setNumber(request.getParameter("userNumber"));
        modMap.put("currentUser", user);
       
        return modMap;
    }  
//初次请求
spring mvc & reverse ajax
@ResponseBody
    @RequestMapping(params = "m=method7",method = RequestMethod.GET)
    public String method7(String name,String pwd,int delay,HttpServletRequest req){
       req.startAsync();
      
       Date startTime = new Date();
       try {
           Thread.currentThread().sleep(delay);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       Date entTime = new Date();
      
       return "name:"+name+","+"pwd:"+pwd+","+"delay:"+delay+",startTime:"+
              DateUtils.formatDate(startTime, "yyyy-MM-dd HH:mm:ss:SSS")+",endTime:"+
              DateUtils.formatDate(entTime, "yyyy-MM-dd HH:mm:ss:SSS");
    }
 
RestFull
@Controller
@RequestMapping(value = "/rest")
public class RestWithController {}
 
@ResponseBody
    @RequestMapping(value = "/{msg}", method = RequestMethod.GET)
    public String restString(@PathVariable String msg) {
       return msg;
    }
 
    @ResponseBody
    @RequestMapping(value = "/{path}/{value}", method = RequestMethod.GET)
    public String restXml(@PathVariable String path,@PathVariable String value) {
       return "path:"+path+",value:"+value;
    }
    @ResponseBody
    @RequestMapping(value = "/xml/{filename}", method = RequestMethod.GET)
    public String restFile(@PathVariable String filename) {
       if (filename!=null) {
           ProjectInits init = ProjectInits.getInstance();
           String dir = init.get("resource.dir", "C:/Projects/VoyagerWeb/resources");
           FileUtility fUtil = new FileUtility();
           String content = fUtil.readFile(dir+"/"+filename+".xml");
           return content;
       }
       else
           return "Invalid xml file name ["+filename+"]";
    }
 
 
验证 是否支持Overload
方式一
//验证 是否支持Overload
    @ResponseBody
    @RequestMapping(value = "/validate/overload1", method = RequestMethod.GET)
    public String overloadMethod(String name){
       return name;
    }
    @ResponseBody
    @RequestMapping(value = "/validate/overload2", method = RequestMethod.GET)
    public String overloadMethod(String name,DnTest test){
       return "DnTest:"+test.toString();
    }
 
方式二
/验证 是否支持Overload
        @ResponseBody
         @RequestMapping(params = "m=method11")
       public String method11(String name){
           return name;
       }
       
        @ResponseBody
         @RequestMapping(params = "m=method11")
       public String method11(int age,DnTest test){
           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、付费专栏及课程。

余额充值