zoukankan      html  css  js  c++  java
  • 07SpringMVC请求&响应

    响应数据

    响应方式:页面跳转、回写数据

    1. 页面跳转

      • 直接返回字符串: 返回字符串和视图解析器的前后缀拼接后跳转

        @RequestMapping("/test1")
        public String save(){
        	return "index.jsp";
        }
        
      • 通过ModelAndView对象返回(两种实现方式)

        @RequestMapping("/test1")
        public ModelAndView save1(){
        	/* 
        	Model模型:封装数据
        	View视图:展示数据
        	*/
        	ModelAndView modelAndView = new ModelAndView();
        	// 设置模型数据
        	modelAndView.addObject("username", "Tom");
        	// 设置视图页面
        	modelAndView.setViewName("index.jsp")
        	return modelAndView;
        }
        
        // 推荐方式,写到参数中,spring框架会识别
        @RequestMapping("/test2")
        public ModelAndView save2(ModelAndView modelAndView){
        	// 设置模型数据
        	modelAndView.addObject("username", "Tom");
        	// 设置视图页面
        	modelAndView.setViewName("index.jsp")
        	return modelAndView;
        }
        
    2. 回写数据

      • 直接返回字符串(web基础阶段,使用的是resp.getWriter().print("hello world")

        • 加注解@ResponseBody
        @RequestMapping("/test3")
        public void save3(HttpServletResponse resp){
        	resp.getWriter().print("hello world");
        }
        
        // 推荐方式, 加注解
        @RequestMapping("/test4")
        @ResponseBody
        public String save4(){
        	return "hello world";
        }
        
      • 返回对象和集合(json数据)

        @RequestMapping("/test5")
        @ResponseBody
        public String save5(){
        	User user = new User();
        	user.setUsername("Tom");
        	// json转换工具 (导入坐标)
        	OjbectMapper objectMapper = new ObjectMapper();
        	String json = objectMapper.writeValueAsString(user);
        	return json;
        }
        
        // 推荐方式:springMVC自动转换成json格式(需要配置spring-mvc.xml)
        @RequestMapping("/test6")
        @ResponseBody
        public User save6(){
        	User user = new User();
        	user.setUsername("Tom");
        	return user;
        }
        // 配置文件:注解驱动,底层配置对象和json数据转换
        // 注意,需要添加mvc命名空间
        <mvc:annotation-driven/>
        

    请求数据

    客户端请求参数的格式是:name=value&name=value...

    服务器会自动封装数据,SpringMVC可以接收如下类型的参数:

    • 基本类型
    • POJO类型(简单JavaBean)
    • 数组
    • 集合

    基本类型

    访问地址栏参数和定义业务处理函数的参数一致即可

    @RequestMapping("/test")
    @ResponseBody
    public void save(String username) {
    	System.out.println(username);
    }
    

    POJO

    SpringMVC会自动把请求数据封装到类,直接使用即可

    @RequestMapping("/test")
    @ResponseBody
    public void save(User user) {
    	System.out.println(user.getName());
    }
    

    数组

    客户端请求数据如果为数组,格式为:xx=1&xx=2&xx=3...

    @RequestMapping("/test")
    @ResponseBody
    public void save(String[] arr) {
    	System.out.println(Arrays.asList(arr));
    }
    

    集合

    获取集合时,要将集合封装到一个POJO中(JavaBean中)。

    class VO{
    	private List<User> userList;
    	public void setUserList(){}
    	public List<User> getUserList(){}
    	public void toString(){}
    }
    
    @RequestMapping("/test")
    @ResponseBody
    public void save(VO vo) {
    	System.out.println(vo);
    }
    

    如果使用ajax提交数据,指定json提交数据格式。那么就就可以直接接受集合数据。(使用js时,需要指定静态资源,下面再讲)

    @RequestMapping("/test")
    @ResponseBody
    public void save(@RequestBody List<User> userList) {
    	System.out.println(userList);
    }
    

    静态资源访问

    静态资源访问和@RequestMapping("/xxx")冲突,需要在web.xml开启静态资源访问。

    <!--js文件-->
    <mvc:resources mapping="/js/**" location="/js/"/>
    <!--img文件-->
    <mvc:resources mapping="/img/**" location="/img/"/>
    

    或者使用如下配置,表示如果SpringMVC找不到对应资源,就交给原始容器Tomcat,Tomcat可以找到静态资源。

    <mvc:default-servlet-handler>
    

    请求数据乱码

    当post请求数据时,数据可能会出现乱码,我们可以在web.xml中设置一个过滤器来进行编码的过滤。

    <!--  过滤器:全局数据的编码设置-->
    <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>
    

    参数绑定注解

    当请求参数和业务处理函数参数命名不一致时,可以使用@RequestParam,它的参数有:

    • value:与请求参数名称相同
    • required:是否 必须包含指定参数,默认是
    • defaultValue:当没有指定参数时,使用这个默认值
    @RequestMapping("/test")
    @ResponseBody
    public void save(@RequestParam("name") String username) {
        System.out.println(username);
    }
    

    获取Restful风格的参数

    Restful风格是一种架构风格、设计风格,不是标准,是一种设计原则和约束条件。主要用于客户端服务器交互软件,这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

    Restful风格的请求是使用"url+请求方式"表示一次请求目的,HTTP协议里面四个表示操作方式的动词如下:

    • GET :获取资源
    • POST:新建资源
    • PUT:更新资源
    • DELETE:删除资源

    例如 :

    • /user/1 GET:获取id=1的user
    • /user/1 DELETE:删除id=1的user

    在SpringMVC中,获取Restful风格参数就是使用占位符和注解@PathVariable

    如,获取变量name的值。http://localhost:80/user/zhangsan

    @RequestMapping("/user/{name}")
    @ResponseBody
    public void save(@PathVariable("name") String username) {
        System.out.println(username);
    }
    

    自定义类型转换器

    因为请求的都是字符串,所以SpringMVC提供了一些常用的类型转换器,如字符串转成int。但是还有一些如日期,它的数据格式多样,此时就需要自定义类型转换器。

    步骤:

    1. 定义转换器类实现Converter接口

      public class DateConverter implements Converter<String, Date> {
      
          @Override
          public Date convert(String source) {
              SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
              Date date = format.parse(source);
              return date;
          }
      }
      
    2. 在sprin-mvc.xml配置文件中声明转换器

      <!--    声明转换器-->
      <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
          <property name="converters">
              <list>
                  <bean class="baidu.controller.DateConverter"/>
              </list>
          </property>
      </bean>
      
    3. 在sping-mvc.xml配置文件中:使用<annotation-driven>引用转换器

      <!--    mvc的注解驱动-->
      <mvc:annotation-driven conversion-service="conversionService"/>
      

    获取请求头

    @RequestHeader获取请求头,如:获取请求头并打印。

    @RequestMapping("/test")
    @ResponseBody
    public void save(@RequestHeader(value = "User-Agent", required = false) String user) {
        System.out.println(user);
    }
    

    直接获取请求头中的Cookie,可以使用@CookieValue获取指定Cookie的值

    @RequestMapping("/test")
    @ResponseBody
    public void save(@CookieValue(value = "MyCookieId", required = false) String cookie) {
        System.out.println(cookie);
    }
    
  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/mingriyingying/p/13639539.html
Copyright © 2011-2022 走看看