SpringMVC 映射请求数据获取案例--模型数据

简介: SpringMVC 映射请求数据获取案例--模型数据

SpringMVC 映射请求数据获取案例–模型数据


获取参数值


说明

  1. 开发中,如何获取到http://xxx/url?参数名=参数值&参数名=参数值
  2. 这个使用的非常广泛,我们看一个案例


应用实例


创建springmvc\src\com\web\requestparam\VoteHandler.java

@RequestMapping("/vote")
@Controller
public class VoteHandler {
    //获取到超链接传递的数据
    /**
    * 解读@RequestParam(value="name", required=false)
    * 1.@RequestParam : 表示说明一个接受到的参数
    * 2.value="name" : 接收的参数名是name,接收名必须和前端一致,否则为null
    * 3.required=false : 表示该参数可以有,也可以没有,如果required=true,表示必须传递该 参数.
    * 默认是required=true
    */
    @RequestMapping(value = "/vote01")
    public String test01(@RequestParam(value = "name", required = false)
    String username) {
    System.out.println("得到的username= " + username);
    //返回到一个结果
    return "success";
    }
}


创建springmvc\web\request_parameter.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
      <title>测试request parameter</title>
    </head>
    <body>
            <h2>获取到超链接参数值</h2>
            <hr/>
            <a href="vote/vote01?name=rsthht">获取超链接的参数</a>
    </body>
</html>

页面完成测试。


获取http 请求消息头


应用实例


  1. 修改VoteHandler.java, 增加方法
@RequestMapping(value = "/vote02")
public String test02(@RequestHeader("Accept-Encoding") String ae,@RequestHeader("Host") String host) {
    System.out.println("Accept-Encoding =" + ae);
    System.out.println("Host =" + host);
    //返回到一个结果
    return "success";
}


  1. 修改request_parameter.jsp, 增加代码
<h1>获取到消息头</h1>
<hr>
<a href="vote/vote02">获取http 消息头信息</a>


获取javabean 形式的数据


开发中,如何获取到javaben 的数据,就是以前的entity/pojo 对象数据


应用实例


创建springmvc\src\com\web\requestparam\entity\Pet.java

public class Pet {
        private Integer id;
        private String name;
}


创建springmvc\src\com\web\requestparam\entity\Master.java

public class Master {
    private Integer id;
    private String name;
    private Pet pet;//对象的属性是另外一个对象[涉及级联]
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Pet getPet() {
        return pet;
    }
    public void setPet(Pet pet) {
        this.pet = pet;
    }
    @Override
    public String toString() {
        return "Master{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pet=" + pet +
                '}';
    }
}


修改VoteHandler.java, 增加方法

//获取到添加的主人信息
@RequestMapping(value = "/vote03")
public String test03(Master master) {
        System.out.println("主人信息= " + master);
        //返回结果
        return "success";
}


修改request_parameter.jsp, 增加演示代码

<h1>添加主人信息</h1>
<!--
1. 这是一个表单,表单的数据对应Master对象
2. 提交的数据参数名和对象的字段名一致
-->
<form action="vote/vote03" method="post">
    主人号:<input type="text" name="id"><br>
    主人名:<input type="text" name="name"><br>
    宠物号:<input type="text" name="pet.id"><br>
    宠物名:<input type="text" name="pet.name"><br>
    <input type="submit" value="添加主人和宠物">
</form>


完成测试。

使用注意事项

  1. 支持级联数据获取
  2. 表单的控件名称name 需要和javabean 对象字段对应, 否则就是null


获取servlet api


应用实例


  1. 开发中, 我们可能需要使用到原生的servlet api 。
  2. 使用servlet api , 需要引入tomcat/lib 下的servlet-api.jar。


修改VoteHandler.java, 增加方法。

@RequestMapping(value = "/vote04")
public String test04(HttpServletRequest request,HttpServletResponse response) {
    System.out.println("name= " + request.getParameter("username"));
    System.out.println("pwd= " + request.getParameter("pwd"));
    //返回结果
    return "success";
}


修改request_parameter.jsp

<hr>
<h1>获取servlet api </h1>
    <form action="vote/vote04" method="post">
            用户名:<input type="text" name="username"><br>
            密码:<input type="text" name="pwd"><br>
            <input type="submit" value="添加主人和宠物">
    </form>

完成测试


使用注意事项


除了HttpServletRequest, HttpServletResponse 还可以其它对象也可以这样的形式获取


HttpSession、java.security.Principal,InputStream,OutputStream,Reader,Writer


其中一些对象也可以通过HttpServletRequest / HttpServletResponse 对象获取,比如Session 对象,既可以通过参数传入,也以通过request.getSession() 获取,


效果一样,推荐使用参数形式传入,更加简单明了。


举例说明

@RequestMapping(value = "/vote04")
public String test04(HttpServletRequest request,HttpServletResponse response, HttpSession hs) {
        System.out.println("name= " + request.getParameter("username"));
        System.out.println("pwd= " + request.getParameter("pwd"));
        //可以看到hs 和request.getSession() 是同一个对象
        System.out.println("httpSession=" + httpSession);
        System.out.println("httpSession2=" + request.getSession());
        //返回结果
        return "success";
}


模型数据


模型数据处理-数据放入request


开发中, 控制器/处理器中获取的数据如何放入request 域,然后在前端(VUE/JSP/…)取出显示


方式1: 通过HttpServletRequest 放入request 域


创建springmvc\web\model_data.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
    <title>测试模型数据</title>
    </head>
    <body>
        <h1>添加主人信息</h1>
        <!--
        1. 这里的字段名称和对象的属性名保持一致,级联添加属性也是一样保持名字对应关系
        2. 如果只是添加主人信息,则去掉宠物号和宠物名输入框即可,pet 为null-->
        <form action="vote/vote05" method="post">
            主人号:<input type="text" name="id"><br>
            主人名:<input type="text" name="name"><br>
            宠物号:<input type="text" name="pet.id"><br>
            宠物名:<input type="text" name="pet.name"><br>
            <input type="submit" value="添加主人和宠物">
        </form>
    </body>
</html>


修改VoteHandler.java, 增加方法

 /**
     * 1. 演示将提交的数据->springmvc封装到java对象->springmvc 会自动的将其放入到request域
     * 2. 这样我们就可以在跳转到的页面取出数据.
     */
    @RequestMapping(value = "/vote05")
    public String test05(Master master, HttpServletRequest request) {
        //1. springmvc会自动把获取的model模型,放入到request域中,名字就是master
        //2. 也可以手动将master放入到request
        request.setAttribute("address", "beijing");
        //3. 如果我们希望修改master的属性值
        master.setName("nono");
        //4. 分析一下springmvc默认存放对象到request域中,属性名是
        //   request域 ("master", master) 属性名是类名/类型名 首字母小写
        //返回到一个结果
        return "vote_ok";
    }


创建springmvc\web\WEB-INF\pages\vote_ok.jsp, 显示数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
    <title>vote_ok </title>
    </head>
    <body>
            <h1>获取的的数据显示页面</h1>
            <hr>
            取出request 域的数据
            <br>
            address: ${address }<br>
            主人名字= ${requestScope.master.name }
            主人信息= ${requestScope.master }
            宠物名字= ${requestScope.master.pet.name }
    </body>
</html>

完成测试


方式2: 通过请求的方法参数Map<String,Object> 放入request 域


修改model_data.jsp, 增加代码

<h1>添加主人信息[测试 Map ]</h1>
<form action="vote/vote06" method="post">
    主人号:<input type="text" name="id"><br>
    主人名:<input type="text" name="name"><br>
    宠物号:<input type="text" name="pet.id"><br>
    宠物名:<input type="text" name="pet.name"><br>
    <input type="submit" value="添加主人和宠物">
</form>


修改VoteHandler.java , 增加方法

//演示通过Map<String,Object> 设置数据到request域
    @RequestMapping(value = "/vote06")
    public String test06(Master master, Map<String, Object> map) {
        System.out.println("------test06-----");
        //1. 需求是通过map对象,添加属性到request中
        //2. 原理分析:springmvc会遍历map,然后将map的k-v, 存放到request域
        map.put("address", "beijing...");
        //返回到一个结果
        return "vote_ok";
    }

完成测试


方式3: 通过返回ModelAndView 对象实现request 域数据


修改model_data.jsp, 增加代码

<h1>添加主人信息[测试ModelAndView]</h1>
<form action="vote/vote07" method="post">
    主人号:<input type="text" name="id"><br>
    主人名:<input type="text" name="name"><br>
    宠物号:<input type="text" name="pet.id"><br>
    宠物名:<input type="text" name="pet.name"><br>
    <input type="submit" value="添加主人和宠物">
