JavaWeb框架-SpringMVC-2-增删改查

本文详细介绍使用SpringMVC框架实现基本的增删改查(CURD)功能,包括环境搭建、模型定义、控制器设计、页面展示等步骤,并解决了中文乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话说

各位读者,中午好!前面一篇博客介绍了SpringMVC环境搭建及参数传递,熟悉这个后,实现增删改查(CURD)就很简单了。今天目标就是实现一个非常简单的CURD.

目标


1、根据get或者post请求,来选择调用方法
2、使用自带过滤器处理中文乱码
3、重定向


目录


一、整体布局
二、环境配置
三、model
四、controller
五、页面
六、总结


今天目标比较简单,博客也不会很长。知识很基础,很基础。开发环境:
IntelliJ IDEA(2017.2.5)

一、整体布局

这里写图片描述

效果图:

这里写图片描述

不高大上,但绝对可以说明问题。

二、环境配置

1、pom.xml
2、web.xml
3、springmvc-servlet.xml

1、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.hmc.springmvc</groupId>
  <artifactId>springmvc03</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>springmvc03 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--导入spring context-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.1.RELEASE</version>
    </dependency>


    <!--导入spring mvc-->

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.1.RELEASE</version>
    </dependency>

    <!--导入jstl-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>


  </dependencies>
  <build>
    <finalName>springmvc03</finalName>
  </build>
</project>

这里没什么变化,和上一篇博客一样。

2、web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置spring mvc核心-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <!--配置字符过滤器-->

  <filter>
    <filter-name>encoding</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>
  </filter>

  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

这里略微有点变化,加了字符过滤器,你发现了么?

3、springmvc-servlet.xml

<?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
                http://www.springframework.org/schema/context/spring-context.xsd">


    <!--开启扫描注解-->
    <context:component-scan base-package="com.hmc.springmvc"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/Book/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

这里无变化。

三、model

这里仅做功能演示,就没有结合数据库,字段就少咯,能说明问题就好。

Book

package com.hmc.springmvc.model;

/**
 * User:Meice
 * 2017/11/12
 */
