全部章节   >>>>


本章目录

6.1 模型数据解析及控制器返回值

6.1.1 ModelAndView多种用法

6.1.2  Map添加模型数据和返回String类型值

6.1.3  Model添加模型数据和返回String类型值

6.1.4 返回值为String类型的重定向和转发

6.1.5 实践练习

6.2 Spring MVC表单标签库

6.2.1  form表单与模型数据的绑定

6.2.2  Spring MVC常用标签

6.2.3 实践练习

6.3  Spring MVC数据校验

6.3.1 基于Validator接口方式的数据验证

6.3.2 基于Annotaion JSR-303标准的数据校验

6.3.3 实践练习

6.4综合案例

6.4.1 在Spring MVC中使用RESTful架构

6.4.2 课程管理模块需求说明

6.4.2 课程管理模块实现思路

6.4.3 实践练习

总结:


6.1 模型数据解析及控制器返回值

Spring MVC框架作为一个MVC框架,很重要的一项工作是控制器获取模型数据并返回给客户端,即在JSP页面展示模型数据。

模型数据的绑定,是指将模型数据绑定给JSP域对象。模型数据的绑定是由视图解析器来完成的,开发时先添加模型数据,再交给视图解析器来绑定。

Spring MVC提供了Map、Model和ModelAndView等方式添加模型数据,而控制器的返回值有ModelAndView、String和void。

配置视图解析器,简化转向地址的编写。在Spring MVC的核心配置文件中,配置视图解析器。

  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <property name="prefix" value="/WEB-INF/jsp"></property>
  3. <property name="suffix" value=".jsp"></property>
  4. </bean>

6.1.1 ModelAndView多种用法

示例:模型数据解析及控制器返回值的多种用法。

配置视图解析器后,转向地址简化了,前缀和后缀都不用写了

  1. @RequestMapping("/modelAndViewTest1")
  2. public ModelAndView modelAndViewTest1(){
  3. ModelAndView modelAndView = new ModelAndView();
  4. modelAndView.addObject("name", "大哥");
  5. modelAndView.setViewName("index");
  6. return modelAndView;
  7. }
  8. @RequestMapping("/modelAndViewTest2")
  9. public ModelAndView modelAndViewTest2(){
  10. ModelAndView modelAndView = new ModelAndView();
  11. modelAndView.addObject("name", "二哥");
  12. View view = new InternalResourceView("/WEB-INF/jsp/index.jsp");
  13. modelAndView.setView(view);
  14. return modelAndView;
  15. }
  1. @RequestMapping("/modelAndViewTest3")
  2. public ModelAndView modelAndViewTest3(){
  3. ModelAndView modelAndView = new ModelAndView("index");
  4. modelAndView.addObject("name", "三哥");
  5. return modelAndView;
  6. }
  7. @RequestMapping("/modelAndViewTest4")
  8. public ModelAndView modelAndViewTest4(){
  9. ModelAndView modelAndView = new ModelAndView("index","name", "四哥");
  10. return modelAndView;
  11. }

6.1.2  Map添加模型数据和返回String类型值

Spring MVC在内部使用Model接口存储模型数据,在调用业务方法前会创建一个隐含对象作为模型数据的存储容器。

设置业务方法的入参为Map类型,Spring MVC会将隐含对象的引用传递给入参。

在方法体中,开发者可以通过入参对象访问到模型中的所有数据,也可以向模型中添加新数据。即只需要在业务方法添加Map类型的入参,方法体中便可通过对入参的操作来完成模型数据的添加。

示例: 使用Map类型的入参来完成模型数据的添加,并且返回String类型值

  1. @Controller
  2. public class MapController {
  3. @RequestMapping("/mapTest")
  4. public String mapTest(Map<String, String> map){
  5. map.put("name", "小王");
  6. return "index";
  7. }
  8. }

配置视图解析器后,转向地址简化了,前缀和后缀都不用写了

6.1.3  Model添加模型数据和返回String类型值

示例:使用Model类型的入参完成模型数据的添加,并且返回String类型值

  1. @Controller
  2. public class ModelController {
  3. @RequestMapping("/modelTest")
  4. public String modelTest(Model model){
  5. model.addAttribute("name", "小章");
  6. return "index";
  7. }
  8. }

6.1.4 返回值为String类型的重定向和转发

示例:返回值为String类型时,重定向和转发的跳转的实现。

  1. @RequestMapping("/forward")
  2. // 转发跳转到商品列表页面
  3. public String forwardTest(){
  4. return "forward:/jump.do";
  5. }
  6. @RequestMapping("/redirect")
  7. // 重定向跳转到商品列表页面
  8. public String redirectTest(){
  9. return "redirect:/jump.do";
  10. }

