簡易版的SSM框架maven項目實現CRUD【增Create、查Retrieve、改Update、刪Delete】

一、SSM項目【Spring+Springmvc+MyBatis】

1.創建maven項目

                        create maven project.

           下一步 next

        繼續 下一步next,Catalog選擇你的maven安裝路徑的archetype-catalog.xml,儘量不要選All  Catalogs,不要選All  Catalogs,不要選All  Catalogs。重要的事情說三遍。 【雖然我也看其他人選的這個,結果測試也沒報錯,但是我仍然不建議選它】

Filter 中填  org.apache.maven.然後會出現

然後選擇最下面的這一條   maven-archetype-webapp  1.0,選中,然後next

Group Id 是你的公司名,com.你的公司名【例如 你公司是百度,com.baidu】

Artifact Id是你的項目名稱,隨便,我這裏是book_ssm

Version 是你的版本,我這裏選1.0【0.01也可以,我習慣1.0】,

然後Finished,

然後項目可能會報錯,就像

此時只需做一件事,找到webapp文件下的index.jsp,並打開它,

打開的index.jsp如下:

然後,全選Ctrl+A,   刪除Backspace ,最後保存Ctrl+S

空文件,啥都沒。

2.添加一些必要的文件夾。

**********在src下的main文件下添加一個名爲java的文件夾,步驟如下:

右擊項目,new一個Folder文件夾,找到src,鼠標選中main文件夾,在下面的Folder name寫上  java ,然後Finish。

*****************在src文件夾下建立test文件夾,在這個test文件夾下建一個java文件夾供測試類使用。步驟與上同。

右擊項目,new一個Folder文件夾,找到src,鼠標選中src文件夾,在下面的Folder name寫上 test ,然後Finish。

右擊項目,new一個Folder文件夾,找到src,鼠標選中src文件夾下的test文件夾,在下面的Folder name寫上 java,然後Finish。

3.添加依賴。

打開poml.xml文件,在dependencies標籤內添加如下代碼,並保存。

<!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->  
    <dependency>
       <groupId>commons-dbcp</groupId>
       <artifactId>commons-dbcp</artifactId>
       <version>1.4</version>
     </dependency>

       <!-- 格式化對象,方便輸出日誌 -->  
      <dependency>  
          <groupId>com.alibaba</groupId>  
          <artifactId>fastjson</artifactId>  
          <version>1.1.41</version>  
      </dependency>
     <dependency>
         <groupId>javax.servlet.jsp</groupId>
         <artifactId>jsp-api</artifactId>
         <version>2.1</version>
     </dependency>
     <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>jstl</artifactId>
         <version>1.2</version>
     </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
   	</dependency>
   	 <dependency>
       <groupId>javax.websocket</groupId>
       <artifactId>javax.websocket-api</artifactId>
       <version>1.0</version>
     </dependency>

	<!--druid-->
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
     <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.9</version>
     </dependency>
     <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.2</version>
     </dependency>
    <!--mybatis-spring適配器 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>
   <!--mysql數據庫驅動 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2</version>
    </dependency>
    <!-- 文件上傳 -->
     <dependency>  
         <groupId>commons-fileupload</groupId>  
         <artifactId>commons-fileupload</artifactId>  
         <version>1.3.1</version>  
     </dependency>  
     <dependency>  
         <groupId>commons-io</groupId>  
         <artifactId>commons-io</artifactId>  
         <version>2.4</version>  
     </dependency>  
    <!--log4j日誌包 -->
	<dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <version>1.2.17</version>
    </dependency>
     <!-- mybatis ORM框架 -->
     <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis</artifactId>
       <version>3.4.1</version>
     </dependency>
     <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.2</version>
      </dependency>
      <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>javax.transaction-api</artifactId>
        <version>1.2</version>
      </dependency>
<!-- spring配置 -->
	<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-ldap</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-acl</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-cas</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>

保存後,可看到如下圖,jar包已添加完畢【該依賴需要你電腦有網的情況下才生效,需要下載,沒網的電腦就老老實實用你的動態web項目吧(Dynamic Web Project)】

4.找到src/main/java文件夾

左鍵單擊選中,new一個包package,名字一般是(com.baidu.bookstore.domain)

並在該包下建一個類(class),名爲Book,並讓該Book類序列化,implements  Serializable,其實Serializable是一個空接口,沒有什麼具體內容,它的目的只是簡單的標識一個類的對象可以被序列化。

