springmvc学习指南-springmvc的CRUD入门

原创 2016年08月28日 22:10:48

springmvc学习指南--springmvc的CRUD入门

    最近在读一个本书,大名叫《springMVC学习指南》,看了前5章,自我感觉颇有收获,特别是前三章讲了springmvc的“dispatcherServlet”的由来,甚是令我茅舍顿开!!整合过springmvc项目的人都知道,web.xml有这样一段用于配置springmvc的,如下面所示。

	<!-- springmvc的配置 -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:config/springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

    实际上,这是springmvc整合的入口,用于充当控制器的作用:即用于处理前端的请求并进行分发(如转发,重定向等操作)。而springmvc学习指南前三章讲的就是dispatcherServlet的由来(从分Controller的功能讲起到最后将各个同属于一个实体的Controller整合到同一个Controller中)。附:希望博友们有空可以读读(很是浅显易懂!)

    今晚就跟各位分享一下我根据自己的理解,动手写了一个纯粹的springmvc的CRUD操作,而不整合后端持久层框架(即Dao层)和前端的模板,只是模拟演示一下罢了(其实,这个过程下来,再去整合Dao和前端模板是相当简单的:因为Dao其实就是提供数据库访问的操作,你可以弄个纯的jdbc,整个c3p0的Jdbc,甚至是hibernate,mybatis等等;而前端则只是为了实现异步交互操作,你可以弄个jquery-easyui,jsp+ajax+jquery,jerbrick-template,freemarker等等)。好了,下面就开始介绍我这个小案例的整体项目结构吧!



    介绍的实体包括:“实体”目录(Category)和“实体”书籍(Book),两者是一对多的关系。即一个目录下面有多本书,一本书只属于一个目录。

    下面是它们的model类(其实就是一个很简洁的POJO)的代码(注意,为了缩减篇幅,省略了属性的getter、setter方法):

package com.steadyjack.server.model;

public class Category {
	private Long id;
	private String name;

	//getter setter方法
}

package com.steadyjack.server.model;

public class Book {
	private Long id;
	
	private String title;
	
	private String isbn;
	
	private String author;
	
	private Long categoryId;

<span style="white-space:pre">	</span>//getter setter方法
}

    下面是后端Categoryservice接口和BookService及其实现:

CategoryService:

package com.steadyjack.server.service;

import java.util.List;

import com.steadyjack.server.model.Category;

public interface CategoryService {
	
	List<Category> getCategoryList();
	
	Category getCategoryById(Long id);
}


CategoryServiceImpl
package com.steadyjack.server.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import com.steadyjack.server.model.Category;
import com.steadyjack.server.service.CategoryService;

@Service("categoryService")
public class CategoryServiceImpl implements CategoryService {
	
	private List<Category> categoryList=new ArrayList<>();
	
	public CategoryServiceImpl() {
		Category category=new Category();
		category.setId(1L);
		category.setName("java类书籍");
		
		Category categorySec=new Category();
		categorySec.setId(2L);
		categorySec.setName("web框架类书籍");
		
		categoryList.add(category);
		categoryList.add(categorySec);
	}
	
	@Override
	public List<Category> getCategoryList() {
		return categoryList;
	}

	@Override
	public Category getCategoryById(Long id) {
		Category currentCategory=null;
		for(Category category:categoryList){
			if (category.getId()==id) {
				currentCategory=category;
				break;
			}
		}
		return currentCategory;
	}

}

BookService:

package com.steadyjack.server.service;

import java.util.List;

import com.steadyjack.server.model.Book;

public interface BookService {
	
	Book saveBook(Book book);
	
	void updateBook(Book book);
	
	void deleteBook(Long id);
	
	List<Book> getAllBooks();
	
	Book getBook(Long id);
	
}

BookServiceImpl:

package com.steadyjack.server.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import com.steadyjack.server.model.Book;
import com.steadyjack.server.service.BookService;

@Service("bookService")
public class BookServiceImpl implements BookService {
	
	private List<Book> bookList=new ArrayList<>();
	
	public BookServiceImpl() {
		Book book=new Book();
		book.setTitle("java编程思想");
		book.setIsbn("10086");
		book.setAuthor("高司令");
		book.setCategoryId(1L);
		
		Book bookSec=new Book();
		bookSec.setTitle("spring实战");
		bookSec.setIsbn("10010");
		bookSec.setAuthor("约翰逊");
		bookSec.setCategoryId(1L);
		
		saveBook(book);
		saveBook(bookSec);
	}
	
	@Override
	public Book saveBook(Book book) {
		book.setId(getNextId());
		bookList.add(book);
		return book;
	}

	@Override
	public void updateBook(Book book) {
		int size=bookList.size();
		Book updateBook=null;
		for(int i=0;i<size;i++){
			updateBook=bookList.get(i);
			if (book.getId()==updateBook.getId()) {
				bookList.set(i, book);
			}
		}
	}

	@Override
	public List<Book> getAllBooks() {
		return bookList;
	}

	@Override
	public Book getBook(Long id) {
		for(Book book : bookList){
			if (id==book.getId()) {
				return book;
			}
		}
		return null;
	}
	
	//获取主键的方式
	public Long getNextId(){
		Long id=0L;
		for(Book book : bookList){
			if (book.getId()>id) {
				id=book.getId();
			}
		}
		return id+1;
	}

	@Override
	public void deleteBook(Long id) {
		int size=bookList.size();
		for(int i=0;i<size;i++){
			if (id==bookList.get(i).getId()) {
				bookList.remove(i);
				break;
			}
		}
	}
}

    以上各个方法的含义我就不注释了,其函数名就可以体现其意思了!

    下面是后端的Controller类,主要是实现了BookController,如果还想实现CategoryController,可以自己参照BookController的实现。

package com.steadyjack.server.controller;

import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.steadyjack.server.model.Book;
import com.steadyjack.server.model.Category;
import com.steadyjack.server.service.BookService;
import com.steadyjack.server.service.CategoryService;


@Controller
@RequestMapping("/book")
public class BookController {
	
	private static final Log logger=LogFactory.getLog(BookController.class);
	
	//分工合作:而不要因为是一个案例而将全部功能整合在了bookService  --  你认真对待,再简单的案例都可以成为一个项目
	
	@Autowired
	private BookService bookService;
	
	@Autowired
	private CategoryService categoryService;

	@RequestMapping("/list")
	public String listBooks(Model model){
		logger.info("获取书籍列表");
		
		List<Book> bookList=bookService.getAllBooks();
		HashMap<Long, Category> categoryMap=new HashMap<>();
		
		if (bookList!=null && bookList.size()>0) {
			for(Book book : bookList){
				Long id=book.getCategoryId();
				categoryMap.put(id,categoryService.getCategoryById(id));
			}
		}
		
		model.addAttribute("bookList", bookList);
		model.addAttribute("categoryMap", categoryMap);
		return "BookList";
	}
	
	
	@RequestMapping("/input")
	public String inputBook(Model model){
		logger.info("输入书籍信息");
		
		List<Category> categoryList=categoryService.getCategoryList();
		model.addAttribute("categoryList", categoryList);
		
		return "BookInput";
	}
	
	@RequestMapping("/edit/{id}")
	public String editBook(@PathVariable Long id,Model model){
		logger.info("编辑书籍信息");
		
		Book book=bookService.getBook(id);
		List<Category> categoryList=categoryService.getCategoryList();
		
		model.addAttribute("categoryList", categoryList);
		model.addAttribute("book", book);
		return "BookEdit";
	}
	
	@RequestMapping("/save")
	public String saveBook(@ModelAttribute Book book){
		logger.info("保存书籍信息");
		
		bookService.saveBook(book);
		return "redirect:/book/list";
	}
	
	@RequestMapping("/update")
	public String updateBook(@ModelAttribute Book book){
		logger.info("保存修改后的书籍信息");
		
		bookService.updateBook(book);
		return "redirect:/book/list";
	}
	
	@RequestMapping("/delete/{id}")
	public String deleteBook(@PathVariable Long id){
		logger.info("删除书籍信息");
		
		bookService.deleteBook(id);
		return "redirect:/book/list";
	}
	
}

    上面的Controller还整合了Log的功能。

     完了后端的实现,下面配置一下web.xml和springmvc的配置文件(其实,这应该属于第2步,第一步应该是放jar包,然后第三步才是上面的步骤!!!!)

     先放入jar包WEB-INF下的lib文件夹中,可以来这里下载:springmvc的crud案例需要的jar包

     然后配置一下web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>springStudyGuide-springmvc04</display-name>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<!-- springmvc的配置 -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:config/springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 配置字符编码为UTF-8 -->
	<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>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	