6.1.5 实践练习

6.2 Spring MVC表单标签库

表单标签库的实现类在spring-webmvc.jar文件当中,标签库描述文件是spring-form.tld。要使用Spring MVC的表单标签库,必须在JSP页面的开头处声明一下taglib指令。

  1. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

标签

描述

Form

渲染表单元素

input

渲染<input type=”text” />元素

password

渲染<input type=”password” />表单元素

hidden

渲染<input type=”hidden” />元素

textarea

渲染textarea元素

Checkbox

渲染一个<input type=”checkbox” />元素

Checkboxes

渲染多个<input type=”checkbox” />元素

Radiobutton

渲染一个<input type=”radio” />元素

Radiobuttons

渲染多个<input type=”radio” />元素

Select

渲染一个选择元素

Option

渲染一个可选元素

Options

渲染一个可选元素列表

errors

在span元素中渲染字段错误

6.2.1  form表单与模型数据的绑定

示例:完成Spring MVC表单与模型数据绑定。

  1. <body>
  2. <h1>修改学生信息</h1>
  3. <form:form modelAttribute="student" action="modifyDo.do" method="post">
  4. 学生姓名:<form:input path="stuName" /><br/>
  5. 学生年龄:<form:input path="age" /><br/>
  6. <input type="submit" value="提交"/>
  7. </form:form>
  8. </body>

<form:form></form:form>标签渲染的是HTML中的<form></form>,通过modelAttribute属性绑定具体的模型数据,<form:input />渲染的是HTML中的<input type="text"/>,form标签绑定的是模型数据,input标签绑定的就是模型数据中的属性值,通过path属性与模型数据的属性名对应。

6.2.2  Spring MVC常用标签

示例:首先在Student类中添加password、hobby、sex、city和introduce五个属性,然后在modifyStudent.jsp文件中添加标签内容,最后在页面输出修改后学生信息。

  1. <form:form modelAttribute="student" action="modifyDo.do" method="post">
  2. // 原有代码省略
  3. 学生密码:<form:password path="password" /><br/>
  4. 学生爱好:<form:checkbox path="hobby" value="读书" />读书
  5. <form:checkbox path="hobby" value="看电影" />看电影
  6. <br/>
  7. 学生性别:<form:radiobutton path="sex" value="男" />
  8. <form:radiobutton path="sex" value="女" /><br/>
  9. 城市:<form:select path="city">
  10. <form:option value="0">--请选择--</form:option>
  11. <form:option value="北京">北京</form:option>

  12. </form:select><br/>
  13. 自我介绍:<form:textarea path="introduce" />
  14. <input type="submit" value="提交"/>
  15. </form:form>

6.2.3 实践练习

6.3  Spring MVC数据校验

数据校验就是用来验证客户输入的数据是否合法。数据校验分为客户端校验和服务端校验,Spring MVC提供的数据校验为服务端校验。

Spring MVC提供了两种数据校验的方式:基于Validator接口的方式和使用Annotaion JSR-303标准进行校验。

使用Spring MVC的数据校验需导入jar包

6.3.1 基于Validator接口方式的数据验证

示例:在学生登录界面,验证学生姓名和密码是否为空。

  1. @RequestMapping("/login")
  2. // @Validated:对它注解的POJO进行校验
  3. // BindingResult:通过这个对象可以获取到校验失败额信息,
  4. // 它和@Validated注解必须配对使用,而且一前一后
  5. public String login(@Validated Student student, BindingResult rs){
  6. if(rs.hasErrors()){
  7. // 校验失败返回登录界面
  8. return "login";
  9. }
  10. // 校验成功返回首页
  11. return "success";
  12. }
  1. public class StudentValidator implements Validator {
  2. @Override
  3. public boolean supports(Class<?> clazz) {
  4. return Student.class.equals(clazz);
  5. }
  6. @Override
  7. public void validate(Object target, Errors errors) {
  8. ValidationUtils.rejectIfEmpty(errors, "stuName", null, "学生用户名不能为空!");
  9. ValidationUtils.rejectIfEmpty(errors, "password", null, "学生密码不能为空!");
  10. }
  11. }
  1. <!-- 配置自定义校验器 -->
  2. <bean id="studentValidator" class="com.mhys.demo.validator.StudentValidator"></bean>
  3. <!-- 开启注解驱动 -->
  4. <mvc:annotation-driven validator="studentValidator"></mvc:annotation-driven>
  1. <body>
  2. <h1>学生登录</h1>
  3. <form:form action="login.do" modelAttribute="student" method="post">
  4. 学生用户名:<form:input path="stuName"/><form:errors path="stuName" /><br/><br/>
  5. 学生密码:<form:input path="password"/><form:errors path="password" /><br/><br/>
  6. <input type="submit" value="登 录" />
  7. </form:form>
  8. </body>

