回顾

前面我们已经搭建好了一个基于 Maven 的最基本的Spring以及Spring MVC 环境。

接下来,我们就在这个环境下来 “布置” 出我们最基本的控制器。

请求处理的位置

  • 我们熟悉最简单的一个控制器应该是这样的:
package com.twm.bookmvc;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class MyController {@RequestMapping("/my")public String hello() {return "mypage";}}

在指定的文件夹先写页面,然后前端直接输入:http://localhost:8888/bookmvc/my

  • 现在我们把映射注解 @RequestMapping 同时放在类和方法上:
@Controller
@RequestMapping("my")
public class MyController {@RequestMapping("/page1")public String hello() {return "mypage";}}

这样写,首先映射先找到类这一级,然后再在这个类的所有方法里去匹配。

可想而知,这样做的好处:可以抽象的把相似的方法放在同一个类里面,可以更好的理解请求的层次,也避免了写 url 映射的重复。

  • 此外,我们还应注意到 @RequestMapping( { "/page1" , "/page2" } ) 还可以多对一答应映射。

暂时不考虑数据库的连接,我们需要先模拟数据资源

我们定义一个书库,书库里放着很多的书:

  • 为了实现松耦合,我们先为书库定义一个接口:
public interface BookStore {// 返回的最大序号,往前数共要 count 本List<Book> buySomeBooks(int idMax, int count);
}
  • 实现这个接口:
public class BookStoreImpl implements BookStore {private List<Book> books;private int all;// 初始化书库书籍的总量public BookStoreImpl(int all){this.all = all;// 这句千万不要忘记加System.out.println("创建时数组的长度设定:"+all);List<Book> books = new ArrayList<>();this.books=books;// 这句话也不要忘记for (int i=0; i<all; i++){this.books.add(i,new Book(i,"第"+i+"本书"));}System.out.println("第四本书信息:"+ books.get(4).getMessage());}@Override// 实现返回所需书的数量public List<Book> buySomeBooks(int idMax, int count) {System.out.println(count+"   :::: "  +all);if (count<all){System.out.println("返回书库的总量");System.out.println("截取 : " +(idMax-count)+"  :  "+idMax);return this.books.subList(idMax-count,idMax);}else{System.out.println("else");return null;}}
}
  • 编写书实体类
public class Book {private long id;private String message;public Book() {}public Book(long id, String message) {this.id = id;this.message = message;}public long getId() {return id;}public String getMessage() {return message;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Book)) return false;Book book = (Book) o;return getId() == book.getId() &&getMessage().equals(book.getMessage());}@Overridepublic int hashCode() {return Objects.hash(getId(), getMessage());}
}
  • 将上面两个组件都加入 IOC 容器

<bean id="Book" class="com.twm.bookmvc.dto.Book"><constructor-arg value="1"></constructor-arg><constructor-arg value="book"></constructor-arg>
</bean>
<bean id="BookStoreImpl" class="com.twm.bookmvc.BookStore.impl.BookStoreImpl"><constructor-arg value="60" type="int"></constructor-arg>
</bean>

传递模型数据到视图(后端数据前传)

@Controller
@RequestMapping("my")
public class MyController {// 声明书库 注入 书库@Autowiredprivate BookStore bookStore;@RequestMapping("/buyBooks")public String buyBooks(Model model) { // 加入模型// 把数据加入模型属性model.addAttribute("books",bookStore.buySomeBooks(50,20));System.out.println(bookStore.buySomeBooks(50,20));return "buybooks";}
  • 编写前端输入 url 展示传送数据信息的 jsp:
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>买书</title>
</head>
<body>
<h1>买到书了吗?</h1>
........................................<br>
<c:forEach items="${books}" var="books"><c:out value="${books.message}"/><c:out value="${books.id}"/>
</c:forEach></body>
</html>
  • 测试数据资源是否可用:

处理带有请求数据的控制器编写

方式一:请求参数法形如: url  ? a=10&b=20

  • 编写前端jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>分页</title>
</head>
<body>
<h1>分页</h1><form action="../my/showpage">第<input type="text" name="where" value=${where}>页<br>每页显示<input name="everyn" type="text" value=${every}>条<input type="submit" value="跳转"></form>
共${total}页<br>显示<br>
<c:forEach items="${now}" var="now"><li> <c:out value="${now.message}"/></li><li> <c:out value="${now.id}"/></li>
</c:forEach></body>
</html>

显示效果如下,前端会传入 第几页,每页显示几条 这两个参数

  • 写出请求控制器的处理方法
//        查询参数 请求  按前端要求返回数据@RequestMapping("/showpage")public String showpage(@RequestParam(value = "where",defaultValue ="1") int where,@RequestParam(value = "everyn",defaultValue ="10") int every,Model model){System.out.println("进入请求——————");model.addAttribute("now",bookStore.showBooks(where*every-every, where*every));model.addAttribute("total",bookStore.total());model.addAttribute("where",where);model.addAttribute("every",every);return "splitPage";}
  • 补充请求页面的接口,补充实现
 // 返回书的总量int total();// 分页返回的接口List<Book> showBooks(int start, int end);
@Override// 实现返回所需书的数量public List<Book> showBooks(int start, int end) {if (end<all){System.out.println("返回书库的总量");System.out.println("截取 ");return this.books.subList(start,end);}else{System.out.println("else");return null;}}@Overridepublic int total(){return all;}

这里需要注意的是,url 路径不要写错,还有需要确保前后端接口处 名称一定要一致。

方式二:路径参数接收输入 形如:url /1234

这种方法最适合资源的请求方式,因为对于资源来说,我们更习惯用 / 而不是 ?来表达,用于定位单一资源。

