SSM框架整合步驟
1:搭建一個web工程,將所需的jar包放進去
2,創建數據庫,創建表
插入2條初始數據進去
INSERT INTO product VALUE(NULL,"手機",899,2);
INSERT INTO product VALUE(NULL,"電視",1299,5);
有了數據之後,將實體類創建出來
package com.jgl.model;
public class Product {
private int id; //商品編號
private String pName; //商品名稱
private double pPrice; //商品價格
private int pNumber; //商品數量
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public double getpPrice() {
return pPrice;
}
public void setpPrice(double pPrice) {
this.pPrice = pPrice;
}
public int getpNumber() {
return pNumber;
}
public void setpNumber(int pNumber) {
this.pNumber = pNumber;
}
public Product() {
super();
// TODO Auto-generated constructor stub
}
public Product(int id, String pName, double pPrice, int pNumber) {
super();
this.id = id;
this.pName = pName;
this.pPrice = pPrice;
this.pNumber = pNumber;
}
@Override
public String toString() {
return "User [id=" + id + ", pName=" + pName + ", pPrice=" + pPrice + ", pNumber=" + pNumber + "]";
}
}
我習慣從前端往後端的順序開發:
3,前端部分
3.1 先畫首頁index.jsp,放在WebContend下面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>首頁</title>
</head>
<body>
<h1>
<a href="${pageContext.request.contextPath}/product/getAllProduct">進入商品展示頁面</a>
</h1>
</body>
</html>
3.2 在WEB-INF下面創建一個文件夾jsp,並在裏面畫3個頁面
allProduct.jsp代碼如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>商品列表</title>
</head>
<body>
<h6><a href="${pageContext.request.contextPath}/product/toAddProduct">添加商品</a></h6>
<table border="1">
<tbody>
<tr><td colspan="4" align="center"><h1>商品管理</h1></td></tr>
<tr>
<th>商品名稱</th>
<th>商品價格</th>
<th>商品數量</th>
<th>操作</th>
</tr>
<c:if test="${!empty productList }">
<c:forEach items="${productList}" var="product">
<tr>
<td>${product.pName }</td>
<td>¥${product.pPrice}</td>
<td>${product.pNumber}</td>
<td>
<a href="${pageContext.request.contextPath}/product/getProduct?id=${product.id}">編輯</a>
<a href="${pageContext.request.contextPath}/product/delProduct?id=${product.id}">刪除</a>
</td>
</tr>
</c:forEach>
</c:if>
</tbody>
</table>
</body>
</html>
addProduct.jsp代碼如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>添加商品</title>
</head>
<body>
<h1>添加商品</h1>
<form action="${pageContext.request.contextPath}/product/addProduct" method="post">
<p>商品名稱:<input type="text" name="pName"></p>
<p>商品價格:<input type="text" name="pPrice"></p>
<p>商品數量:<input type="text" name="pNumber"></p>
<input type="submit" value="添加">
</form>
</body>
</html>
editProduct.jsp代碼如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>編輯商品</title>
</head>
<body>
<h1>編輯商品</h1>
<form action="${pageContext.request.contextPath}/product/updateProduct" method="post">
<input type="hidden" name="id" value="${product.id }"/>
<p>商品名稱:<input type="text" name="pName" value="${product.pName}"/></p>
<p>商品價格:<input type="text" name="pPrice" value="${product.pPrice}"/></p>
<p>商品數量:<input type="text" name="pNumber" value="${product.pNumber}"></p>
<input type="submit" value="保存" />
</form>
</body>
</html>
4 後端部分
4.1,表現層開發:創建一個包package com.jgl.controller,創建一個ProductController
package com.jgl.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.jgl.model.Product;
import com.jgl.service.ProductService;
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService;
/**
* 獲取所有商品列表
* @param request
* @return
*/
@RequestMapping("/getAllProduct")
public String getAllProduct(HttpServletRequest request,Model model){
List<Product> product = productService.findAll();
model.addAttribute("productList", product);
request.setAttribute("productList", product);
return "/allProduct";
}
/**
* 跳轉到添加商品界面
* @param request
* @return
*/
@RequestMapping("/toAddProduct")
public String toAddProduct(){
return "/addProduct";
}
/**
* 添加商品並重定向到展示所有商品頁面
* @param product
* @param request
* @return
*/
@RequestMapping("/addProduct")
public String addProduct(Product product,Model model){
productService.save(product);
return "redirect:/product/getAllProduct";
}
/**
*編輯商品
* @param product
* @param request
* @return
*/
@RequestMapping("/updateProduct")
public String updateProduct(Product product,HttpServletRequest request,Model model){
if(productService.update(product)){
product = productService.findById(product.getId());
request.setAttribute("product", product);
model.addAttribute("product", product);
return "redirect:/product/getAllProduct";
}else{
return "/error";
}
}
/**
* 根據id查詢單個商品
* @param id
* @param request
* @return
*/
@RequestMapping("/getProduct")
public String getProduct(int id,HttpServletRequest request,Model model){
request.setAttribute("product", productService.findById(id));
model.addAttribute("product", productService.findById(id));
return "/editProduct";
}
/**
* 刪除商品
* @param id
* @param request
* @param response
*/
@RequestMapping("/delProduct")
public String deleteProduct(int id,HttpServletRequest request,HttpServletResponse response){
productService.delete(id);
return "redirect:/product/getAllProduct";
}
}
4.2 業務層開發 :先來2個包com.jgl.service; com.jgl.service.impl;
創建一個ProductService接口,ProductServiceImpl實現類
ProductService.java代碼如下
package com.jgl.service;
import java.util.List;
import com.jgl.model.Product;
public interface ProductService {
void save(Product product);
boolean update(Product product);
boolean delete(int id);
Product findById(int id);
List<Product> findAll();
}
ProductServiceImpl.java代碼如下
package com.jgl.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jgl.mapper.ProductMapper;
import com.jgl.model.Product;
import com.jgl.service.ProductService;
@Service
@Transactional
public class ProductServiceImpl implements ProductService{
@Resource
private ProductMapper mapper;
/**
* 根據 id 刪除 數據
*/
public boolean delete(int id) {
return mapper.delete(id);
}
/**
* 查詢User的全部數據
*/
public List<Product> findAll() {
List<Product> findAllList = mapper.findAll();
return findAllList;
}
/**
* 根據 id 查詢 對應數據
*/
public Product findById(int id) {
Product user = mapper.findById(id);
return user;
}
/**
* 新增數據
*/
public void save(Product user) {
mapper.save(user);
}
/**
* 根據 id 修改對應數據
*/
public boolean update(Product user) {
return mapper.update(user);
}
}
4.3 數據訪問層開發 先來個包com.jgl.mapper;
創建ProductMapper.java,並在同一個包中創建ProductMapper.xml
ProductMapper.java代碼如下:
package com.jgl.mapper;
import java.util.List;
import com.jgl.model.Product;
public interface ProductMapper {
void save(Product product);
boolean update(Product product);
boolean delete(int id);
Product findById(int id);
List<Product> findAll();
}
ProductMapper.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:必須與對應的接口全類名一致 ProductMapper.java
id :必須與對應接口的某個對應的方法名一致即必須要和ProductMapper.java接口中的方法同名。
-->
<mapper namespace="com.jgl.mapper.ProductMapper">
<insert id="save" parameterType="Product">
insert into product(p_name,p_price,p_number) values(#{pName},#{pPrice},#{pNumber})
</insert>
<update id="update" parameterType="Product">
update product set p_name=#{pName},p_price=#{pPrice},p_number=#{pNumber} where p_id=#{id}
</update>
<delete id="delete" parameterType="int">
delete from product where p_id=#{id}
</delete>
<!-- mybsits_config中配置的alias類別名,也可直接配置resultType爲類路徑 -->
<select id="findById" parameterType="int" resultType="Product">
select p_id id,p_name pName,p_price pPrice,p_number pNumber from product where p_id=#{id}
</select>
<select id="findAll" resultType="Product">
select p_id id,p_name pName,p_price pPrice,p_number pNumber from product
</select>
</mapper>
5.所需的配置文件
log4j.properties代碼如下:
### set log levels ###
log4j.rootLogger = info , Console , D
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=INFO
#output2file
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D\:/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO \#\# \u00E8\u00BE\u0093\u00E5\u0087\u00BAinfo\u00E7\u00BA\u00A7\u00E5\u0088\u00AB\u00E4\u00BB\u00A5\u00E4\u00B8\u008A\u00E7\u009A\u0084\u00E6\u0097\u00A5\u00E5\u00BF\u0097
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
mybatis-config.xml中代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 實體類,簡稱 -設置別名 -->
<typeAliases>
<typeAlias alias="Product" type="com.jgl.model.Product" />
</typeAliases>
<!-- 實體接口映射資源 -->
<!--
說明:如果xxMapper.xml配置文件放在和xxMapper.java統一目錄下,mappers也可以省略,因爲org.mybatis.spring.mapper.MapperFactoryBean默認會去查找與xxMapper.java相同目錄和名稱的xxMapper.xml
-->
<mappers>
<mapper resource="com/jgl/mapper/ProductMapper.xml" />
</mappers>
</configuration>
spring-common.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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- Mybatis和Spring的整合 -->
<!-- 1. 數據源 : DriverManagerDataSource -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<!--
2. mybatis的SqlSession的工廠: SqlSessionFactoryBean dataSource:引用數據源
MyBatis定義數據源,同意加載配置
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!--
3. mybatis自動掃描加載Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory
basePackage:指定sql映射文件/接口所在的包(自動掃描)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jgl.mapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!--
4. 事務管理 : DataSourceTransactionManager dataSource:引用上面定義的數據源
-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 5. 使用聲明式事務
transaction-manager:引用上面定義的事務管理器
-->
<tx:annotation-driven transaction-manager="txManager" />
</beans>
spring-mvc.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/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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 註解掃描包 -->
<context:component-scan base-package="com.jgl.controller" />
<context:component-scan base-package="com.jgl.service" />
<!-- 開啓註解 -->
<mvc:annotation-driven />
<!--
配置靜態資源,直接映射到對應的文件夾,不被DispatcherServlet處理,3.04新增功能,需要重新設置spring-mvc-3.0.xsd
-->
<mvc:resources mapping="/img/**" location="/img/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/html/**" location="/html/" />
<!-- 定義跳轉的文件的前後綴 ,視圖模式配置-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 這裏的配置我的理解是自動給後面action的方法return的字符串加上前綴和後綴,變成一個 可用的url地址 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
效果如下: