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