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

话说

各位读者,中午好!前面一篇博客介绍了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的其他几个功能。下一期,再会!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
SSM是指Spring+SpringMVC+MyBatis,是一个JavaWeb开发框架。下面我将为您介绍SSM框架中的文件上传下载和增删改查操作。 文件上传下载: 1.上传文件 (1)在SpringMVC的配置文件中添加multipartResolver ``` <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> ``` (2)在Controller中添加上传文件处理方法 ``` @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) { if (!file.isEmpty()) { try { String fileName = file.getOriginalFilename(); String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"; File dest = new File(filePath + fileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); return "success"; } catch (Exception e) { e.printStackTrace(); } } return "error"; } ``` 2.下载文件 (1)在Controller中添加下载文件处理方法 ``` @RequestMapping(value = "/download", method = RequestMethod.GET) public void download(HttpServletRequest request, HttpServletResponse response) { String fileName = "xxx.jpg"; //文件名 String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"; File file = new File(filePath + fileName); if (file.exists()) { response.setContentType("application/force-download"); response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); byte[] buffer = new byte[1024]; FileInputStream fis = null; BufferedInputStream bis = null; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 增删改查: 1.增加数据 (1)在Mapper中添加insert方法 ``` public void insert(User user); ``` (2)在Service中添加insert方法 ``` public void insert(User user) { userMapper.insert(user); } ``` (3)在Controller中添加insert处理方法 ``` @RequestMapping(value = "/insert", method = RequestMethod.POST) public String insert(User user) { userService.insert(user); return "success"; } ``` 2.删除数据 (1)在Mapper中添加delete方法 ``` public void delete(int id); ``` (2)在Service中添加delete方法 ``` public void delete(int id) { userMapper.delete(id); } ``` (3)在Controller中添加delete处理方法 ``` @RequestMapping(value = "/delete", method = RequestMethod.GET) public String delete(int id) { userService.delete(id); return "success"; } ``` 3.修改数据 (1)在Mapper中添加update方法 ``` public void update(User user); ``` (2)在Service中添加update方法 ``` public void update(User user) { userMapper.update(user); } ``` (3)在Controller中添加update处理方法 ``` @RequestMapping(value = "/update", method = RequestMethod.POST) public String update(User user) { userService.update(user); return "success"; } ``` 4.查询数据 (1)在Mapper中添加select方法 ``` public List<User> selectAll(); ``` (2)在Service中添加selectAll方法 ``` public List<User> selectAll() { return userMapper.selectAll(); } ``` (3)在Controller中添加selectAll处理方法 ``` @RequestMapping(value = "/selectAll", method = RequestMethod.GET) public String selectAll(Model model) { List<User> userList = userService.selectAll(); model.addAttribute("userList", userList); return "userList"; } ``` PS:以上代码仅供参考,具体实现需要根据具体业务需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值