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. 如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库的信息为准,比如,用户的某个属性不能修改,就保持原来的值。
相关文章
|
2月前
|
SQL JavaScript Java
springboot+springm vc+mybatis实现增删改查案例!
springboot+springm vc+mybatis实现增删改查案例!
26 0
|
5月前
|
JSON 网络架构 数据格式
SpringMVC-REST风格简介及RESTful入门案例
SpringMVC-REST风格简介及RESTful入门案例
37 0
|
6月前
|
前端开发 应用服务中间件
SpringMVC 文件上传 消息 Required request part ‘file‘ is not present描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者
SpringMVC 文件上传 消息 Required request part ‘file‘ is not present描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者
326 0
|
5月前
|
JSON 数据格式
SpringMVC-接收请求中的json数据及日期类型参数传递
SpringMVC-接收请求中的json数据及日期类型参数传递
52 0
|
6月前
|
JSON 前端开发 Java
学习SpringMvc第二战之【SpringMVC之综合案例】
学习SpringMvc第二战之【SpringMVC之综合案例】
|
2月前
|
前端开发 Java 网络安全
ssh(Spring+Spring mvc+hibernate)简单增删改查案例
ssh(Spring+Spring mvc+hibernate)简单增删改查案例
11 0
|
2月前
|
前端开发 Java
Springmvc入门案例(1)
Springmvc入门案例(1)
8 0
|
3月前
|
JSON 前端开发 Java
SpringMVC的架构有什么优势?——视图与模型(二)
SpringMVC的架构有什么优势?——视图与模型(二)
|
4月前
|
设计模式 前端开发 开发者
SpringMVC底层负责请求路由的模块是什么
SpringMVC底层负责请求路由的模块是什么
81 0
|
4月前
springmvc请求转发和重定向的四种跳转方式
springmvc请求转发和重定向的四种跳转方式