添加Book類屬性,bookid   String類型,bookname  String類型,bookprice    double類型,bookimg  String 類型,並構建它們的set與get方法。

package com.baidu.book.domain;

import java.io.Serializable;

@Component
public class Book implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String bookid;
	private String bookname;
	private double bookprice;
	private String bookimg;
	public String getBookid() {
		return bookid;
	}
	public void setBookid(String bookid) {
		this.bookid = bookid;
	}
	public String getBookname() {
		return bookname;
	}
	public void setBookname(String bookname) {
		this.bookname = bookname;
	}
	public double getBookprice() {
		return bookprice;
	}
	public void setBookprice(double bookprice) {
		this.bookprice = bookprice;
	}
	public String getBookimg() {
		return bookimg;
	}
	public void setBookimg(String bookimg) {
		this.bookimg = bookimg;
	}
	
}

開始寫持久層,

在domain同級創建一個包package,包名爲com.baidu.book.mapper,在該包下創建一個接口BookMapper,內有實現方法,如下代碼:

package com.baidu.book.mapper;

import java.util.List;

import com.baidu.book.domain.Book;

public interface BookMapper {
	
	//分頁查詢
	public List<Book> getPageBooks(int index);
	
	//刪除書籍
	public int deleteBook(String bookid);
	
	//添加書籍
	public int saveBook(Book book);
	
	//修改書籍
	public int updateBook(Book book);
	
	//獲得書籍數量總頁面
	public int getTotalRecord();
	
	//通過書籍編號查看書籍詳情
	public Book getBookById(String bookid);
	
}

我們需要將接口中的方法一一實現,接口又不能像類一樣new,只能寫配置文件,相當於將接口實例化

所以在src/main/resource文件下創建一個xml配置文件,由於該配置文件是將持久層的接口實例化,故起名BookMapper.xml

內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!-- namespace:要實現的的接口
  	   id:要實現的方法名字
  	   #裏面的單詞一定是JAVABEAN裏面的屬性,
  	   parameterType,是這個方法裏面的小括號 裏面寫的 -->
<mapper namespace="com.baidu.book.mapper.BookMapper">

  	<!-- 添加書籍 -->
  	<insert id="saveBook" parameterType="Book">
  		insert into 
  			book
<!--     prefix:在trim標籤內sql語句加上前綴。
suffix:在trim標籤內sql語句加上後綴。
suffixOverrides:指定去除多餘的後綴內容,如:suffixOverrides=",",去除trim標籤內sql語句多餘的後綴","。
prefixOverrides:指定去除多餘的前綴內容                             -->
		  		<trim prefix="(" suffix=")" suffixOverrides=",">
		  			<if test="bookname != null">
		  				bookname,
		  			</if>
		  			<if test="bookprice != 0">
		  				bookprice,
		  			</if>
		  			<if test="bookimg != null">
		  				bookimg
		  			</if>
		  		</trim>
  		values
	  			<trim prefix="(" suffix=")" suffixOverrides=",">
		  			<if test="bookname != null">
		  				 #{bookname},
		  			</if>
		  			<if test="bookprice != 0">
		  				 #{bookprice},
		  			</if>
		  			<if test="bookimg != null">
		  				 #{bookimg}
		  			</if>
	  			</trim>
  	</insert>
  	
  	
  	<!--  刪除書籍 -->
  	<delete id="deleteBook" parameterType="String" >
  		delete from
  			book
  		where
  		   	bookid = #{bookid}
  	</delete>
  
  	<!-- 修改書籍 -->
  	<update id="updateBook" parameterType="Book">
  		update 
  			book
<!-- set標籤與trim標籤類似,可以去除多餘的,或者()等等   -->
	  		<set>
	  			<if test="bookname != null">
	  				bookname = #{bookname},
	  			</if>
	  			<if test="bookprice != 0">
	  				bookprice = #{bookprice},
	  			</if>
	  			<if test="bookimg != null" >
	  				bookimg = #{bookimg}
	  			</if>
	  		</set>
  		where
		  		bookid = #{bookid}
  	</update>
  	
  	<resultMap  type="Book"  id="book">
  		<id column="bookid" property="bookid" javaType="String" jdbcType="VARCHAR" />
  		<result column="bookname" property="bookname" javaType="String" jdbcType="VARCHAR"/>
  		<result column="bookprice" property="bookprice" javaType="float" jdbcType="FLOAT"/>
  		<result column="bookimg" property="bookimg" javaType="String" jdbcType="VARCHAR"/>
  	</resultMap>
  	<!--  分頁查詢  -->
  	<select id="getPageBooks"  parameterType="int"  resultType="book">
		select 
			bookid,bookname,bookprice,bookimg
		from
			book 
		limit #{index},3
  	</select>
  	
  	<!-- 根據書籍編號查找書籍詳情 -->
  	<select id="getBookById" parameterType="String" resultType="book">
  		select bookid,bookname,bookprice,bookimg
  		from 
  			book
  		where
  			bookid = #{bookid}
  		
  	</select>
  	
  	<!--  獲得書籍數量總頁面 -->
  	<select id="getTotalRecord" resultType="int">
  		select count(*) from book
  	</select>
  	
</mapper>

可以看到增刪改查,基本都是SQL語句,insert  、delete、update、select標籤內,id是你的BookMapper接口裏面的方法名;

parameterType【從單詞就可以看出來,這是括號裏面的參數類型】

標籤內寫SQL語句。

select與增刪改略有不同,查找的數據需要放進一個Map容器,並從該容器中讀取

該容器名爲resultMap,id是他的名字,一般是類名(首字母小寫),type也是它的類名,不過首字母要大寫。

內有主鍵id,即數據庫中的主鍵bookid,其他屬性,以result標籤包攬。

無論是主鍵id,還是一般屬性result ,標籤內都有屬性值,column【數據庫裏面的列名,即表的列名】、property【javaBean裏面的屬性名,與數據庫表的列名一一對應】、javaType【javaBean裏面的屬性】、jdbcType【數據庫裏面的屬性】。

由於實現CRUD離不開數據庫,持久層調用SessionFactory,需要配置xml文件,獲取session.

在src/main/resource文件下創建一個xml配置文件,名爲application,文件內容如下:

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-4.3.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	
	<!-- 開啓掃描 掃描範圍是com.baidu.book這個文件夾下的所有包 ,*代表所有   -->
	<context:component-scan base-package="com.baidu.book.*" />
	
	<!-- 數據連接池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" />
		<property name="username" value="root" />
		<property name="password" value="805230" />
	</bean>
	
	<!-- 不需要定義SqlSessionFactory,注意configLocation當您使用MapperFactoryBean -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 自動掃描domain目錄, 省掉Configuration.xml裏的手工配置 -->
		<property name="typeAliasesPackage" value="com.baidu.book.domain" />	<!-- 以類名當別名 -->
		<property name="dataSource" ref="dataSource" />
		<!--  <property name="configLocation" value="classpath:mybatis-config.xml" />  -->
		<property name="mapperLocations" value="classpath:BookMapper.xml" />
	</bean>
	
	<!-- 掃描映射器 Mapper  持久層實例化-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- Mapper接口所在包名,Spring會自動查找其下的Mapper -->
		<property name="basePackage" value="com.baidu.book.mapper" />
		
		<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />  -->
	
	</bean>
	
	<!-- 頁面上傳時需要用到的 -->
	<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       	<!-- 設定默認編碼 -->
        <!-- <property name="defaultEncoding" value="UTF-8" /> -->
       	<property name="maxUploadSize" value="102400000"></property><!-- 文件上傳最大的大小字節 -->
       	<!-- <property name="maxInMemorySize" value="4096" /> -->
    </bean>
	
	<!-- 事務處理 -->
	
	<!-- 事務管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!-- 開啓事務註解 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
</beans>

創建業務層(服務層)

在domain同級創建一個包package,包名爲com.baidu.book.service,在該包下創建一個接口BookService,內有實現方法,如下代碼:

package com.baidu.book.service;

import java.util.List;

import com.baidu.book.domain.Book;


public interface BookService {
	
	//分頁查詢
	public List<Book> getPageBooks(int page);
	
	//刪除書籍
	public void deleteBookById(String bookid);
	
	//添加書籍
	public void addBook(Book book);
	
	//修改書籍
	public void updateBook(Book book);
	
	//根據書籍編號查找書籍詳情
	public Book getBookById(String bookid);
	
	//獲得書籍數量總頁數
	public int getTotalPage();
	
}

實現這些方法,需要再創建一個包package,包名爲com.baidu.book.service.impl,在該包下創建一個接口BookService,內有實現方法,如下代碼:

package com.baidu.book.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.baidu.book.domain.Book;
import com.baidu.book.mapper.BookMapper;
import com.baidu.book.service.BookService;


// 此處實例化接口bookService
@Service("bookService")
public class BookServiceimpl implements BookService{

 
	@Autowired
	private BookMapper bookMapper;
	
	@Override
	public List<Book> getPageBooks(int page) {
		int index = (page-1)*3;
		return bookMapper.getPageBooks(index);
	}

	@Transactional
	@Override
	public void deleteBookById(String bookid) {
		
		bookMapper.deleteBook(bookid);

	}

	@Transactional
	@Override
	public void addBook(Book book) {
		
		bookMapper.saveBook(book);
	
	}

	@Transactional
	@Override
	public void updateBook(Book book) {
		bookMapper.updateBook(book);

	}

	@Override
	public Book getBookById(String bookid) {
		
		return bookMapper.getBookById(bookid);
	}

	@Override
	public int getTotalPage() {
		int totalSize = bookMapper.getTotalRecord();
		if(totalSize % 3 ==0){
			return totalSize / 3;
		}else{
			return totalSize /	3 + 1 ;
		}
	}
 
}

DI依賴注入  dependency依賴 IOC控制反轉  autowired即是將bookMapper實例化;
BookMapper bookMapper = new BookMapperimpl();實際上BookMapperimpl是不存在的。

創建控制層,需要再創建一個包package,包名爲com.baidu.book.controller,在該包下創建一個servlet,名爲BookController,servlet主要作用是,jsp頁面傳值到控制層,接受頁面傳來的數據,,如下代碼:

package com.baidu.book.controller;

import java.io.FileOutputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.baidu.book.domain.Book;
import com.baidu.book.service.BookService;
import com.baidu.book.util.ChineseEncoding;
import com.baidu.book.util.FileNameUtil;


@Controller
@RequestMapping("/book")
public class BookController {
	
//	private Logger logger = Logger.getLogger(this.getClass());
	
    private String newFileName = "";
    private Book book = null;
	
	@Autowired
	private BookService bookService;
	
	@RequestMapping(value="/upload",method=RequestMethod.POST)
	public void upload(HttpServletRequest req) throws Exception {
		MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
		
		MultipartFile file = mreq.getFile("tupian");
		String fileName = file.getOriginalFilename();

		newFileName = "upload/" + FileNameUtil.getNewFileName(fileName);
		//E:/java/repository/Book_sm/src/main/webapp
    	String serverPath = req.getSession().getServletContext().getRealPath("/");
    	System.out.println("保存路徑:"+serverPath);
    	//輸出流,圖片
    	FileOutputStream fos = new FileOutputStream("E:/java/repository/Book_sm/src/main/webapp/"+newFileName);
        fos.write(file.getBytes());
        fos.flush();
        fos.close();
 
    }
	
	@RequestMapping(value="/saveBook",method=RequestMethod.POST)
	public String saveBook(HttpServletRequest req,Book book) throws Exception{
		upload(req);
		
		book.setBookname(ChineseEncoding.changeStr(book.getBookname()));
		book.setBookimg(newFileName);
		bookService.addBook(book);

		return "redirect:/book/page.action";
	}
	
	
	@RequestMapping("/delete")
	public String  Delete(HttpServletRequest req,Book book) {

		bookService.deleteBookById(book.getBookid());
		return "redirect:/book/page.action";
	}
	
	@RequestMapping("/updateBook")
	public String updateBook(HttpServletRequest req,Book book) throws Exception {
		upload(req);
		
		book.setBookname(ChineseEncoding.changeStr(book.getBookname()));
		book.setBookimg(newFileName);
		bookService.updateBook(book);
		
		return "redirect:/book/page.action";
	}
	
	
	@RequestMapping("/page")
	public String page(HttpServletRequest req,ModelMap map) {
		int pageIndex = 1;
		if(req.getParameter("pageIndex") != null){
			pageIndex = Integer.parseInt(req.getParameter("pageIndex"));
		}
		map.addAttribute("pageIndex", pageIndex);
		map.addAttribute("books", bookService.getPageBooks(pageIndex));
		map.addAttribute("totalPage", bookService.getTotalPage());
		return "index";
	}


}

