SpringMVC细节

1. @RequestMapping()

  • 基本使用

通过注解的方式实现路径到处理器方法的映射

可以使用的类和方法上。用在方法上表示该方法变为一个处理器,且和指定路径做映射;又在类上表示配置的路径作为这个类中所以处理器的父路径使用。

@Controller
@RequestMapping("")
public class UserController {
    
    
    @RequestMapping("/regist.form")
    public void registUser(){
    
    
        System.out.println("user regist...");
    }
}
  • 注解属性

1)value: 指定请求路径

2)method: 指定当前处理器那种提交方式的请求

3)params: 用来限定请求中必须包含指定请求参数才能被当前处理器处理

4)headers: 用来限定请求中必须包含指定名称的请求头才会被当前处理器处理

  • 处理器方法支持的参数和返回类型

支持的方法参数类型:

  • HttpServletRequest:代表当前请求的对象

  • HttpServletResPonse:代表当前响应的对象

  • HttpSession:代表当前的对话

  • WebRequest:SpringMVC提供对象,相当于Resquest和Session的合体,可以操作这两个阈中的属性

  • InputStream、OutputStream、Reader、Writer:代表Request中获取的输入流和Response中的输出流

  • 通过@PathVariable@RequestParam声明的方法参数

    ——@PathVariable:可以将请求路径的指定部分获取赋值给指定方法参数

    ——@RequestParam:将指定请求参数赋值给指定方法参数,如果不写此注解,则会默认将同名的请求参数赋值给方法参数

  • 通过@CookieValue@RequestHeader声明方法参数

    ——@CookieValue

    ——@RequestHeader

支持的返回值类型:

  • ModelAndView: 返回封装了模型和视图的ModelAndView对象
    /**
     * 返回一个封装了模型和视图的ModelAndView对象
     * @return
     */
    @RequestMapping("/test01.form")
    public ModelAndView test01(){
     
     
        ModelAndView mav=new ModelAndView();
        mav.addObject("attr1","val1");
        mav.addObject("attr2","val2");
        mav.setViewName("test01");

        return mav;
    }
  • String对象: 返回一个String对象,相当于返回视图的名称(mav.jsp)
    /**
     * 返回一个String对象,相当于返回视图的名称(mav.jsp)
     * @return
     */
    @RequestMapping("/test02.form")
    public String test02(Model model){
     
     
        model.addAttribute("attr1","val1");
        model.addAttribute("attr2","val2");
        return "test01";
    }
  • void: 返回一个void,自动采用当前处理器的路径名作为视图名返回
 /**
     * 返回一个void,自动采用当前处理器的路径名作为视图名返回
     * @return
     */
    @RequestMapping("/test03.form")
    public void test03(Model model){
     
     
        model.addAttribute("attr1","val1");
        model.addAttribute("attr2","val2");
    }
  • 方法被@ResponseBody修饰:默认将返回的对象转化为json写入输出
  • 除了以上返回之外返回的内容都会被当作模型中的数据,返回的视图名称等同于当前处理器的路径名

2. 请求参数的获取

  • 直接获取
 //直接获取,SpringMVC自动将对应名称的参数传入,并自动进行类型转换
    @RequestMapping("/pt02.form")
    public void test02(String name,int age){
    
    
        System.out.println(name+"#"+age);
    }

另外,如果请求参数名称与对应参数名称不一致,可以通过@RequestParam(“name”)来指定对应关系

 @RequestMapping("/pt03.form")
    public void test03(@RequestParam("name") String username, int age){
    
    
        System.out.println(username+"#"+age);
    }
  • 请求的对象获取
//请求的对象获取
    @RequestMapping("/pt04.form")
    public void test04(HttpServletRequest request, HttpServletResponse response){
    
    
        String name=request.getParameter("name");
        int age=Integer.parseInt(request.getParameter("age"));
        System.out.println(name+"#"+age);
    }

注意:

请求参数的乱码解决?

  1. 传统方法:
  • 修改服务器默认请求参数的编码,保证其和提交的编码一致

  • 通过手动编解码来解决乱码问题

  • 通过request.通知web容器对这次请求用那个解码。此方法调用之前没有获取参数,否则无法解决乱码

    request.setCharacterEncoding("utf-8");
    

    此方法只对post有效,对get提交无效。此方法的本质时设置容器以何种编码处理请求。但get提交的参数在地址之后,所以此方法无效,需要手动编解码解决。

    name=new String(name.getBytes("iso8859-1"),"utf-8");
    
  1. SpringMVC解决方法:提供全站乱码过滤器来解决
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

这种方法只能解决POST提交的乱码有效,对于get无效,此时需要手动编解码来解决。

3. 日期数据处理

在SpringMVC中解析页面时提交的请求参数,默认按照yyyy/MM/dd的格式解析数据。并不符合Date类的处理机制,所以无法自动封装日期打他Date.此时可以更具适配器来指定格式。

    /**
     * 请求参数日期格式处理
     * @param binder
     */
    @InitBinder
    public void InitBinder(ServletRequestDataBinder binder){
    
    
        binder.registerCustomEditor(Date.class,
                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
    }

@RequestMapping("/pt05.form")
public String test05(String name,String addr,Date data)  {
    
    
        System.out.println(name+"#"+addr+"#"+data);

        return "test02";
    }

4. 文件上传

实现文件上传满足的三个条件:

  • 表单必须是post提交
  • 表单需提供文件上传项,且该项必须有name属性
  • 保单需设置enctype="multipart/form-data"属性

js中表单:

<form action="${pageContext.request.contextPath}/pt06.form" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="name"/>
    <br/>
    地址:<input type="text" name="addr"/>
    <br/>
    图像:<input type="file" name="file"/>
    <br/>
    <input type="submit" name="提交">
</form>

dispatcher-servlet.xml中文件上传相关设置:

    <!--配置文件上传-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--文件体积限制-->
        <property name="maxUploadSize" value="10000000"></property>
        <!--内存缓冲区大小-->
        <property name="maxInMemorySize" value="4096"></property>
        <!--临时文件夹的位置-->
        <property name="uploadTempDir" value="WEB-INF/"></property>
        <!--文件名乱码参数-->
        <property name="defaultEncoding" value="utf-8"></property>
    </bean>

控制器中文件上传功能实现:

    /**
     * 文件上传实现
     *
     * @return
     */
    @RequestMapping("/pt06.form")
    public String test06(String name, String addr, MultipartFile file){
    
    
        System.out.println(name+"#"+addr+"#"+file);

        if(file!=null){
    
    
            try {
    
    
                byte[] data= file.getBytes();

                FileUtils.writeByteArrayToFile(new File("D://"+file.getOriginalFilename()),data);

            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }

        return "test03";
    }

5. 路径动态数据获取(RESTFul风格的请求参数处理)

  • 普通请求与RESTFul风格的请求

    • 普通get请求

      http://localhost:8080/AnnoSpringMVC_war_exploded/pt06.form?name=tom&age=18

    • RESTFul请求

      http://localhost:8080/AnnoSpringMVC_war_exploded/tom/18.form

  • SpringMVC对RESTFul风格的请求的处理

        /**
         * 路径动态数据获取
         *
         * @return
         */
        @RequestMapping("/{name}/{addr}.form")
        public String test07(@PathVariable String name,@PathVariable String addr){
          
          
            System.out.println(name+"#"+addr);
    
            return "test03";
        }
    

猜你喜欢

转载自blog.csdn.net/wxplol/article/details/112391703
今日推荐