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

2021-02-04 10:49:39 浏览数 (1)

一、数据响应

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" />

② 注意
    - 一般用于日期格式

0 人点赞