</web-app>

     然后是springmvc的配置(配置文件叫: springmvc.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"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		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-4.0.xsd">
	
	<!-- 扫描包 -->
	<context:component-scan base-package="com.steadyjack.server" />
	
	<!-- 为了能够使用RedirectAttributes 注解 -->
	<mvc:annotation-driven/>
	
	<!-- 配置试图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
</beans>

    好了,基本上没啥了,接下来是前端几个.jsp文件了:

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" %>
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<!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>
<base href="<%=basePath%>"> 
</head>
<body>
	<h2>-----书籍列表-----</h2>
	<c:forEach items="${bookList }" var="book">
		<p>
		编号:  ${book.id}<br/>
		名称:  ${book.title}<br/>
		条形码:  ${book.isbn}<br/>
		作者:  ${book.author}<br/>
		所属目录:  ${categoryMap[book.categoryId].name}
		</p>
		<h5><a href="book/edit/${book.id}">修改书籍信息</a></h5>
		<h5><a href="book/delete/${book.id}">删除书籍信息</a></h5>
		<br/>
	</c:forEach>
	<br/>
	<h4><a href="book/input">添加书籍</a></h4>
</body>
</html>

BookInput.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 

<!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>
<base href="<%=basePath%>"> 
</head>
<body>
	
	<form action="book/save" method="post">
		<p>添加书籍信息</p>
		<p>
			<label>书籍名称:</label>
			<input type="text" id="title" name="title"/>
		</p>
		<p>
			<label>条形码:</label>
			<input type="text" id="isbn" name="isbn"/>
		</p>
		<p>
			<label>作者:</label>
			<input type="text" id="author" name="author"/>
		</p>
		
		<p>
			<label>所属目录:</label>
			<select id="categoryId" name="categoryId">
				<c:forEach items="${categoryList }" var="category">
					<option value="${category.id }">${category.name }</option>
				</c:forEach>
			</select>
		</p>
		
		<input id="reset" type="reset"/>
		<input id="submit" type="submit" value="保存"/>
	</form>
	
	
</body>
</html>

BookEdit.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 

<!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>
<base href="<%=basePath%>"> 
</head>
<body>
	
	<form action="book/update" method="post">
		<p>添加书籍信息</p>
		<input type="hidden" id="id" name="id" value="${book.id}"/>
		<p>
			<label>书籍名称:</label>
			<input type="text" id="title" name="title" value="${book.title}"/>
		</p>
		<p>
			<label>条形码:</label>
			<input type="text" id="isbn" name="isbn" value="${book.isbn}"/>
		</p>
		<p>
			<label>作者:</label>
			<input type="text" id="author" name="author" value="${book.author}"/>
		</p>
		
		<p>
			<label>所属目录:</label>
			<select id="categoryId" name="categoryId">
				<c:forEach items="${categoryList }" var="category">
					<c:if test="${category.id eq book.categoryId}">
						<option value="${category.id }" selected="selected">${category.name }</option>
					</c:if>
					<c:if test="${category.id ne book.categoryId}">
						<option value="${category.id }" >${category.name }</option>
					</c:if>
				</c:forEach>
			</select>
		</p>
		
		<input id="reset" type="reset"/>
		<input id="submit" type="submit" value="保存"/>
	</form>
	
	
</body>
</html>

    好了,准备好tomcat7,跑起来吧。。。

    打开浏览器,输入:http://localhost:8088/springStudyGuide-springmvc04/book/list 即可看到了初始化的“静态的数据”,即两本书的信息


    添加一本书:


    点击保存:



    点击“修改这本书籍”(在后面加上 2):


    点击“保存”:



    最后,是把这本书给删了,点击“删除书籍信息”,就会发现该页面少了这本书:


    好了,今晚就讲到这里吧!要往后面看了,后期会整合进hibernate或者mybatis的功能,以及ajax和jquery的功能!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

(笔记)Spring MVC学习指南_下载文件

下载文件

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Spring+SpringMVC+mybatis入门(环境搭建+crud)

大学毕业快一年了,在学校里做了一个android APP的项目,一直都只是熟悉android后台开发是最大的短板,工作后,公司都是自己的框架,这种开源框架基本也没时间去接触。app和后台都是基于公司的...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

web.xml之jsp-config

作用:主要用于设定JSP页面的相关配置。常见定义: URI(定义TLD文件的URI,JSP页面的tablib命令可以经由此URI获取到TLD文件) TLD文件所在的位置 ...

eclipse maven工程导入到MyEclipse出现"Versions of Spring facet could not be detected”的解决方法

MyEclipse报“VERSION OF SPRING FACET COULD NOT BE DETECTED.”错误
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:springmvc学习指南-springmvc的CRUD入门
举报原因:
原因补充:

(最多只允许输入30个字)