  • 编写控制器方法:
//        路径参数参数 请求  按前端要求返回数据@RequestMapping(value = "/{seekone}") // 占位符允许路径作为参数传入public String seekone(@PathVariable("seekone") int id,Model model){model.addAttribute("one",bookStore.seekOne(id));model.addAttribute("total",bookStore.total());return "one";}
  • 补充接口,补充实现
// 查找单个资源Book seekOne(int id);
@Overridepublic Book seekOne(int id){return this.books.get(id);}
  • 编写jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>查找单个信息</h1>
请不要输入超过${total}的数字
<form action="../my/5">您查询书的id是: <input id="id" type="text"><input type="submit" value="提交">
</form>==============显示区==================<br>
书的id是${one.id}
书的消息${one.message}</body>
</html>

注意这里我不知道怎么把id通过输入框加进 url 所以,只能手动的改 action="../my/6"去修改id了.......

  • 测试

完成。

Spring 基础 编写基本的控制器(系列号3)相关推荐

  1. python网络爬虫的基本步骤-黑客基础 编写Python爬虫入门步骤

    原标题:黑客基础 编写Python爬虫入门步骤 信息时代,数据就是宝藏.数据的背后隐含着无穷的宝藏,这些宝藏也许就是信息量所带来的商业价值,而大数据本身也将成为桌面上的筹码. 黑客花无涯 带你走进黑客 ...

  2. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  3. javaweb实训第五天上午——Spring基础

    Spring基础 1.课程介绍 2.为什么需要Spring 3.初识Spring 3.1.什么是Spring 3.2.Spring框架的好处 3.3.Spring框架的模块化 4.Spring入门 4 ...

  4. python爬虫步骤-黑客基础 编写Python爬虫入门步骤

    原标题:黑客基础 编写Python爬虫入门步骤 信息时代,数据就是宝藏.数据的背后隐含着无穷的宝藏,这些宝藏也许就是信息量所带来的商业价值,而大数据本身也将成为桌面上的筹码. 黑客花无涯 带你走进黑客 ...

  5. Spring基础学习(一)

    Spring基础 Spring概述 Spring是框架是一个轻量级的企业级开发的一站式解决方案.所谓解决方案就是可以基于Spring解决JavaEE开发的所有问题.Spring框架主要提供了IOC容器 ...

  6. 零基础玩转C语言系列第一章——初始C语言(上)

    目录 一.如何学好C语言? 1.鼓励你,为你叫好. 2.挤时间学习 3.学好编程,不仅仅是学好C语言 二.初始C语言 本章目标 本章重点 1.什么是C语言? 2.第一个C语言程序 3.数据类型 4.变 ...

  7. 零基础入门微信小程序系列之——校园跑腿

    前段时间在准备校招的事情,没有太多经历给大家分享博客和视频.最近校招已经尘埃落定,在策划一个零基础入门小程序的系列视频,在某站持续输出. 小程序的主要功能与微信目前线上的校园跑跑乐同步. 从0开始编写 ...

  8. spring基础-1

    Spring概述(了解) Spring是什么 Spring是 Java 应用 full-stack 轻量级开源框架. Spring的核心是 IOC(Inverse Of Control:控制反转)和 ...

  9. Spring基础专题——第五章(Aop代理)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

最新文章

  1. SQL Server 2008创建数据库
  2. 传递给系统调用的数据区域太小怎么解决_40张图看懂分布式追踪系统原理及实践...
  3. 因为此版本的应用程序不支持其项目类型(.vcproj)的解决方法
  4. python【蓝桥杯vip练习题库】ADV-181质因数2(短除法)
  5. Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
  6. ubuntu下面解决mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists
  7. PIC32单片机harmony开发环境 - SPI例程和代码分析
  8. 探索篇 | 接口字段容错测试(三)
  9. linux weblogic修改内存,在linux运行weblogic出现运行内存不足错误,求鞭挞....
  10. python之穿越火线游戏代码_Python 大作业之五子棋游戏(附代码)
  11. 数据结构-1-顺序表的实现
  12. C++内存管理之shared_ptr
  13. 【Excel中阶技巧】表结构、函数、数据验证、导入导出、透视表、Power Pivot、其他技巧
  14. Centos7解决不能上网问题
  15. 【jzoj 4727】【NOIP2015模拟10.28B组】终章-剑之魂 {贪心}
  16. Adguard Home最低DNS处理时间配置
  17. CCF: 201409-1-相邻数对(C++)
  18. python在手机使用webdriver.chromns_Selenium +Chrome浏览器如何模拟手机操作
  19. struts中文乱码解决方法详解
  20. Moving.............

热门文章

  1. java class实例化对象_使用Class对象实例化Java类型参数/ generic
  2. linux进程闭锁,4. ps 进程查看器
  3. linux下性能测试mon,Linux性能评测工具之一:nmon篇
  4. java容易搞混的技术_Java中比较容易混淆的知识点
  5. java非负数校验_JavaScript正则表达式校验非负整数实例
  6. Linux中安装oracle
  7. 这可能是最好的RxJava 2.x 入门教程学习系列
  8. 基于JAVA+Servlet+JSP+MYSQL的停车管理系统
  9. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_05 List集合_4_Vector集合
  10. 子集生成-增量构造法||位向量法