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);
    }
    
  • 相关阅读:
    Nginx安装与运行配置总结
    不知道为什么随笔分类出不来
    springboot打war包
    python爬取网站页面时,部分标签无指定属性而报错
    python爬取某站新闻,并分析最近新闻关键词
    插了带蠕虫的U盘后,文件不见了怎么快速恢复
    CompTIA Security+ 常见知识点
    JAVA学习--集合的遍历
    JAVA学习--ArrayList使用方法:List的主要实现类
    JAVA学习--异常Exception的处理
  • 原文地址:https://www.cnblogs.com/mingriyingying/p/13639539.html
Copyright © 2011-2022 走看看