zoukankan      html  css  js  c++  java
  • [SpringMVC-值传递] 初始SpringMVC--SpringMVC中的值传递

    把页面中输入的值传递到后台以及后台向前台传递,有以下几种方式

    这里以登录为例子,实现打印前端页面的值

    1,新建一个控制器,根据不同的请求地址实现不同的请求方式

    LoginController.java

    @Controller
    @RequestMapping("/login")
    public class LoginController {
    
    }

    2,新建不同登录的请求地址,Ajax参数规范和form一致

    @RequestMapping("/login01")
        public String login01(String userName, String userPwd, String age) {
    
            // 在方法中声明和表单中控件name相同的名字的变量,即可完成自动注入
            // 在这一过程中也会对一些数据类型进行自动转换,因为从页面传递过来的数据对于服务器而言只有String类型,因此要进行转换才能将其放入对应服务器端的数据类型中
            // SpringMVC在底层通过AOP原理来完成类型的自动转换以及参数的自动注入
            System.out.println(userName);
            System.out.println(userPwd);
            System.out.println(age);
    
            return "Hello";
        }
    
        @RequestMapping("/login02")
        public String login02(@RequestParam(value = "userName", required = true) String name,
                @RequestParam(value = "userPwd", required = true) String pwd,
                @RequestParam(value = "age", required = false) String age) {
    
            // 在方法中声明和表单中控件name相同的名字的变量,即可完成自动注入
            // 在这一过程中也会对一些数据类型进行自动转换,因为从页面传递过来的数据对于服务器而言只有String类型,因此要进行转换才能将其放入对应服务器端的数据类型中
            // SpringMVC在底层通过AOP原理来完成类型的自动转换以及参数的自动注入
            System.out.println(name);
            System.out.println(pwd);
            System.out.println(age);
    
            return "Hello";
        }
    
        @RequestMapping("/login03")
        public String login03(User user) {
    
            // 如果表单中字段比较多,那么可以在服务器端封装一个对象,对象中的属性名和表单中的name属性值一致
            // 在Controller方法中直接注入该对象作为参数,表单中的值即可自动传递过来
            System.out.println(user);
            return "Hello";
        }

    返回的Hello页面,为 / WEB-INF / Hello.jsp

    springMVC-servlet.xml

    <!--
            注解扫描器 ,base-package用于指定要扫描的包的路径
            当前配置用来扫描com.niit.controller包及其子包下所有的类,所有含@Controller注解的类就会成为一个控制器类(就有了处理请求和返回响应的能力)
            另外被@Controller注解标记的类也会成为Spring IOC 容器中被管理的一个对象
        -->
        <context:component-scan base-package="com.stu.controller"></context:component-scan>
    
        <!-- 视图解析器  -->
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/"></property>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"></property>
        </bean>
    
    
        <!-- 不拦截静态资源 -->
        <mvc:annotation-driven></mvc:annotation-driven>
        <mvc:default-servlet-handler />

    3,在前端通过form表单提交的方式

    login.jsp

    <h3>
                login01
            </h3>
            <!-- 提交给/login/login01 进行处理,在控制台打印输入的值 -->
            <form method="post"
                action="<%=request.getContextPath()%>/login/login01">
                用户名:
                <input type="text" name="userName" />
                <br />
                密 码:
                <input type="text" name="userPwd" />
                <br />
                年 龄:
                <input type="text" name="age" />
                <br />
                <button type="submit">
                    跳转到login01
                </button>
            </form>
    
            <h3>
                login02
            </h3>
            <!-- 提交给/login/login02 进行处理,在控制台打印输入的值 -->
            <form method="post"
                action="<%=request.getContextPath()%>/login/login02">
                用户名:
                <input type="text" name="userName" />
                <br />
                密 码:
                <input type="text" name="userPwd" />
                <br />
                年 龄:
                <input type="text" name="age" />
                <br />
                <button type="submit">
                    跳转到login02
                </button>
            </form>
    
            <h3>
                login03
            </h3>
            <!-- 提交给/login/login03 进行处理,在控制台打印输入的值 -->
            <form method="post"
                action="<%=request.getContextPath()%>/login/login03">
                用户名:
                <input type="text" name="userName" />
                <br />
                密 码:
                <input type="text" name="userPwd" />
                <br />
                年 龄:
                <input type="text" name="age" />
                <br />
                <button type="submit">
                    跳转到login03
                </button>
            </form>

    4,新建的User对象

    User.java

    package com.stu.vo.param;
    
    import java.io.Serializable;
    
    /**
     * 文件名称: com.stu.vo.param.User.java<br/>
     * 初始作者: Administrator<br/>
     * 创建日期: 2018-2-6<br/>
     * 功能说明: 用户对象 <br/>
     * =================================================<br/>
     * 修改记录:<br/>
     * 修改作者 日期 修改内容<br/>
     * ================================================<br/>
     * Copyright (c) 2010-2011 .All rights reserved.<br/>
     */
    public class User implements Serializable {
    
        private static final long    serialVersionUID    = 2660672112156513335L;
        private String                userName;
        private String                userPwd;
        private String                age;
    
        public String getUserName() {
    
            return userName;
        }
    
        public void setUserName(String userName) {
    
            this.userName = userName;
        }
    
        public String getUserPwd() {
    
            return userPwd;
        }
    
        public void setUserPwd(String userPwd) {
    
            this.userPwd = userPwd;
        }
    
        public String getAge() {
    
            return age;
        }
    
        public void setAge(String age) {
    
            this.age = age;
        }
    
        @Override
        public String toString() {
    
            return "User [age=" + age + ", userName=" + userName + ", userPwd=" + userPwd + "]";
        }
    
    }

    把值向前端打印 以及 两种重定向方式

    继续在LoginController.java中添加代码

        @RequestMapping("/login04")
        public ModelAndView login04(User user) {
    
            // 新建一个ModelAndView对象
            ModelAndView mav = new ModelAndView();
            mav.addObject("userInfo", user);// 相当于request中的setAttribute方法
            mav.setViewName("Hello");// 指定处理的视图名称,这里为Hello.jsp页面
    
            return mav;
        }
    
        @RequestMapping("/login05")
        public String login05(ModelMap map, User user) {
    
            // 可以通过操作ModelMap直接将模型数据直接写入request作用域中
            // 最后再通过返回String类型来指定对应的视图名称
    
            System.out.println(user);
            map.addAttribute("user", user);
            return "Hello";
        }
    
        @RequestMapping("/login06")
        public String login06(@ModelAttribute("user") User user) {
    
            // 如果在参数前面加上@ModelAttribute注解,则可以将该参数直接写入request作用域
            // 注解中的值就相当于mv.addObjetct 或 map.addAttribute 中的key值
    
            System.out.println(user);
            return "Hello";
        }
    
        /**
         * 两种重定向方式
         */
        @RequestMapping("/redirect01")
        public ModelAndView redirect01() {
    
            // 页面重定向--使用重定向视图
            RedirectView rv = new RedirectView("http://....");
            ModelAndView mav = new ModelAndView(rv);
    
            return mav;
        }
    
        @RequestMapping("/redirect02")
        public String redirect02() {
    
            // 页面重定向--通过String类型返回值跳转
            // redirect:固定写法
    
            return "redirect:http://....";
        }

    通过前端页面的提交,即可对应不同的操作。

    在页面中通过EL表达式打印,ps:作用域的范围和 request 一致

    登录信息${requestScope.user}

    如果方法中还需要指定一些特殊的入参类型,如HttpServletRequest,HttpServletResponse,HttpSession ,OutputStream,直接在形参中指定即可

        @RequestMapping("/login07")
        public String login09(HttpServletRequest req, HttpServletResponse res, HttpSession session, OutputStream os)
                throws IOException {
    
            System.out.println(req);
            System.out.println(res);
            System.out.println(req.getSession());
            System.out.println(session);
            System.out.println(os);
            System.out.println(res.getOutputStream());
            System.out.println(req.getSession().getServletContext());
            return "Hello";
        }

    void返回的方法

        /**
         * void返回类型
         */
        @RequestMapping("/login07")
        public void redirect07(User user, HttpServletResponse res) {
    
            JSONObject jsonObject = JSONObject.fromObject(user);
            try {
                // 转为JSON值
                res.setContentType("application/json;charset=utf-8");
                PrintWriter pw = res.getWriter();
                pw.print(jsonObject);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @RequestMapping("/login08")
        // 对于SpringMVC中默认情况下几乎所有的返回结果都认为是String,
        // 如果使用@ResponseBody注解就可以使得最终的返回值不以String类型进行解析
        // 而是以特定的格式的输出流进行打印,具体的格式由 <mvc:annotation-driven/> 来决定,
        // 默认将返回值以json格式输出
        @ResponseBody
        public User login08(User user) {
    
            return user;
    
        }
    
        @RequestMapping("/showImg01")
        public void showImg(OutputStream os) {
    
            String filePath = "C:\a.png";// 文件路径
            Resource resource = new FileSystemResource(filePath);
            try {
                // 输入流
                InputStream is = resource.getInputStream();
                // 输出流(方法中直接注入的参数)
                // 将输入流的内容拷贝到输出流中
                FileCopyUtils.copy(is, os);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @RequestMapping("/showImg02")
        public void showImg02(HttpServletResponse res) {
    
            String filePath = "";
            Resource resource = new FileSystemResource(filePath);
            InputStream is;
            try {
                is = resource.getInputStream();
                FileCopyUtils.copy(is, res.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }

    @Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,

      一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,

      加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。


    作用:
      该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。


    使用时机:
      返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

  • 相关阅读:
    WPS JS宏
    WPS基础
    算法文章收藏
    辩论赛
    物流系统
    C#导出excel复杂表格(单元各合并)
    VUE复杂表格合并
    Linux系统创建一个npm命令行工具
    Java使用技巧记录
    Ubuntu系统安装nodejs及npm
  • 原文地址:https://www.cnblogs.com/x-you/p/8423990.html
Copyright © 2011-2022 走看看