前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SSM_06】SpringMVC-响应数据、请求数据

【SSM_06】SpringMVC-响应数据、请求数据

作者头像
用户8250147
发布2021-02-04 10:49:39
7400
发布2021-02-04 10:49:39
举报
文章被收录于专栏:黑马

一、数据响应

1. 页面跳转
代码语言:javascript
复制
① 返回字符串
    @RequestMapping(value = "/find")
    public String find(){
        return "success";
    }
# 注意
    - 返回的字符串将被视图解析器解析 
    - 返回值省略了 forward:转发 【 redirect: 重定向 [ 不经过视图解析器 ] 】
    - 需要配置视图解析器前后缀    // 自动拼接为 /WEB-INf/success.jsp  ---> forward:/WEB-INf/success.jsp
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/"/>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
        
② ModelAndView
    【形式1】
        //自己创建 ModelAndView
        @RequestMapping("/find")
        public ModelAndView find(){
            //创建 ModelAndView对象
            ModelAndView modelAndView = new ModelAndView();

            //设置视图名称
            modelAndView.setViewName("success");

            //设置数据
            modelAndView.addObject("key", "SDFH-25S4-F56S-G2DF");
            modelAndView.addObject("username", "Demo_Null");

            //返回 ModelAndView
            return modelAndView;
        }
    【形式2】
        //将 ModelAndView 交给调用者创建,即 MVC
        @RequestMapping("/find")
        public ModelAndView find(ModelAndView modelAndView){    
            //设置视图名称
            modelAndView.setViewName("success");

            //设置数据
            modelAndView.addObject("key", "SDFH-25S4-F56S-G2DF");
            modelAndView.addObject("username", "Demo_Null");

            //返回 ModelAndView
            return modelAndView;
        }
    【形式3】
        //创建 Model 直接返回 String
        @RequestMapping("/find")
        public String find(Model model){    
            //设置数据
            modelAndView.addAttribute("key", "SDFH-25S4-F56S-G2DF");
            modelAndView.addAttribute("username", "Demo_Null");

            //返回 视图名称
            return "success";
        }
2. 写回数据
代码语言:javascript
复制
① 直接写回字符串
    @RequestMapping(value = "/find")
    public void find(HttpServletResponse response) throws IOException {
        //原始方法写回
        response.getWriter().write("Hello");
    }

# 注意
    - HttpServletResponse response、HttpServletRequest request、HttpSession session等作为形参,MVC自动创建对象
    - ServletContext context 不能作为形参,全局只能存在一个 ServletContext 域
    
② 直接写回 json 字符串
    - 导入依赖
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.0</version>
    </dependency>


------------------------------------------------------------------------

    - 配置处理器映射器
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
            </list>
        </property>
    </bean>

    - 开启 MVC 注解驱动
        <!-- 相当于处理器映射器 + 处理器适配器  -->
        <mvc:annotation-driven />

------------------------------------------------------------------------

    - 直接返回对象 底层将其转为 json
    @RequestMapping("/find")
    @ResponseBody
    public User find(){
        User user = new User();
        user.setId(1);
        user.setUsername("Demo_Null");
        user.setPassword("111111111");

        return user;
    }

# 注意
    @ResponseBody    标注该返回值为字符串而不是视图名称

二、请求数据

1. 获取请求参数
代码语言:javascript
复制
① 简单数据类型
    @RequestMapping(value = "/find")
    @ResponseBody
    public void find(String username, int id){
        System.out.println(username + "---" + id)
    }

# 注意    
    - 形参名称与前台出入参数名称一致时会自动封装
    - 前台传入参数皆为字符串,底层将其转换为需要的数据类型
    - 返回值为空时,若不加 @ResponseBody 注解,则会默认返回 该方法的路径

② POJO类型
    @RequestMapping(value = "/find")
    @ResponseBody
    public void find(User user){
        System.out.println(user)
    }

# 注意
    - 前台传入参数名称与类属性名称一致时会自动封装

③ 数组类型
    @RequestMapping(value = "/find")
    @ResponseBody
    public void find(String[] str){
        System.out.println(user)
    }

# 注意
    - 前台传入多个相同名称的参数会自动封装值后台同名称的数组中

④ 集合
    【方法1】
    //创建 VO 类,提供 set/get方法
    import java.util.List;

    public class VO {
        private List<User> userList;

        public List<User> getUserList() {
               return userList;
        }

        public void setUserList(List<User> userList) {
             this.userList = userList;
        }

        @Override
        public String toString() {
            return "VO{" +
            "userList=" + userList +
            '}';
            }
        }

        //将 VO 作为形参
        @RequestMapping("/find3")
        @ResponseBody
        public void  find3(VO vo){
            System.out.println(vo);
        }

------------------------------------------------------------------

    【方法2】
        @RequestMapping("/find")
        @ResponseBody
        public void  find(@RequestBody List<User> userList){
            System.out.println(userList);
        }

    # 使用此种方式必须满足  使用 Ajax 请求 , contentType为 json格式

⑤ RequestBody 与 ResponseBody
    - @RequestBody注解 可以将请求体中的参数,发送到服务器的json格式数据封装到参数中     
        * 接收参数: json转对象  --->  用于post请求! (get没有请求体)
    - @ResponseBody注解 可以将方法返回的对象转化为json格式数据响应给客户端   
        * 响应时: 对象转json

⑥ @RequestParam 参数绑定注解
    - value:与请求参数名称
    - required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
    - defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

    @RequestMapping("/find")
    @ResponseBody
    public void  find(@RequestParam(value = "name", required = false, defaultValue = "china") String username){
        System.out.println(username);
    }
2. 获取请求头信息
代码语言:javascript
复制
① @RequestHeader
    - value:请求头的名称
    - required:是否必须携带此请求头

    @RequestMapping("/find")
    @ResponseBody
    public void  find(@RequestHeader(value = "Use-Agent", required = false) String user_agent){
        System.out.println(userList);
    }

② @CookieValue
    - value:指定cookie的名称
    - required:是否必须携带此cookie

    @RequestMapping("/find")
    @ResponseBody
    public void  find(@RequestHeader(value = "JESSIONID", required = false) String jessionid){
        System.out.println(jessionid);
    }

三、其他配置

1. 开启静态资源访问
代码语言:javascript
复制
<mvc:resources mapping="/js/**" location="/js/" />
或
<mvc:default-servlet-handler />    开启资源请求未找到时将分配权交给服务器
2. 请求中文乱码
代码语言:javascript
复制
<!--配置全局过滤的filter-->
<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>

# 不能解决响应乱码问题
3. 自定义类型转换器
代码语言:javascript
复制
① 步骤
    - 自定义 转换类 实现 Converter<带转换类型,目标类型> 接口
    - 声明类型转换器
        <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <list>
                    <bean class="自定义转换类全限定名" />
                </list>
            </property>
        </bean>
    - 将转换器配置到注解驱动
    <mvc:annotation-driven conversion-service="conversionService" />

② 注意
    - 一般用于日期格式
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、数据响应
    • 1. 页面跳转
      • 2. 写回数据
      • 二、请求数据
        • 1. 获取请求参数
          • 2. 获取请求头信息
          • 三、其他配置
            • 1. 开启静态资源访问
              • 2. 请求中文乱码
                • 3. 自定义类型转换器
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档