02-Spring MVC 注解与数据绑定

Spring MVC 注解及相关属性

  • @Controller [ 默认属性为 value ]

在类定义处添加 注解 @Controller 结合spring的自动扫描配置,将其注册到 Spring 容器中,使其成为 Spring Web MVC 控制器,可以接收客户端的请求。

  • @ResponseBody

在业务方法上添加 注解 @ResponseBody,Spring MVC 会将业务方法的返回值直接响应给客户端。如果没有添加该注解,Spring MVC 会将业务方法的返回值传递给 DispatcherServlet,由其调用视图解析器进行解析,最后映射到一个 JSP 资源。

  • @RestController

注解 @RestController 是在类定义处添加的,它可以简单的理解为注解 @Controller 和注解 @ResponseBody 的结合。

  • @RequestMapping 及其属性

注解 @RequestMapping 可以将传入的 Web 请求映射到适当的控制器或控制器方法。

类型级的 @RequestMapping 注解将请求映射到适当的控制器。

方法级的 @RequestMapping 注解将请求映射到指定控制器类的特定方法。

属性功能
value指定了映射到控制器或控制器方法的请求路径。
method指定了由控制器和控制器方法处理的 HTTP 请求。
常用 HTTP 请求方法的枚举值有:GET,POST,PUT,DELETE 等 。
params指定请求中必须存在的请求参数的名称和值。
consumes指定了控制器或控制器方法处理的请求的 MIME 类型。
produces指定了响应可接受的 MIME 类型。
headers指定了请求头的类型。
  • @RequestParam 及其属性

注解 @RequestParam 完成 HTTP 请求参数与业务方法形参的映射,当请求参数与形参一致时可以不添加。

属性功能
value将 HTTP 请求中的指定的参数赋给形参。
required用于指定该参数是否必须。
defaultValue用于指定参数的默认值。

Spring MVC 数据绑定

简单:基本数据类型、包装类类型、数组的数据绑定

省略部分:pom.xml 导入相关依赖、web.xml 配置DispatcheServlet 和 CharacterEncodingFilter、springmvc.xml 开启基于注解的组件扫描并配置视图解析器。

  • UserHandler.java 控制器类
package com.ored.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;

@RestController
@RequestMapping("/user")
public class UserHandler {

    // 基本数据类型的数据绑定
    // 注解@RequestParam 将请求参数赋给方法的形参
    // 请求路径:http://localhost:8080/user/baseType?uid=2
    @RequestMapping(value = "/baseType",method = RequestMethod.GET)
    public String baseType(@RequestParam("uid") int id){
        return "请求参数为:" + id;
    }

    // 包装类的数据绑定 uid 可以为 Null 值
    // 请求路径:http://localhost:8080/user/packageType?uid=4
    @RequestMapping(value = "/packageType",method = RequestMethod.GET)
    public String packageTeyp(@RequestParam("uid") int id){
        return "请求参数为:" + id;
    }

    // 数组的数据绑定
    // 请求路径:http://localhost:8080/user/array?name=zhangsan&name=lisi
    @RequestMapping(value = "/array",method = RequestMethod.GET)
    public String array(@RequestParam("name") String[] names){
        return "请求参数为:" + Arrays.toString(names);
    }
}

复杂:JavaBean、List、Map 类型的数据绑定。

演示案例,新增一个书店并展示。

  • Book.java
package com.ored.domain;

import java.math.BigDecimal;

public class Book {

    private String bookname;
    private BigDecimal price;

    // set and get methods not shown.
}

  • BookStore.java
package com.ored.domain;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public class BookStore {

    private Long bid;         // 书店ID
    private String name;      // 书店名称
    private String address;   // 书店地址
    private List<String> categories;    // 图书类别
    private Map<String,Book> books;  // 图书价格
    
    // set and get methods not shown.
}
  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p><a href="/book/add">Add A BookStore.</a></p>
</body>
</html>
  • 控制器类 BookController
package com.ored.controller;

import com.ored.domain.BookStore;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/book")
public class BookController {

