Spring 基础 编写基本的控制器(系列号3)
回顾
前面我们已经搭建好了一个基于 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)相关推荐
- python网络爬虫的基本步骤-黑客基础 编写Python爬虫入门步骤
原标题:黑客基础 编写Python爬虫入门步骤 信息时代,数据就是宝藏.数据的背后隐含着无穷的宝藏,这些宝藏也许就是信息量所带来的商业价值,而大数据本身也将成为桌面上的筹码. 黑客花无涯 带你走进黑客 ...
- Spring IOC 容器源码分析系列文章导读 1
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- javaweb实训第五天上午——Spring基础
Spring基础 1.课程介绍 2.为什么需要Spring 3.初识Spring 3.1.什么是Spring 3.2.Spring框架的好处 3.3.Spring框架的模块化 4.Spring入门 4 ...
- python爬虫步骤-黑客基础 编写Python爬虫入门步骤
原标题:黑客基础 编写Python爬虫入门步骤 信息时代,数据就是宝藏.数据的背后隐含着无穷的宝藏,这些宝藏也许就是信息量所带来的商业价值,而大数据本身也将成为桌面上的筹码. 黑客花无涯 带你走进黑客 ...
- Spring基础学习(一)
Spring基础 Spring概述 Spring是框架是一个轻量级的企业级开发的一站式解决方案.所谓解决方案就是可以基于Spring解决JavaEE开发的所有问题.Spring框架主要提供了IOC容器 ...
- 零基础玩转C语言系列第一章——初始C语言(上)
目录 一.如何学好C语言? 1.鼓励你,为你叫好. 2.挤时间学习 3.学好编程,不仅仅是学好C语言 二.初始C语言 本章目标 本章重点 1.什么是C语言? 2.第一个C语言程序 3.数据类型 4.变 ...
- 零基础入门微信小程序系列之——校园跑腿
前段时间在准备校招的事情,没有太多经历给大家分享博客和视频.最近校招已经尘埃落定,在策划一个零基础入门小程序的系列视频,在某站持续输出. 小程序的主要功能与微信目前线上的校园跑跑乐同步. 从0开始编写 ...
- spring基础-1
Spring概述(了解) Spring是什么 Spring是 Java 应用 full-stack 轻量级开源框架. Spring的核心是 IOC(Inverse Of Control:控制反转)和 ...
- Spring基础专题——第五章(Aop代理)
前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...
最新文章
- SQL Server 2008创建数据库
- 传递给系统调用的数据区域太小怎么解决_40张图看懂分布式追踪系统原理及实践...
- 因为此版本的应用程序不支持其项目类型(.vcproj)的解决方法
- python【蓝桥杯vip练习题库】ADV-181质因数2(短除法)
- Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
- ubuntu下面解决mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists
- PIC32单片机harmony开发环境 - SPI例程和代码分析
- 探索篇 | 接口字段容错测试(三)
- linux weblogic修改内存,在linux运行weblogic出现运行内存不足错误,求鞭挞....
- python之穿越火线游戏代码_Python 大作业之五子棋游戏(附代码)
- 数据结构-1-顺序表的实现
- C++内存管理之shared_ptr
- 【Excel中阶技巧】表结构、函数、数据验证、导入导出、透视表、Power Pivot、其他技巧
- Centos7解决不能上网问题
- 【jzoj 4727】【NOIP2015模拟10.28B组】终章-剑之魂 {贪心}
- Adguard Home最低DNS处理时间配置
- CCF: 201409-1-相邻数对(C++)
- python在手机使用webdriver.chromns_Selenium +Chrome浏览器如何模拟手机操作
- struts中文乱码解决方法详解
- Moving.............
热门文章
- java class实例化对象_使用Class对象实例化Java类型参数/ generic
- linux进程闭锁,4. ps 进程查看器
- linux下性能测试mon,Linux性能评测工具之一:nmon篇
- java容易搞混的技术_Java中比较容易混淆的知识点
- java非负数校验_JavaScript正则表达式校验非负整数实例
- Linux中安装oracle
- 这可能是最好的RxJava 2.x 入门教程学习系列
- 基于JAVA+Servlet+JSP+MYSQL的停车管理系统
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_05 List集合_4_Vector集合
- 子集生成-增量构造法||位向量法