首页 > 代码库 > Spring MVC注解开发入门

Spring MVC注解开发入门

注解式开发初步

 

 常用的两个注解:

 

@Controller:是SpringMVC中最常用的注解,它可以帮助定义当前类为一个Spring管理的bean,同时指定该类是一个控制器,可以用来接受请求。标识当前类是控制层的一个具体的实现

 

@requestMapping:放在方法上面用来指定某个方法的路径,当它放在类上的时候相当于命名空间需要组合方法上的requestmapping来访问

 

 扩充:

 

注解名称

作用

@Controller

注解标明该类需要Spring容器自动加载,将一个类成为 Spring 容器的 Bean。

@RequestMapping

可以标注在类定义处,将 Controller 和特定请求关联起来;还可以标注在方法签名处。所以在类声明处标注的 @RequestMapping 相当于让 POJO 实现了 Controller 接口,而在方法定义处的 @RequestMapping 相当于让 POJO 扩展 Spring 预定义的 Controller(如 SimpleFormController 等)。

@Resource

用来注解该属性的SETTER方法参数来源于Spring Bean

@ModelAttribute

①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;

②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;

③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

 

@SessionAttributes

代表被注解对象会被存放到HttpSession作用域

@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上

@requestParam

用于将请求参数区数据映射到功能处理方法的参数上

 

前提是:配置一个包扫描器

案例:使用@Controller和@RequestMapping()实现欢迎程序

配置包扫描器:

技术分享

 

技术分享

FirstController:

package cn.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
/**
 * 
 * @author 景佩佩
 *
 */
    @Controller
    public class FirstController{
        @RequestMapping("/dofirst.do")
         public String doFirst(){
            
             return "/WEB-INF/index.jsp";
         }
               
    }
    

 技术分享

 

一个处理类中定义N个处理器方法

package cn.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
/**
 * 
 * @author 景佩佩
 *
 */
    @Controller
    public class FirstController{
        @RequestMapping("/dofirst.do")
         public String doFirst(){
            
             return "/WEB-INF/index.jsp";
         }

        

          @RequestMapping("/dosecond.do")
      public String doSecond(){
         return "/WEB-INF/index.jsp";
      }
               
    }

 

 技术分享

 

 命名空间:

 

 技术分享

请求中的通配符用法

 

package cn.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
 * 
 * @author 景佩佩
 *
 */
    @Controller
    //命名空间
    @RequestMapping("/hr")
    public class FirstController{
        @RequestMapping("/dofirst.do")
         public String doFirst(){
            
             return "/WEB-INF/index.jsp";
         }
        
                
        @RequestMapping("/dosecond.do")
         public String doSecond(){
             return "/WEB-INF/index.jsp";
         }
        
          
         
          @RequestMapping("/*third.do")  // *代表的0个或者N个字符,匹配上的所有以third结尾的格式
             public String doThird(){
                 return "/WEB-INF/index.jsp";
             }
            
            @RequestMapping ("/fourth*.do") //*代表的0个或者N个字符,匹配所有以fourth开头的地址格式
             public String doFour(){
                 return "/WEB-INF/index.jsp";
             }
          
          
          @RequestMapping("/**/fiveth.do")   //必须以fiveth结尾,前面可以有N级别目录,也可以是0级
             public String doFive(){
                 return "/WEB-INF/index.jsp";
             }
          
            @RequestMapping("/*/sixth*.do")  //在hr和sixth之前必须存在一级路径。并且只能是一级
             public String doSix(){
                 return "/WEB-INF/index.jsp";
             }
       
    }
    

 

 技术分享技术分享

 

 技术分享

技术分享

 请求中方式的定义

对于@RequestMapping,有一个属性method,用于对被注解方法所处理请求的提交方式进行限制,只有满足该method属性指定的提交方式,才会执行被注解方法。 method属性的取值为RequestMethod,是一个枚举常量。常用值为 RequestMethod.GET 与 RequestMethod.POST

package cn.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
 * 
 * @author 景佩佩
 *
 */
    @Controller
    //命名空间
    @RequestMapping("/hr")
    public class FirstController{
                
        @RequestMapping(value="/dofirst.do",method=RequestMethod.GET)
         public String doFirst(){
             return "/WEB-INF/index.jsp";
         }
        
    
       
    }
    
    

默认是GET,POST的话会报错405

技术分享

处理器方法的参数

处理器方法中常用的参数有五类,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用
1)HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)用于承载数据的Model
5)请求中所携带的请求参数

我们先用前三种

package cn.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
 * 
 * @author 景佩佩
 *
 */
    @Controller
    //命名空间
    @RequestMapping("/hr")
    public class FirstController{        
        @RequestMapping(value="/dofirst.do",method=RequestMethod.GET)
         public String doFirst(HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model){
            System.out.println("request\t"+request);
            System.out.println("response\t"+response);
            System.out.println("session\t"+session);
            System.out.println("model\t"+model);
             return "/WEB-INF/index.jsp";
         }
        
    }
    

技术分享

请求中所携带的请求参数——零散参数

 

@RequestMapping(value="http://www.mamicode.com/dofirst.do",method=RequestMethod.GET)
    public String doFirst(Model model){
     
        Map<String,Object> datas=new HashMap<String, Object>();
        datas.put("uname", "火狐");
        model.addAllAttributes(datas);
        System.out.println(model);
         
        return ""/WEB-INF/index.jsp";
    }

技术分享

技术分享

对象参数:装配成实体

自定义实体类:UserInfo

package cn.entity;

public class UserInfo {
    private String uname;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

}

FirstController控制器类方法参数是实体类对象:

 

package cn.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


import cn.entity.UserInfo;

    @Controller
    //命名空间
    @RequestMapping("/hr")
    public class FirstController{
        
        @RequestMapping(value="/dofirst.do")
         public String doFirst(UserInfo info){
            System.out.println(info.getUname());
            
             return "/WEB-INF/index.jsp";
         }
        
    
    }
    

 

appliactiobContext.xml

技术分享

jsp页面form表单提交:

技术分享

 

 技术分享

技术分享

解决乱码问题:Web.xml配置编码过滤器---CharacterEncodingFilter

技术分享

技术分享

技术分享

 

Spring MVC注解开发入门