JSP調用控制層,需要new一個控制層對象,但不在代碼中出現,需要對控制層掃描,並開啓註解,這時需要創建一個開啓掃描控制層的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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-4.3.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
	http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
	
	<context:component-scan base-package="com.baidu.book.controller" />
	
	<!-- 開啓MVC註解 -->
	<mvc:annotation-driven />
	
	<!-- 設置spring:頁面轉發的路徑前綴prefix,後綴suffix -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/" /><!-- 在根目錄找 -->
		<property name="suffix" value=".jsp" /><!-- 文件後綴爲jsp -->
	</bean>
	
</beans>

5.書寫jsp頁面

一,顯示頁面,進去可默認分頁顯示數據庫中的內容,其實是調用了控制層的page方法,代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page isELIgnored="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>分頁顯示</title>
<style type="text/css">
	table tr td img{
		width:80px;
		height:100px;
	}
</style>
<script type="text/javascript">
		function gogo(){
			window.location = "page.action?pageIndex="+document.getElementsByName("pageIndex")[0].value;
		}
	
</script>
</head>
<body>
	<table border="1" width="80%" style="margin:0 auto; text-align:center;">
		<tr>
			<td>編號</td>
			<td>書名</td>
			<td>價格</td>
			<td>圖片</td>
			<td>操作</td>
		</tr>
		<c:forEach var="book" items="${books}">
			<tr>
				<td>${book.bookid}</td>
				<td>${book.bookname}</td>
				<td>${book.bookprice}</td>
				<td><img src="<%=basePath %>${book.bookimg}"/></td>
				<td>
					<a href="delete.action?bookid=${book.bookid}">刪除</a>
					<a href="<%=basePath %>updateBook.jsp?bookid=${book.bookid}&bookname=${book.bookname}&bookprice=${book.bookprice}&bookimg=${book.bookimg}">修改</a>
				</td>
			<tr>
		</c:forEach>
		<tr>
			<td colspan="5">
				<c:if test="${pageIndex <= 1}">
					[上一頁]
				</c:if>
				<c:if test="${pageIndex > 1}">
					<a href='<%=basePath %>book/page.action?pageIndex=${pageIndex-1}'/> [上一頁]  </a>
				</c:if>
				<script >
					for(var i = 0;i<'${totalPage}';i++){
						document.write("<a href='<%=basePath %>book/page.action?pageIndex="+(i+1)+"'>[" + (i+1)+"]</a>"+"&nbsp&nbsp")
					}
				</script>
				
				<c:if test="${pageIndex < totalPage}">
					<a href='<%=basePath %>book/page.action?pageIndex=${pageIndex+1}'/>[下一頁]</a>
				</c:if>
				<c:if test="${pageIndex >= totalPage}">
					[下一頁]
				</c:if>
				共${totalPage}頁,當前第${pageIndex}頁跳轉至<input type="text" name="pageIndex" value="${pageIndex}" style="text-align:center;color:#666;"/>頁
				<input type="button" value="跳轉" onclick="gogo()"/>
			<a href="<%=basePath %>addBook.jsp">添加一行</a></td>
		</tr>
		
		
	</table>
</body>
</html>

接下來是添加頁面addBook.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>
<script type="text/javascript" src="js/jquery-1.7.js"></script>
<script type="text/javascript">
	$(function(){
		$("#picture").change(function(){
			
			var filePath = $(this).val(),         //獲取到input的value,裏面是文件的路徑
    		fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(),
    		src = window.URL.createObjectURL(this.files[0]); //轉成可以在本地預覽的格式
			
			if( !fileFormat.match(/.png|.jpg|.jpeg|.gif/) ) {
	    		error_prompt_alert('上傳錯誤,文件格式必須爲:png/jpg/jpeg/gif');
	        	return;  
	        }

	        $('#pic').attr('src',src);
	        $("#pic").css({"width":"80px","height":"60px"});
    		
		})
	})
</script>
</head>
<body>
	<form action="book/saveBook.action" method="post" enctype="multipart/form-data">
		<table border="1" width="80%" style="margin:0 auto;text-align:center;">
			<tr>
				<td>名稱</td>
				<td><input type="text" name="bookname"></td>
			</tr>
			<tr>
				<td>價格</td>
				<td><input type="text" name="bookprice"></td>
			</tr>
			<tr>
				<td>圖片</td>
				<td>
					<input type="file" name="tupian" id="picture"/>
					<img  id="pic" />
				</td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="確認添加"></td>
			</tr>
		</table>
	</form>
