使用SpringMVC进行CRUD小练习

文章目录

    • 返回值的设置
      • 返回String
        • 返回String**默认情况**
        • 显示转发
        • 显示重定向
      • 返回值是ModelAndView类型
        • 返回modelAndView的**默认情况**
        • 显示转发
        • 显示重定向
    • 源码解析:目标方法返回值最终都被封装成为ModelAndView
    • 数据在域中的保存
      • Request对象中保存数据
      • Session域中保存数据
      • ServletContext域中保存数据
      • Map或Model或ModelMap形式保存数据在request域中
      • ModelAndView方式保存数据到request域中
      • @SessionAttributes保存数据到Session域中(**了解内容**)
      • @ModelAttribute注解
    • 传统的增删改查
      • **准备单表的数据库**
      • SpringMVC的单表的增,删,改,查

返回值的设置

返回String

返回String默认情况

@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"; }

返回值是ModelAndView类型

返回modelAndView的默认情况

 @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;
}

源码解析:目标方法返回值最终都被封装成为ModelAndView

在Controller中 目标方法不管是返回String.还是返回ModelAndView,最后都会封装成为 ModelAndView返回 !!!

以下代码是调用目标方法 , 并将返回值封装成为ModeAndView的内容
使用SpringMVC进行CRUD小练习_第1张图片使用SpringMVC进行CRUD小练习_第2张图片ModelAndViewContainer 是用来接收 Controller 方法的返回值 和 Mode l( 页面渲染的数据 ) 的容器

数据在域中的保存

Request对象中保存数据

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>

Session域中保存数据

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/>

ServletContext域中保存数据

在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/>

Map或Model或ModelMap形式保存数据在request域中

在四个域中,我们使用最频繁的域就是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"; }

ModelAndView方式保存数据到request域中

@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 注解可以标注在类上。它的作用是指定隐含模型中哪些数据可以保存到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这个注解可以标注在方法和参数上。
@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;

SpringMVC的单表的增,删,改,查

使用SpringMVC进行CRUD小练习_第3张图片
需要导入的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进行CRUD小练习_第4张图片
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进行CRUD小练习_第5张图片
配置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页面
使用SpringMVC进行CRUD小练习_第6张图片
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>/*

图书删除功能的实现

给删除添加请求地址:
使用SpringMVC进行CRUD小练习_第7张图片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标签添加一个删除样式:
使用SpringMVC进行CRUD小练习_第8张图片给删除的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页面
给 [ 修改 ] 连接添加请求地址:
使用SpringMVC进行CRUD小练习_第9张图片
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";
}

你可能感兴趣的:(SSM,SpringMVC)