    // 跳转到表单页面
    @RequestMapping(value = "/add")
    public String add() {
        return "add";
    }

    // 提交表单后展示
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public String save(BookStore bookStore, Model model) {
        model.addAttribute("bookstroe",bookStore);
        return "details";
    }
}

  • 表单页 add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<form action="/book/save" method="post">
    <fieldset>
        <legend>Add a new bookstore</legend>
        <p>
            <lable for="bid">Bookstore ID:</lable>
            <input type="text" id="bid" name="bid"/>
        </p>
        <p>
            <lable for="name">Bookstore Name:</lable>
            <input type="text" id="name" name="name"/>
        </p>
        <p>
            <lable for="address">Bookstore Address:</lable>
            <input type="text" id="address" name="address"/>
        </p>
        <p>
            <%-- List 集合的数据绑定 --%>
            Category:
            <input type="checkbox" id="English" name="categories[0]" value="英语">
            <label for="English">English</label>

            <input type="checkbox" id="psychology" name="categories[1]" value="心理学">
            <label for="psychology">psychology</label>

            <input type="checkbox" id="philosophy" name="categories[2]" value="哲学">
            <label for="philosophy">philosophy</label>
        </p>
         <%-- Map 集合的数据绑定 --%>
        <p>The price of the book:</p>
        <p>
            <label for="bookname1">Book Name:</label>
            <input type="text" id="bookname1" name="books['ISBN-001'].bookname">

            <label for="price1">Price:</label>
            <input type="text" id="price1" name="books['ISBN-001'].price" step="any"
                   placeholder="the book price in #.## format">
        </p>
        <p>
            <label for="bookname2">Book Name:</label>
            <input type="text" id="bookname2" name="books['ISBN-002'].bookname">

            <label for="price2">Price:</label>
            <input type="text" id="price2" name="books['ISBN-002'].price" step="any"
                   placeholder="the book price in #.## format">
        </p>
        <p>
            <input type="reset" value="reset">
            <input type="submit" value="submit">
        </p>
    </fieldset>
</form>

</body>
</html>

具体的效果:
在这里插入图片描述

  • 展示页面 details.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<p>Bookstore ID:${bookstroe.bid}</p>
<p>Bookstore Name:${bookstroe.name}</p>
<p>Bookstore Address:${bookstroe.address}</p>
<p>Category:
    <c:forEach items="${bookstroe.categories}" var="category">
        ${category}
    </c:forEach>
</p>
<p>Books:</p>
    <c:forEach items="${bookstroe.books}" var="book">
       <tr>
           <td>Book Name:${book.value.bookname}</td>
           <td>Price:${book.value.price}</td>
       </tr>
        <br />
    </c:forEach>
</body>
</html>

比较麻烦:Json 的数据绑定

1、在 WEB-INF/js 目录下将 JQuery 文件导入:jquery-3.3.1.min.js

2、在 web.xml 文件中添加以下配置,使 js 文件不被 DispatcherServlet 所拦截。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

3、在 pom.xml 文件中导入相关依赖 fastjson 将 json 格式的数据转化为 Java Bean 对象。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.1.37</version>
</dependency>
  • springmvc.xml 配置 FastJsonHttpMessageConverter
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
    </mvc:message-converters>
</mvc:annotation-driven>
  • 控制器 BookController.java
    @RequestMapping(value = "/json")
    @ResponseBody
    // 注解 @RequestBody 将 Json 字符串转换为JavaBean对象[ 反序列化 ]
    public Book json(@RequestBody Book book){
        return book;
    }
  • json.jsp 发送异步请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="../../js/jquery-3.3.1.min.js" type="text/javascript"></script>
    <script>
        $(function () {
            var book = {
                "bookname": "English Grammer",
                "price": 76
            }
            $.ajax({
                url: "/book/json",
                data: JSON.stringify(book),
                type: "POST",
                contentType: "application/json;charset=UTF-8",
                dataType: "JSON",
                success:function(data){
                    alert(data.bookname+"---"+data.price);
                }
            });
        });
    </script>
</head>
<body>
</body>
</html>
以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值