</body>
</html>

頁面傳到servlet的值可能會出現亂碼,需要建一個類專門轉換亂碼的。

所以在創建一個package,名爲com.baidu.book.util,包內創建一個類ChineseEncoding,內容如下:

package com.baidu.book.util;

import java.io.UnsupportedEncodingException;

public class ChineseEncoding {

	public static String changeStr(String input) {
		
		try {
			input = new String(input.getBytes("iso-8859-1"),"utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return input;
	}

}

在該包下,再創建一個類,主要是接受頁面上傳的文件,並起名,代碼如下:

package com.baidu.book.util;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class FileNameUtil {

	public static String getNewFileName(String filename) {
		Calendar calendar = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		
		String fileName = sdf.format(calendar.getTime());
		String suffix = filename.substring(filename.lastIndexOf("."));
		
		
		return fileName + suffix;
		
	}

}

接下來是修改頁面update.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">
<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改頁面</title>
<script type="text/javascript" src="js/jquery-1.7.js"></script>
<script type="text/javascript">
	$(function(){
		$("#picture").change(function(){
			
			var filePath = $(this).val(),         //獲取到input的value,裏面是文件的路徑
    		fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(),
    		src = window.URL.createObjectURL(this.files[0]); //轉成可以在本地預覽的格式
			
			if( !fileFormat.match(/.png|.jpg|.jpeg|.gif/) ) {
	    		error_prompt_alert('上傳錯誤,文件格式必須爲:png/jpg/jpeg/gif');
	        	return;  
	        }

	        $('#pic').attr('src',src);
	        $("#pic").css({"width":"80px","height":"60px"});
    		
		})
	})
</script>
</head>
<body>
	<form action="book/updateBook.action" method="post" enctype="multipart/form-data">
		<table border="1" width="80%" style="margin:0 auto; text-align:center;">
			<tr>
				<td>編號</td>
				<td><input type="text" value="${param.bookid }" name="bookid"/></td>
			</tr>
			<tr>
				<td>名稱</td>
				<td><input type="text" value="${param.bookname }" name="bookname"/></td>
			</tr>
			<tr>
				<td>價格</td> 
				<td><input type="text" value="${param.bookprice }" name="bookprice"/></td>
			</tr>
			<tr>
				<td>圖片</td>
				<td>
					<input type="file" value="${param.bookimg }" name="tupian"  id="picture"/>
					<img  src="<%=basePath %>${param.bookimg}"  id="pic" />
				</td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="確認修改"/></td>
			</tr>
		</table>
	</form>
</body>
</html>

最後一個是詳情頁面,就是在index.jsp頁面,操作一列中,刪除、修改、詳情【我沒有寫詳情】詳情就是book的具體屬性。代碼如下:

<%@ 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">
<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>書籍詳情</title>
</head>
<body>
	<table>
		<tr>
			<td>編號</td>
			<td>${param.bookid}</td>
		</tr>
		<tr>
			<td>名稱</td>
			<td>${param.bookname } /></td>
		</tr>
		<tr>
			<td>價格</td> 
			<td>${param.bookprice } /></td>
		</tr>
		<tr>
			<td>圖片</td>
			<td>
				<img  src="<%=basePath %>${param.bookimg}" />
			</td>
		</tr>
		<tr>
			<td colspan="2"><input type="submit" value="確認修改"/></td>
		</tr>
	</table>
</body>
</html>

最後,在webapp文件夾下的WEB-INF文件夾下的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_3_0.xsd" 
		  version="3.0">
	  <display-name>book_ssm</display-name>
	  <welcome-file-list>
	  		<welcome-file>book/page.action</welcome-file>
	  </welcome-file-list>

  <!-- 載入SPRING文件 -->
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  
  <!-- 載入springmvc文件 -->
	<servlet>
		<servlet-name>DispatchServlet</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>
	</servlet>

	<servlet-mapping>
		<servlet-name>DispatchServlet</servlet-name>
		<url-pattern>*.action</url-pattern><!-- 此處所有請求都由SPRINGMVC處理 -->
	</servlet-mapping>
	

</web-app>

至此,簡易項目告一段落,如果運行報了bug,請仔細檢查,是不是路徑的問題。

在下新手一個,有什麼問題可以討論一下,相互學習。。。謝了,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章