@RequestMapping(value = "/fun1")
public String fun1(){
System.out.println("fun1() 被调用了");
/**
* 默认的情况下. 返回String类型,SpringMVC会看有没有视图解析器
* 1 如果没有视图解析器,那么需要返回完整的跳转路径
* 2 如果有视图解析器,那么只需要返回视图名即可(视图名就是文件名,不包含后缀名)
* 3 通过观察浏览器地址,发现.SpringMVC底层默认使用的是**请求转发**
*/
return "ok";
}
@RequestMapping(value = "/funForward")
public String funForward(){
System.out.println(" funForward() ");
/**
* 如何显示地要求返回结果必须以请求转发的方式进行处理结果
* 1 在返回前面写上字符串 ==>> forward:
* 2 在 forward: 后面写上跳转路径的全路径 ( 非只有视图名 )
* 3 显示的请求转发,后面的路径,是不会和视图解析器的前后缀做拼接处理.而是直接使用
* 4 显示请求转发后面的路径分为相对路径和绝对路径
* 4.1 以斜杠打头的路径是绝对路径,其他是相对路径
* 4.2 开发的时候都只使用绝对路径
* 5 相对路径 : forward:pages/ok.jsp
* 5.1 相对路径在工作的时候会参照当前请求地址
* 正常的情况:
* 当前请求地址: http://localhost:8080/21_springmvc_web02/funForward
* 参照当前请求地址后路径是: http://localhost:8080/21_springmvc_web02/pages/ok.jsp
* 错误的情况:
* 当前请求地址: http://localhost:8080/21_springmvc_web02/return/funForward
* 参照当前请求地址后路径是: http://localhost:8080/21_springmvc_web02/return/pages/ok.jsp
* 6 绝对路径 : forward:/pages/ok.jsp
* 绝对路径解析为跳转路径是: http://localhost:8080/21_springmvc_web02/pages/ok.jsp
*/
return "forward:/pages/ok.jsp";
}
@RequestMapping(value = "/funRedirect")
public String funRedirect(){
System.out.println(" funRedirect() 显示重定向 ");
/**
* 显示重定向
* 1 只需要在 返回值前面加 redirect: 即可表示 要求返回的路径是重定向进行处理
* 2 在 redirect: 后面要路径完整的跳转路径 ( 不仅是视图名 )
* 3 显示的请求重定向 , 后面的路径,是不会和视图解析器的前后缀做拼接处理.而是直接使用
* 4 显示 请求重定向 发后面的路径分为相对路径和绝对路径
* 4.1 以斜杠打头的路径是绝对路径,其他是相对路径
* 4.2 开发的时候都只使用绝对路径
* 5 相对路径 : redirect:pages/ok.jsp
* 5.1 相对路径在工作的时候,要参照当前请求的路径
* 5.2 错误的情况
* 当前请求地址: http://localhost:8080/21_springmvc_web02/return/funRedirect
* 得到的路径是: http://localhost:8080/21_springmvc_web02/return/pages/ok.jsp
* 5.3 正确的情况:
* 当前请求地址: http://localhost:8080/21_springmvc_web02/funRedirect
* 当前请求地址: http://localhost:8080/21_springmvc_web02/pages/ok.jsp
* 6 绝对路径 : redirect:/pages/ok.jsp
* 6.1 得到正确的跳转路径 http://localhost:8080/21_springmvc_web02/pages/ok.jsp
* 7 在 SpringMVC中重定向第一个斜杠和javaWeb的response.sendRedirect("/");的第一个斜表示不同
* 7.1 response.sendRedirect("/") ===表示>>> http://ip:port/
* 7.2 在SpringMVC中 redirect:/pages/ok.jsp ===表示>>> http://ip:port/工程路径/
*/
return "redirect:/pages/ok.jsp";
}
@RequestMapping(value="/mav")
public ModelAndView mav(){
System.out.println(" mav() 调用了 ");
ModelAndView modelAndView = new ModelAndView("/pages/ok.jsp");
/**
* 在返回值是ModelAndView中如何设置跳转路径
* 1 调用 setViewName() 方法设置返回的视图名
* 1.1 如果有解析器 只需要设置视图名 ==>> modelAndView.setViewName("ok");
* 1.2 如果没有视图解析器 需要设置完整的路径 ==>>modelAndView.setViewName("/pages/ok.jsp");
* 2 可以在 ModelAndView 构造器方法中直接传入返回值
* 示例: new ModelAndView("/pages/ok.jsp");
* 3 SpringMVC对ModelAndView返回类型默认是以请求转发来处理跳转
*/
// modelAndView.setViewName("/pages/ok.jsp");
return modelAndView;
}
@RequestMapping(value = "/mavForward")
public ModelAndView mavForward(){
// ModelAndView 中显示请求转发 和 返回String类型显示转发 作用一样( 使用也一样 )
ModelAndView modelAndView = new ModelAndView("forward:/pages/ok.jsp");
System.out.println(" mavForward() 调用了 ");
return modelAndView;
}
@RequestMapping(value = "/mavRedirect")
public ModelAndView mavRedirect(){
// 在 ModelAndView 中显示重定向和返回String类型显示重定向作用一样 ( 使用也一样 )
ModelAndView modelAndView = new ModelAndView("redirect:/pages/ok.jsp");
System.out.println(" mavForward() 调用了 ");
return modelAndView;
}
在Controller中 目标方法不管是返回String.还是返回ModelAndView,最后都会封装成为 ModelAndView返回 !!!
以下代码是调用目标方法 , 并将返回值封装成为ModeAndView的内容
ModelAndViewContainer 是用来接收 Controller 方法的返回值 和 Mode l( 页面渲染的数据 ) 的容器
Controller 中的 代码 :
@Controller
public class ScopeController {
@RequestMapping(value = "/requestScope")
public String requestScope(HttpServletRequest request){
System.out.println(" requestScope() 方法调用了 ");
// 往Request域中保存数据
request.setAttribute("reqKey1", "reqValue1");
request.setAttribute("reqKey2", "reqValue2");
return "ok";
}
}
jsp页面的输出:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
请求成功!!! <br/>
<br/>
request域中的 reqKey1 数据 => ${
requestScope.reqKey1 } <br/>
request域中的 reqKey2 数据 => ${
requestScope.reqKey2 } <br/>
</body>
</html>
Controller 中的 方法:
@RequestMapping(value = "/sessionScope")
public String sessionScope(HttpSession session){
System.out.println(" sessionScope() 方法调用了 ");
// 往 HttpSession 域中保存数据
session.setAttribute("sessionKey1", "sessionValue1");
session.setAttribute("sessionKey2", "sessionValue2");
return "ok";
}
jsp页面的输出:
session 域中的 sessionKey1 数据 => ${
sessionScope.sessionKey1 } <br/>
session 域中的 sessionKey2 数据 => ${
sessionScope.sessionKey2 } <br/>
在Controller中的代码。在Controller的中获取SerlvetContext对象有两种方法,
一种是@Autowired注入,
@Autowired
ServletContext servletContext;
@RequestMapping(value = "/servletContextScope")
public String servletContextScope(){
System.out.println(" servletContextScope() 方法调用了 ");
// 往 HttpSession 域中保存数据
servletContext.setAttribute("servletContextKey1", "servletContextValue1");
servletContext.setAttribute("servletContextKey2", "servletContextValue2");
return "ok";
}
二种是通过Session获取。
@RequestMapping(value = "/servletContextScope")
public String servletContextScope(HttpSession session){
System.out.println(" servletContextScope() 方法调用了 ");
ServletContext servletContext = session.getServletContext();
// 往 HttpSession 域中保存数据
servletContext.setAttribute("servletContextKey1", "servletContextValue1");
servletContext.setAttribute("servletContextKey2", "servletContextValue2");
return "ok";
}
jsp页面的输出 :
<br>
ServletContext 域中的 servletContextKey1 数据 => ${
applicationScope.servletContextKey1 } <br/>
ServletContext 域中的 servletContextKey2 数据 => ${
applicationScope.servletContextKey2 } <br/>
在四个域中,我们使用最频繁的域就是request对象。往request域对象中,保存数据,还在以下的几种形式。
我们可以在Controller的方法中,添加Map类型的参数,或者是Model类型的参数。或者是ModelMap类型的参数。都可以直接用来保存域数据到Request对象中。
Map全类名是: java.util.Map
@RequestMapping(value = "/mapToRequest")
public String mapToRequest(Map<String,Object> map){
System.out.println(" mapToRequest() 方法调用了 ");
// 我们把数据保存到Map中,这些数据也会自动的保存到Reqeust域中.
map.put("mapKey1", "mapValue1");
map.put("mapKey2", "mapValue2");
return "ok";
}
Model全类名是: org.springframework.ui.Model
@RequestMapping(value = "/modelToRequest")
public String modelToRequest(Model model){
System.out.println(" modelToRequest() 方法调用了 ");
// 我们把数据保存到 model 中,这些数据也会自动的保存到Reqeust域中.
model.addAttribute("modelKey1", "modelValue1");
model.addAttribute("modelKey2", "modelValue2");
return "ok";
}
ModelMap全类名是: org.springframework.ui.ModelMap
@RequestMapping(value = "/modelMapToRequest")
public String modelMapToRequest(ModelMap modelMap){
System.out.println(" modelMapToRequest() 方法调用了 ");
// 我们把数据保存到 model 中,这些数据也会自动的保存到Reqeust域中.
modelMap.addAttribute("modelMapKey1", "modelMapValue1");
modelMap.addAttribute("modelMapKey2", "modelMapValue2");
return "ok";
}
隐含模型对象 :
/**
* 不管你是Map,还是Model,还是ModelMap,他们都是 BindingAwareModelMap 类
* class org.springframework.validation.support.BindingAwareModelMap
* /\
* ||
* ||
* BindingAwareModelMap extends ExtendedModelMap
* /\
* ||
* ||
* ExtendedModelMap extends ModelMap implements Model
* /\
* ||
* ||
* ModelMap extends LinkedHashMap
*
*
* BindingAwareModelMap 类是隐含模型对象!!!
* BindingAwareModelMap 隐含模型中一般都用来保存 视图渲染时 需要的数据
* 视图 就是页面 ( jsp页面 )
* 渲染 执行
*/
@RequestMapping(value = "/mapAndModelAndModelMap")
public String mapAndModelAndModelMap( Map map , Model model , ModelMap modelMap ){
// org.springframework.validation.support.BindingAwareModelMap
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
map.put("mapKey1", "mapValue1");
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
model.addAttribute("modelKey1", "modelValue1");
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
modelMap.addAttribute("modelMapKey1", "modelMapValue1");
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
System.out.println( map.getClass() );
System.out.println( model.getClass() );
System.out.println( modelMap.getClass() );
return "ok";
}
@RequestMapping(value = "/modelAndViewToReqeust")
public ModelAndView modelAndViewToReqeust(){
ModelAndView modelAndView = new ModelAndView("ok");
//使用 ModelAndView 返回值保存数据到 Reqeuat 域中
modelAndView.addObject("mavKey1", "mavValue1");
modelAndView.addObject("mavKey2", "mavValue2");
return modelAndView;
}
@SessionAttributes 注解可以标注在类上。它的作用是指定隐含模型中哪些数据可以保存到Session域中。
@SessionAttributes(value = { “key1”,“key2” }, types = { String.class, Book.class })
value属性,它表示把request域中key为key1,key2的键值对信息,也保存到Session中
types属性,它表示把request域中value类型为String.class或Book.class类型的键值对,也保存到Session中
/**
* @SessionAttributes 可以指定哪些隐含模型中的数据也同步保存到Session域中
* names 属性设置哪些 key 数据保存到Session中
* types 属性设置哪些类型的 value 属性也同步到Session中
*/
@SessionAttributes(types = {
Integer.class,String.class})
@Controller
public class ScopeController {
@RequestMapping(value = "/sessionAttrubute")
public String sessionAttrubute(Map<String,Object> map){
System.out.println(" sessionAttrubute() 方法调用了 ");
// 我们把数据保存到Map中,这些数据也会自动的保存到Reqeust域中.
map.put("mapKey1", "字符串类型");
map.put("mapKey2", new Integer(100));
return "ok";
}
}
@ModelAttribute这个注解可以标注在方法和参数上。
@ModelAttribute三个常见作用:
1、被标注了@ModelAttribute的方法都会在Controller的目标方法之前执行。
2、目标方法的参数(JavaBean对象)会先从隐含模型中获取值传入。( 参数会覆盖隐含模型中的值 )
3、被标注在参数上,参数值会按照指定的key从隐含模型中获取值。
@ModelAttribute
public void modelAttributeFun( Map<String,Object> map ){
// 可以为目标方法准备数据
System.out.println(" modelAttributeFun() 方法被调用了 ");
map.put("book1",new Book(100,"国哥,为什么你这么帅,帅的不要不要的!"));
}
/**
* 目标方法的参数,如果是JavaBean,SpringMVC会先把这个参数的类型
* 取类名Book,然后首字母小写.然后到隐含模型中取值传入
*/
@RequestMapping(value = "/target")
public String target( @ModelAttribute("book1") Book book){
System.out.println(" target() 方法调用了 =====>>>> " + book);
return "ok";
}
drop database if exists springmvc;
create database springmvc;
use springmvc;
##创建图书表
create table t_book(
`id` int(11) primary key auto_increment, ## 主键
`name` varchar(50) not null, ## 书名
`author` varchar(50) not null, ## 作者
`price` decimal(11,2) not null, ## 价格
`sales` int(11) not null, ## 销量
`stock` int(11) not null ## 库存
);
## 插入初始化测试数据
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'java从入门到放弃' , '国哥' , 80 , 9999 , 9);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '数据结构与算法' , '严敏君' , 78.5 , 6 , 13);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '怎样拐跑别人的媳妇' , '龙伍' , 68, 99999 , 52);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '木虚肉盖饭' , '小胖' , 16, 1000 , 50);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'C++编程思想' , '刚哥' , 45.5 , 14 , 95);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '蛋炒饭' , '周星星' , 9.9, 12 , 53);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '赌神' , '龙伍' , 66.5, 125 , 535);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'Java编程思想' , '阳哥' , 99.5 , 47 , 36);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'JavaScript从入门到精通' , '婷姐' , 9.9 , 85 , 95);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'cocos2d-x游戏编程入门' , '国哥' , 49, 52 , 62);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'C语言程序设计' , '谭浩强' , 28 , 52 , 74);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'Lua语言程序设计' , '雷丰阳' , 51.5 , 48 , 82);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '西游记' , '罗贯中' , 12, 19 , 9999);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '水浒传' , '华仔' , 33.05 , 22 , 88);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '操作系统原理' , '刘优' , 133.05 , 122 , 188);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '数据结构 java版' , '封大神' , 173.15 , 21 , 81);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'UNIX高级环境编程' , '乐天' , 99.15 , 210 , 810);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , 'javaScript高级编程' , '国哥' , 69.15 , 210 , 810);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '大话设计模式' , '国哥' , 89.15 , 20 , 10);
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock`)
values(null , '人月神话' , '刚哥' , 88.15 , 20 , 80);
## 查看表内容
select id,name,author,price,sales,stock from t_book;
需要导入的jar包有:
druid-1.1.9.jar
junit_4.12.jar
mysql-connector-java-5.1.37-bin.jar
org.hamcrest.core_1.3.0.jar
spring-aop-5.2.5.RELEASE.jar
spring-beans-5.2.5.RELEASE.jar
spring-context-5.2.5.RELEASE.jar
spring-core-5.2.5.RELEASE.jar
spring-expression-5.2.5.RELEASE.jar
spring-jcl-5.2.5.RELEASE.jar
spring-jdbc-5.2.5.RELEASE.jar
spring-orm-5.2.5.RELEASE.jar
spring-test-5.2.5.RELEASE.jar
spring-tx-5.2.5.RELEASE.jar
spring-web-5.2.5.RELEASE.jar
spring-webmvc-5.2.5.RELEASE.jar
在src目录下记得配置 jdbc.properties属性配置文件:
SpringMVC的配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com"></context:component-scan>
<!--
配置视图解析器
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/book/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 加载jdbc.properties属性配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${user}" />
<property name="password" value="${password}" />
<property name="url" value="${url}" />
<property name="driverClassName" value="${driverClassName}" />
<property name="initialSize" value="${initialSize}" />
<property name="maxActive" value="${maxActive}" />
</bean>
<!-- 配置用于执行sql语句的jdbcTemplate工具类 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
web.xml中的配置内容如下:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
创建实体bean对象
public class Book {
private Integer id;
private String name;
private String author;
private BigDecimal price;
private Integer sales;
private Integer stock;
创建BookDao以及测试
@Repository
public class BookDao {
@Autowired
JdbcTemplate jdbcTemplate;
public int saveBook(Book book) {
String sql = "insert into t_book( `name`,`author`,`price`,`sales`,`stock`) values(?,?,?,?,?)";
return jdbcTemplate.update(sql, book.getName(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock());
}
public int deleteBookById(Integer id) {
String sql = "delete from t_book where id = ?";
return jdbcTemplate.update(sql, id);
}
public int updateBook(Book book) {
String sql = "update t_book set `name`=?,`author`=?,`price`=?,`sales`=?,`stock`=? where id = ?";
return jdbcTemplate.update(sql, book.getName(), book.getAuthor(),
book.getPrice(), book.getSales(), book.getStock(), book.getId());
}
public Book queryBookById(Integer id){
String sql = "select `name`,`author`,`price`,`sales`,`stock`,`id` from t_book where id = ?";
return jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class), id );
}
public List<Book> queryBooks(){
String sql = "select `name`,`author`,`price`,`sales`,`stock`,`id` from t_book";
return jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class));
}
}
创建BookService以及测试
@Service
public class BookService {
@Autowired
BookDao bookDao;
public void saveBook(Book book){
bookDao.saveBook(book);
}
public void deleteBookById(Integer id){
bookDao.deleteBookById(id);
}
public void updateBook(Book book){
bookDao.updateBook(book);
}
public Book queryBookById(Integer id){
return bookDao.queryBookById(id);
}
public List<Book> queryBooks(){
return bookDao.queryBooks();
}
}
拷贝CRUD页面到WebContent目录下
从SpringMVC第二个的目录里,笔记目录中的CRUD目录
配置springMVC的视图解析器到springmvc.xml配置文件中
<!--
配置视图解析器
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/book/" />
<property name="suffix" value=".jsp" />
</bean>
图书列表功能的实现
需要导入JSTL标签库的jar包:
taglibs-standard-impl-1.2.1.jar
taglibs-standard-spec-1.2.1.jar
BookController控制器:
@RequestMapping("/book")
@Controller
public class BookController {
@Autowired
BookService bookService;
@RequestMapping(value = "/list")
public String list(Map map){
// 查询全部图书
List<Book> books = bookService.queryBooks();
// 保存到Request域中
map.put("books", books);
// 请求转发到/book/bookList.jsp页面
return "bookList";
}
}
bookList.jsp页面的代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>图书列表</title>
<%
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ request.getServerPort()
+ request.getContextPath()
+ "/";
%>
<base href="<%=basePath %>" />
<style type="text/css">
table {
border: 1px blue solid;
width: 700px;
border-collapse: collapse;
}
td,th{
border: 1px green solid;
}
div.menu {
width: 700px;
text-align: right;
}
</style>
</head>
<body>
<center>
<h2>图书列表管理页面</h2>
<div class="menu"><a href="${pageContext.request.contextPath}/book/bookEdit.jsp">添加图书</a></div>
<table>
<tr bgcolor="#FF8888">
<th>书名</th>
<th>作者</th>
<th>价格</th>
<th>销量</th>
<th>库存</th>
<th>操作</th>
</tr>
<%--
forEach 遍历list集合
items 是当前遍历的数据源
var 是当前遍历到的数据
--%>
<c:forEach items="${requestScope.books}" var="book">
<tr>
<td>${
book.name}</td>
<td>${
book.author}</td>
<td>${
book.price}</td>
<td>${
book.sales}</td>
<td>${
book.stock}</td>
<td><a href="#">删除</a>、<a href="#">修改</a></td>
</tr>
</c:forEach>
</table>
</center>
</body>
</html>
图书添加功能的实现
bookEdit.jsp页面
BookController代码:
@RequestMapping(value = "/save")
public String save(Book book){
// 保存图书信息
bookService.saveBook(book);
// 重定向回图书列表管理页面
return "redirect:/book/list";
}
解决post请求中文乱码,只需要在web.xml中做以下配置即可:
<!--
配置过滤器解决post请求中文乱码
-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*
图书删除功能的实现
给删除添加请求地址:
BookController中的代码:
@RequestMapping(value = "/delete")
public String delete(Integer id){
// 调用bookService.deleteBookById()删除图书
bookService.deleteBookById(id);
// 重定向回图书列表管理页面
return "redirect:/book/list";
}
SpringMVC默认情况下.是不支持处理静态资源的.
为什么默认不支持静态资源.
由于我们在WEB.xml 配置文件中 给前端控制器配置的请求路径是 : /
这个路径 和 Tomcat 服务器 提供的一个静态资源处理的DefaultServlet程序相冲突.
导致 Tomcat 服务器 失去了对静态资源处理的能力.
如何解决SpringMVC处理静态 资源问题:
<!--
使用SpringMVC开发项目.必须加上以下两个配置
SpringMVC标配
允许SpringMVC支持静态资源的处理( 重启才能生效 )
-->
<mvc:default-servlet-handler />
<!--
配置处理SpringMVC高级功能
-->
<mvc:annotation-driven></mvc:annotation-driven>
给删除的a标签添加一个删除样式:
给删除的a标签绑定单击事件:
$(function () {
// alert("页面加载完成之后!!!");
// 给删除的a标签绑定单击事件
$("a.deleteAClass").click(function () {
// 通过删除的a标签,获取两次父元素.得到tr标签对象
let name = $(this).parent().parent().find("td:first").text();
return confirm(" 你确定要删除[ " + name + " ]吗? ");
// // 阻止元素默认行为
// return false;
});
});
图书更新功能的实现
第一步:点击 [修改] 超连接,把需要更新的图书信息,填充到bookEdit.jsp页面
给 [ 修改 ] 连接添加请求地址:
BookController控制 中的方法:
@RequestMapping(value = "/queryBookById")
public String queryBookById(Integer id,Map<String,Object> map){
// 调用bookService.queryBookById查询图书, 并且保存到Request域中
map.put("book",bookService.queryBookById(id));
// 请求转发到 /book/bookEdit.jsp页面
return "bookEdit";
}
bookEdit.jsp页面回显数据:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>图书列表</title>
<%
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ request.getServerPort()
+ request.getContextPath()
+ "/";
%>
<base href="<%=basePath %>" />
</head>
<body>
<center>
<h3>添加图书</h3>
<%--
使用GET请求没有中文乱码
--%>
<form action="${pageContext.request.contextPath}/book/save">
<table>
<tr>
<td>书名</td>
<td><input name="name" type="text"
value="${requestScope.book.name}"/></td>
</tr>
<tr>
<td>作者</td>
<td><input name="author" type="text"
value="${requestScope.book.author}"/></td>
</tr>
<tr>
<td>价格</td>
<td><input name="price" type="text"
value="${requestScope.book.price}"/></td>
</tr>
<tr>
<td>销量</td>
<td><input name="sales" type="text"
value="${requestScope.book.sales}"/></td>
</tr>
<tr>
<td>库存</td>
<td><input name="stock" type="text"
value="${requestScope.book.stock}"/></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" />
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
第二步:提交数据给服务器确认修改
bookEdit.jsp页面的内容:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>图书列表</title>
<%
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ request.getServerPort()
+ request.getContextPath()
+ "/";
%>
<base href="<%=basePath %>" />
</head>
<body>
<center>
<h3>添加图书</h3>
<%--
使用GET请求没有中文乱码
--%>
<form action="${pageContext.request.contextPath}/book/${empty param.id ? 'save' : 'update'}">
<%--添加图书的编号--%>
<input type="hidden" name="id" value="${requestScope.book.id}" />
<table>
<tr>
<td>书名</td>
<td><input name="name" type="text"
value="${requestScope.book.name}"/></td>
</tr>
<tr>
<td>作者</td>
<td><input name="author" type="text"
value="${requestScope.book.author}"/></td>
</tr>
<tr>
<td>价格</td>
<td><input name="price" type="text"
value="${requestScope.book.price}"/></td>
</tr>
<tr>
<td>销量</td>
<td><input name="sales" type="text"
value="${requestScope.book.sales}"/></td>
</tr>
<tr>
<td>库存</td>
<td><input name="stock" type="text"
value="${requestScope.book.stock}"/></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" />
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
BookController中的代码:
@RequestMapping(value = "/update")
public String update(Book book){
// 调用bookService.save() 保存图书修改
bookService.updateBook(book);
// 重定向回图书列表管理页面
return "redirect:/book/list";
}