public class Book {
    private int id;
    private String name;
    public Book(){}
    public Book(int id,String name) {

        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

四、controller

BookController

package com.hmc.springmvc.controller;

import com.hmc.springmvc.model.Book;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.filter.CharacterEncodingFilter;

import java.util.HashMap;
import java.util.Map;


/**
 * User:Meice
 * 2017/11/11
 */

/**
 * 演示spring mvc如何针对性的处理get post请求
 */
@Controller
@RequestMapping("/book")
public class BookController {
    Map<Integer,Book> books;

    public  BookController( ) {
        Book book1 = new Book(1,"《天龙八部》");
        Book book2 = new Book(2,"《笑傲江湖》");
        Book book3 = new Book(3,"《神雕侠侣》");
        books = new HashMap<Integer, Book>();
        books.put(book1.getId(),book1);
        books.put(book2.getId(),book2);
        books.put(book3.getId(),book3);
    }

    @RequestMapping("list.htm")
    public String list(Model model) {
       model.addAttribute("books",books);
        return "list";
    }

    /**
     * 接收连接传递过来的get请求
     * 跳转到/WEB-INF/Book/add.jsp
     * @return
     */

    @RequestMapping(value = "/add.htm",method = RequestMethod.GET)
    public String add() {
        return "add";
    }

    /**
     * 执行保存操作
     */
    @RequestMapping(value = "/add.htm",method = RequestMethod.POST)
    public String add(Book book) {
        books.put(book.getId(),book);
        return "redirect:list.htm";
    }

    /**
     * 执行结果:
     * 1--《天龙八部》 2--《笑傲江湖》 3--《神雕侠侣》 4--穿着绿色的军装
     * 中文乱码如何处理?
     *
     * 框架自带一个过滤器类,CharacterEncodingFilter 过滤器
     * 注意,过滤器要给一个初始化参数encoding,观察源码就会发现,是根据我们初始化值来做的,
     * 而且初始化名字就要是encoding,跟属性保持一致:private String encoding;
     * 运行结果:
     * 1--《天龙八部》 2--《笑傲江湖》 3--《神雕侠侣》 5--《为什么活着》 6--北京爱情故事
     */

    /**
     * 之前我们在struts2里面处理这个,也是用的重定向
     * 用的是result里面的type属性
     * 如果不重定向,就会直接去/WEB-INF/Book/下面去找对应的页面,我们
     * 这里如果不重定向,就会去找list.htm这个页面,我们需要的是重新调用list方法
     * 所以,地址栏要变动
     */


    /**
     * 跳转到修改页面
     */
    @RequestMapping(value = "update.htm",method = RequestMethod.GET)
    public String update(int id,Model model) {
        //接收参数
      Book book =  books.get(id);
      //传递值
        model.addAttribute("book",book);
        //页面跳转
        return "update";
    }


    /**
     * 执行修改操作
     */
    @RequestMapping(value = "update.htm",method = RequestMethod.POST)
    public String update(Book book){
       books.put(book.getId(),book);
       return "redirect:list.htm";
    }


    /**
     * 删除
     */

    @RequestMapping("del.htm")
    public String delete(Book book) {
        books.remove(book.getId());
        return "redirect:list.htm";
    }

    /**
     * 前台del.htm和方法名没有半毛钱关系呢
     * 这个和struts2不一样,因为那个方法名是有固定格式的
     * 这个名字是根据注解类的,前台的:href="del.htm?id=${book.value.id}"
     * 和注解保持一致,就能找到这个方法啦。
     */

}

这里变化比较大。代码中注解比较详细。这里主要有这几个变化:

1、根据请求方式来调用方法名相同的方法;
2、在无参构造方法里面初始化值,采用Map集合,那么和Model结合使用的时候,就是Map里面套Map,所以前端取值,要用book.value.id。直接用book.id是取不到值的,如果不是Map结合,直接是可以取值的;

3、出现中文乱码后,增加了字符过滤器。

<!--配置字符过滤器-->

  <filter>
    <filter-name>encoding</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>
  </filter>

  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

4、这里的重定向,更加简洁!
“redirect:list.htm”

五、页面

list.jsp
add.jsp
update.jsp

list.jsp

<%--
  User: Meice
  Date: 2017/11/11
  Time: 19:10
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>图书列表首页</title>
</head>
<body>
<h2>这是spring mvc图书列表界面<br/></h2>

    <c:forEach var="book" items="${books}">
        ${book.value.id}--${book.value.name} <a href="update.htm?id=${book.value.id}">修改</a>&nbsp;&nbsp;
        <a href="del.htm?id=${book.value.id}" onclick="return confirm('真的忍心删除么?')">删除</a><br/>
    </c:forEach>


<p><a href="add.htm">新增图书</a></p>


</body>
</html>

add.jsp

<%--
  User: Meice
  Date: 2017/11/11
  Time: 19:27
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>新增图书</title>
</head>
<body>
    <form action="add.htm" method="post">
        <table>
            <tr>
                <td>图书编号</td>
                <td><input type="text" name="id"/></td>
            </tr>
            <tr>
                <td>图书名称</td>
                <td><input type="text" name="name"/></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="新增" /></td>
            </tr>
        </table>
    </form>
</body>
</html>

update.jsp

<%--
  User: Meice
  Date: 2017/11/12
  Time: 10:48
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>修改图书</title>
</head>
<body>
    <form action="update.htm" method="post">
        <table>
            <tr>
                <td>图书编号</td>
                <td><input type="text" name="id" value="${book.id}" readonly="readonly"></td>
            </tr>
            <tr>
                <td>图书名称</td>
                <td><input  type="text" name="name" value="${book.name}"/></td>
            </tr>
            <tr>
                <td colspan="2"> <input type="submit" value="修改" /></td>
            </tr>

        </table>

    </form>
</body>
</html>

六、总结


1、SpringMVC可以根据不同的请求方式来调用不同的方法。有什么用?之前无论是纯JDBC、Servlet还是Struts2,我们写add或者update的方法时,都需要2个方法,一个方法为add,单纯只是负责页面跳转;还有一个doAdd()方法,执行add操作。update类似。为此,我们需要考虑为方法取不同名字,以便在跳转和调用方法的时候区别开。现在就不一样了。方法名可以相同,带参不同即可(这样就是方法的重载,而不是方法的重复),加注解的时候,通过method=RequestMethod.Get或者RequestMethod.Post就可以直接区别开哪种请求调用哪种方法。

2、处理中文乱码。
框架自带一个类,CharacterEncodingFilter,这个类专门处理中文乱码。所以,在web.xml中配置一个过滤器就可以从根源上解决问题,不过观察源码发现,默认自带一个属性encoding,只是做了 ! null的判断,所以,需要初始化参数。初始化参数时候,参数名要和这个类中的属性名保持一致。

3、重定向。
SpringMVC重定向很简单:redirect:list.htm就搞定了。struts2是result type=”redirect”这么处理的。


下一篇博客,我们将继续SpringMVC的其他几个功能。下一期,再会!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值