</form>


修改VoteHandler.java , 增加方法

//将model 放入到ModelAndView 对象中,实现将数据放入到request 域中
    @RequestMapping(value = "/vote07")
    public ModelAndView test07(Master master) {
        System.out.println("----test07----");
      //创建一个ModelAndView 对象
        ModelAndView modelAndView = new ModelAndView();
        //下面这句话就等价于将master 对象放入到request 域中,属性名“master”
        modelAndView.addObject("master", master);
        modelAndView.addObject("address", "shanghai");
        //可以把从数据库得到的数据->对象-》放入modelAndView[Service-dao-db]
        //这里指定跳转的视图名称
        modelAndView.setViewName("vote_ok");
        //返回结果
        return modelAndView;
    }


完成测试


注意事项


从本质看,请求响应的方法return “xx”, 是返回了一个字符串,其实本质是返回了一个ModelAndView 对象,只是默认被封装起来的。


ModelAndView 即可以包含model 数据,也可以包含视图信息。


ModelAndView 对象的addObject 方法可以添加key-val 数据,默认在request 域中。


ModelAndView 对象setView 方法可以指定视图名称。


模型数据处理-数据放入session


开发中, 控制器/处理器中获取的数据如何放入session 域,然后在前端(VUE/JSP/…)取出显示


应用实例


修改model_data.jsp, 增加代码

<br/><hr/>
<h1>添加主人信息[测试session]</h1>
<form action="vote/vote08" method="post">
        主人号:<input type="text" name="id"><br>
        主人名:<input type="text" name="name"><br>
        宠物号:<input type="text" name="pet.id"><br>
        宠物名:<input type="text" name="pet.name"><br>
        <input type="submit" value="添加主人和宠物">
</form>


修改VoteHandler.java, 增加方法

//将model(master 对象) 放入到session 域中
@RequestMapping(value = "/vote08")
public String test08(Map<String, Object> map, Master master,HttpSession session) {
    System.out.println("======test08()======");
    map.put("address", "guangzhou");
    //在session 域也放入master 对象
    session.setAttribute("master2", master);
    return "vote_ok";
}


修改vote_ok.jsp , 增加代码

<hr>
取出session 域的数据<br>
主人名字= ${sessionScope.master2.name }
主人信息= ${sessionScope.master2 }


完成测试


@ModelAttribute 实现prepare 方法


应用实例


开发中,有时需要使用某个前置方法(比如prepareXxx(), 方法名由程序员定)给目标方法准备一个模型对象。@ModelAttribute 注解可以实现这样的需求。

修改VoteHandler.java, 增加方法并测试

/**
* 1. 当在某个方法上,增加了@ModelAttribute 注解
* 2. 那么在调用该Handler 的任何一个方法时,都会先调用这个方法
*/
@ModelAttribute
public void prepareModel(){
  System.out.println("prepareModel()-----完成准备工作-----");
}


@ModelAttribute 最佳实践


修改用户信息(就是经典的使用这种机制的应用),流程如下:


  1. 在修改前,在前置方法中从数据库查出这个用户
  2. 在修改方法(目标方法)中,可以使用前置方法从数据库查询的用户
  3. 如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库的信息为准,比如,用户的某个属性不能修改,就保持原来的值。
相关文章
|
6月前
|
SQL JavaScript Java
springboot+springm vc+mybatis实现增删改查案例!
springboot+springm vc+mybatis实现增删改查案例!
|
1月前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
34 1
Spring MVC——项目创建和建立请求连接
|
1月前
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
53 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
3月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
该博客文章详细介绍了SpringMVC中`@RequestMapping`注解的使用方法,包括其功能、位置、value属性、method属性、params属性、headers属性以及支持的路径风格和占位符,并通过实际代码案例展示了如何建立请求与控制器方法之间的映射关系。
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
|
4月前
|
缓存 前端开发 Java
SpringMVC原理(1)-文件上传请求
【7月更文挑战第2天】SpringMVC文件上传请求原理:文件上传请求的执行流程、文件上传的自动配置原理 涉及组件:MultiPartFile、MultipartResolver、MultipartHttpServlet
|
5月前
|
前端开发 Java Spring
Spring MVC 请求处理流程
Spring MVC 请求处理流程
31 0