6.3.2 基于Annotaion JSR-303标准的数据校验

使用Annotaion JSR-303标准则不需要自定义验证器,通过注解的方式可以直接在实体类中添加每个属性的校验规则,这种方式使用更加方便。

标签

描述

@Null

限制只能为null

@NotNull

限制必须不为null

@AssertFalse

限制只能为false

@AssertTrue

限制只能为true

@DecimalMax(value)

限制必须为一个不大于指定值得数字

@DecimalMin(value)

限制必须为一个不小于指定值得数字

@Max(value)

限制必须为一个不大于指定值的数字

@Min(value)

限制必须为一个不小于指定值的数字

@Pattern(value)

限制必须符合指定的正则表达式

@Size(max,min)

限制字符长度必须在min到max之间

@NotEmpty

验证注解的元素值不为null(字符串长度不为0、集合大小不为0)

@NotBlank

验证注解的元素值不为空(只用于字符串且在比较时会去除字符串的空格)

@Email

验证注解的元素值是Email,也可以通过正则表达式指定自定义的Email格式

示例:通过用户注册功能,使用注解的方式,完成用户实体类属性的校验。

  1. public class User {
  2. @NotEmpty(message="用户名不能为空!")
  3. private String username;
  4. @Size(min=6,max=12,message="密码长度为6到12位!")
  5. private String password;
  6. @Email(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$",
  7. message = "请输入正确的邮箱格式")
  8. private String email;
  9. @Pattern(regexp = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$",
  10. message="请输入正确的电话格式")
  11. // set()方法和get()方法省略
  12. }
  1. @RequestMapping("/registerDo")
  2. public String registerDo(@Valid User user, BindingResult br){
  3. if(br.hasErrors()){
  4. return "register";
  5. }
  6. return "registerSuccess";
  7. }
  1. <form:form action="registerDo.do" modelAttribute="user" method="post">
  2. 用户名:<form:input path="username"/><form:errors path="username" cssClass="error" /><br/><br/>
  3. 用户密码:<form:password path="password"/><form:errors path="password" cssClass="error" /><br/><br/>
  4. 用户邮箱:<form:input path="email"/><form:errors path="email" cssClass="error" /><br/><br/>
  5. 用户电话:<form:input path="telphone"/><form:errors path="telphone" cssClass="error" /><br/><br/>
  6. <input type="submit" value="注 册" />
  7. </form:form>

6.3.3 实践练习

6.4综合案例

6.4.1 在Spring MVC中使用RESTful架构

REST(RepresEntational State Transfer,(资源)表现层状态转化)是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解并且扩展方便,得到了越来越多网站的采用。特点如下:

url更加简洁,将参数通过url传到服务端。

  • 非REST的url为http://…/queryUserById?id=1。
  • REST的url风格为http://…/queryUserById/1 。

有利于不同系统之间的资源共享,只需要遵守规范,不需要做其他的配置就能达到资源共享。

示例:使用@PathVariable注解获取REST的url风格中的参数值。

  1. @Controller
  2. public class TestController {
  3. @RequestMapping("/test/{name}/{id}")
  4. @ResponseBody
  5. public String test(@PathVariable String name,@PathVariable String id){
  6. return "名字:" + name + " ----- 编号:" + id;
  7. }
  8. }

6.4.2 课程管理模块需求说明

在课程管理系统中,课程管理模块主要负责管理所有的课程信息。主要功能包括添加、删除、修改和查找课程信息。根据本章所学知识,开发一个简单的课程管理模块,要求:

  • 完成课程列表展示。
  • 新增课程功能。
  • 删除课程功能。
  • 修改课程功能。

6.4.2 课程管理模块实现思路

创建t10_course表,添加courseId、courseName和coursePrice字段。

在springmvc.xml配置文件中开启注解扫描功能、配置数据源、配置JdbcTemplate模板、开启注解驱动和配置视图解析器,dataSource.properties配置文件中内容省略。

在com.mhys.demo.pojo包下创建T10_course类,添加courseId、courseName和coursePrice属性,添加注解和验证规则。

在com.mhys.demo.dao包下创建T10_courseDao接口,添加getT10_courseList()方法、addT10_course()方法和deleteT10_course()方法。

在com.mhys.demo.dao.impl包下创建T10_courseDaoImpl类并实现T10_courseDao接口,实现接口中的方法

在com.mhys.demo.service包下创建T10_courseService接口,添加getT10_courseList()方法、addT10_course()方法和deleteT10_course()方法。

在com.mhys.demo.service.impl包下创建T10_courseServiceImpl类并实现T10_courseService接口,实现接口中的方法。

