Fork me on GitHub

SpringMVC 查缺补漏

注意:所有文章除特别说明外,转载请注明出处.

前言

@ResponseBody转换为JSON秘密

1.在控制器中,其在进入控制器方法之前,遇到@ResponseBody之后,处理器就会记录这个方法的响应类型是JSON数据集。
2.在执行完控制器返回之后,处理器启用结果解析器(ResultResolver)解析此结果,轮询注册给SpringMVC的HttpMessageConverter接口的实现类。

操作会话对象

@SessionAttribute 该注解应用于参数,将HttpSession中的属性读出,赋予控制器的参数
@SessionAttributes 用于类的注解,其会将相关数据模型的属性保存到Session中

给控制器增加通知

@ControllerAdvice 定义控制器通知类

@InitBinder 定义控制器参数绑定规则

@ExceptionHandler 定义控制器发生异常后的操作

@ModelAttribute 在控制器方法执行之前,对数据模型进行操作

数据回显

数据回显,表示在提交之后如果出现错误,将刚才提交的数据回显到刚才提交的页面。

POJO数据回显方法

1.SpringMVC默认对POJO数据作回显

POJO数据传入controller方法后,springmvc自动将POJO数据放到request域,key等于POJO类型(首字母小写),使用@ModelAttribute指定pojo回显到页面在request中的key。

2.@ModelAttribute将方法的返回值传到页面

在商品查询列表页面,通过商品类型查询商品信息。在controller中定义商品类型查询方法,最终将商品类型传到页面。

//商品分类
//itemtypes表示最终将方法返回值放在request中的key
@ModelAttribute("itemtypes")
public Map<String, String> getItemTypes() {

    Map<String, String> itemTypes = new HashMap<String, String>();
    itemTypes.put("101", "数码");
    itemTypes.put("102", "母婴");

    return itemTypes;
}

然后在页面上可以得到itemTypes数据。

<td>
    商品名称:<input name="itemsCustom.name" />
    商品类型:
    <select name="itemtype">
        <c:forEach items="${itemtypes}" var="itemtype">
            <option value="${itemtype.key }">${itemtype.value }</option>
        </c:forEach>
    </select>
</td>

3.使用最简单方法使用model,可以不用@ModelAttribute

//可以直接使用model将提交pojo回显到页面
//model.addAttribute("items", itemsCustom);
//简单类型数据回显
//使用最简单方法使用model
model.addAttribute("id", id);

SpringMVC JSON数据交互

1.环境

1.pom.xml添加依赖

<!-- json 转换-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.2</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

2.配置JSON转换器

<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
    <list>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    </list>
    </property>
</bean>

提示:这里可以直接使用<mvc:annotation-driven />,然后就不用再定义上面的内容。

这里的前台和controller方法省略。


RESTful支持

概念

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。

1.对url进行规范,写RESTful格式的url

1.非REST的url:http://...../queryItems.action?id=001&type=T01

2.REST的url风格:http://..../items/001

特点:url简洁,将参数通过url传到服务端

2.http的方法规范

不管是删除、添加、更新,等等。使用url是一致的,如果进行删除,需要设置http的方法为delete,其他同理。后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。

3.对http的contentType规范

请求时指定contentType,要json数据,设置成json格式的type。

案例 - 查询商品信息,返回JSON数据

1.controller

定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller。输出json使用@ResponseBody将java对象输出json。

//查询商品信息,输出json
//itemsView/{id}里边的{id}表示占位符,通过@PathVariable获取占位符中的参数,
//@PathVariable中名称要和占位符一致,形参名无需和其一致
//如果占位符中的名称和形参名一致,在@PathVariable可以不指定名称
@RequestMapping("/itemsView/{id}")
public @ResponseBody ItemsCustom itemsView(@PathVariable("id") Integer items_id)throws Exception{

    //调用service查询商品信息
    ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
    return itemsCustom;
}

@RequestMapping(value=”/ itemsView/{id}”):{×××}占位符,请求的URL可以是/viewItems/1或/viewItems/2,通过在方法中使用@PathVariable获取{×××}中的×××变量。@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。如果@RequestMapping中表示为/itemsView/{id},id和形参名称一致,@PathVariable不用指定名称。

2.REST方法的前端控制器配置

<!-- springmvc前端控制器,rest配置 -->
<servlet>
    <servlet-name>springmvc_rest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml) -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/springmvc.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc_rest</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3.对静态资源的解析

配置前端控制器的url-parttern中指定/,对静态资源的解析会出现问题,报404错误。在springmvc.xml中添加静态资源解析方法。

<!-- 静态资源解析
    包括 :js、css、img、..
     -->
<mvc:resources location="/js/" mapping="/js/**"/>

这时访问http://localhost:8080/ssm1/js/jquery-1.4.4.min.js,可以在浏览器中看到js的内容。

本文标题:SpringMVC 查缺补漏

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 07:59:30

原始链接:http://bangjinhu.github.io/undefined/SpringMVC 拾遗/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.