在com.mhys.demo.controller包下创建T10_courseServiceController处理器类并注册到容器,声明getT10_courseList()方法、addT10_course()方法、addT10_courseDo()方法和deleteT10_courseDo()方法。

在WEB-INF/jsp目录下创建t10_course_list.jsp文件和addT10_course.jsp文件。

6.4.3 实践练习

总结:

Spring MVC提供了Map、Model和ModelAndView等方式添加模型数据,而控制器的返回值有ModelAndView、String和void。

Spring表单标签有 : <form:form>标签、<form:input>标签<form:password>标签、<form:chexkbox>标签、<form:radiobutton>标签、<form:select>标签、<form:option>标签、<form:textarea>标签和<form:hidden>标签等。

JSR常用注解:@Null注解、@NotNull注解、@DecimalMax(value)注解、@DecimalMin(value)注解、@Max(value)注解、@Min(value)注解、@Pattern(value)注解、@Size(max,min)注解、@NotEmpty注解以及@NotBlank注解等等。

Spring企业级程序设计 • 【第6章 深入Spring MVC开发】的更多相关文章

  1. Spring企业级程序设计作业目录(作业笔记)

    Spring企业级程序设计 • [目录] 第1章 Spring之旅  >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...

  2. Spring企业级程序设计 • 【目录】

    章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...

  3. Spring企业级程序设计 • 【第7章 Spring框架整合】

    全部章节   >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...

  4. Spring企业级程序设计 • 【第4章 Spring持久化层和事务管理】

    全部章节   >>>> 本章目录 4.1 配置数据源资源 4.1.1 JdbcTemplate介绍 4.1.2通过ComboPooledDataSource创建数据源 4.1. ...

  5. Spring企业级程序设计 • 【第1章 Spring之旅】

    全部章节   >>>> 本章目录 1.1 Spring框架基础 1.1.1 Spring特点及体系结构 1.1.1 Spring的体系结构 1.1.2  使用Eclipse搭建 ...

  6. Spring企业级程序设计 • 【第5章 Spring MVC快速入门】

    全部章节   >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2  S ...

  7. Spring企业级程序设计 • 【第3章 面向切面编程】

    全部章节   >>>> 本章目录 3.1 AOP基本概念和术语 3.1.1 AOP概念 3.1.2 AOP的术语解释 3.1.3 通知类型介绍 3.1.4 通过AOP模拟事务操 ...

  8. Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】

    全部章节   >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...

  9. Spring Boot学习第一部分(Spring 4.x)第一章(Spring 基础)

    1.spring概述 1.1.spring的简史 第一阶段:XML配置spring 1.x时代, 第二阶段:注解配置spring 2.x时代, @Controller @Service @Compon ...

随机推荐

  1. 使用 Addressables 来管理资源

    使用 Addressables 来管理资源 一.安装 打开Package Manager,在Unity Technologies的目录下找到Addressables,更新或下载. 二.配置 依次打开W ...

  2. 转 序列化Serializable和Parcelable的区别详解

    什么是序列化,为什么要进行序列化 答:对象要进行传输(如:activity 与activity间 ,网络间 进程间等等).存储到本地就必须进行序列化 . 这种可传输的状态就是序列化. 怎么序列化??两 ...

  3. Java实现单链表的增删查改及逆置打印

    //所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...

  4. spring boot集成swagger文档

    pom <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifa ...

  5. mango后台

     环境搭建 项目配置 下载后导入项目,删除mvnw.mvnw.cmd两个文件 修改spring-boot-starter-web pom.xml --> run as --> mave i ...

  6. Give You My Best Wishes

    亲耐滴IT童鞋们: 感谢大家一直以来的支持,因为有你们的支持,才有我这么"拼"的动力!!爱你们哟 OC的学习已经告一段落,希望大家通过阅读这几篇浅薄的随笔,能够寻找到解决问题的方法 ...

  7. Django REST framework完全入门

    Django REST framework 一个强大灵活的Django工具包,提供了便捷的 REST API 开发框架 我们用传统的django也可以实现REST风格的api,但是顶不住Django ...

  8. 【C/C++】链表

    #include <bits/stdc++.h> using namespace std; struct node { int data; // 数据 node* next; // 指针 ...

  9. UMDCTF 2021

    6道pwn题,4道可以做.剩下一道题是arm架构,一道题是内核,溜了溜了. Jump_Not_Easy 1 from pwn import * 2 3 p = process('./pwn') 4 e ...

  10. [BUUCFT]PWN——pwn2_sctf_2016

    pwn2_sctf_2016[整数溢出+泄露libc] 题目附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,看看大概的执行情况 32位ida载入,shift+f12检索程序里的字符串, ...