博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSM框架——SpringMVC+Spring+Mybatis搭建教程
阅读量:4581 次
发布时间:2019-06-09

本文共 18578 字,大约阅读时间需要 61 分钟。

一、概述

  • Spring: Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地`new`一个对象,而是让Spring框架帮你来完成这一切。
  • SpringMVC: SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
  • Mybatis: mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

二、项目搭建

1.开发环境

  Eclipse + Tomcat8 + JDK1.8 + maven + ORACLE

2.使用maven管理项目

  使用以下命令创建webapp项目,使用命令要注意,系统安装了Maven,并配置好了环境变量!

mvc archetype:generate -DgroupId=com.osgc -DartifactId=MobileProducts -DarchetypeArtifactId=maven-archetype-webapp

3.搭建SSM项目

  1).导入项目,添加依赖

  在Eclipse中右键导入刚刚创建的项目,创建的项目中一般默认有【src/main/java】,若是没有需要手动创建【src/main/java】、【src/main/resources】、【src/test/java】文件夹

  项目目录结构如下:

  

  配置pom.xml引用jar包

4.0.0
com.osgc
MobileProducts
war
1.0-SNAPSHOT
MobileProducts Maven Webapp
http://maven.apache.org
4.1.3.RELEASE
3.2.6
1.7.25
1.2.17
1.0.0
org.springframework
spring-core
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-test
${spring.version}
test
org.springframework
spring-webmvc
${spring.version}
ojdbc6
ojdbc6
${ojdbc.version}
c3p0
c3p0
0.9.1.2
com.alibaba
druid
1.0.9
com.alibaba
fastjson
1.2.6
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
ch.qos.logback
logback-classic
1.1.2
ch.qos.logback
logback-core
1.1.2
org.logback-extensions
logback-ext-spring
0.1.1
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
javax.servlet
javax.servlet-api
3.1.0
javax.servlet.jsp
javax.servlet.jsp-api
2.3.2-b01
javax.servlet
jstl
1.2
junit
junit
4.12
test
MobileProducts
org.eclipse.jerry
jetty-maven-plugin
9.2.2.v20140723

  通过mybatis自动生成代码:

    (1)下载需要的文件及jar包

      

      

    (2)配置generatorConfig.xml文件

  

    (3)双击运行【mybatis自动生成类命令.bat】文件即可,运行成功就可以在src目录下找到生成的文件,每一个数据库表就会对应三个文件(实体类、接口、配置文件)

     

  生成代码后的目录结构

  

  2).Spring与Mybatis整合

    添加以下配置文件

    

    ojdbc.properties

ojdbc_driverClassName =oracle.jdbc.driver.OracleDriverojdbc_url=jdbc:oracle:thin:@127.0.0.1:1521:osgcojdbc_username=osgcojdbc_password=osgc

    applicationContext.xml

    spring-mybatis.xml

 

 

 

    logback.xml

   测试配置是否成功

  IGoodsService.java

package com.osgc.web.service.goods;import com.osgc.web.bean.goods.Goods;public interface IGoodsService {    public Goods selectByPrimaryKey(Long goodsid);}

  GoodsService.java

package com.osgc.web.service.goods;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.osgc.web.basedao.goods.GoodsMapper;import com.osgc.web.bean.goods.Goods;@Service@Transactional(rollbackFor=Exception.class)public class GoodsService implements IGoodsService {        @Autowired    public GoodsMapper mapper ;    @Override    public Goods selectByPrimaryKey(Long goodsid) {        return mapper.selectByPrimaryKey(goodsid);    }    }

  GoodsServiceTest.java

package com.osgc.web.test;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.osgc.web.bean.goods.Goods;import com.osgc.web.service.goods.IGoodsService;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration({
"classpath:applicationContext.xml"})public class GoodsServiceTest { @Autowired public IGoodsService service; @Test public void getUserByIdTest(){ Goods goods = service.selectByPrimaryKey(1L); System.out.println(goods.getGoodsname()); } }

  3).整合SpringMVC

    (1)springmvc相关配置需要编写再spring-mvc.xml文件中

json=application/json xml=application/xml html=text/xml

      (2) 在web.xml中添加SpringMVC启动配置,编写jsp

       web.xml

MobileProducts
contextConfigLocation
classpath:applicationContext.xml
StringEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
StringEncodingFilter
/*
logbackConfigLocation
classpath:logback.xml
ch.qos.logback.ext.spring.web.LogbackConfigListener
org.springframework.web.context.ContextLoaderListener
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
dispatcherServlet
/
index.jsp

      index.jsp

<%@ page contentType="text/html; charset=utf-8"%>

Hello World!

     (4)启动Tomcat测试,启动成功后,访问http://localhost:8080/MobileProducts/(其中8080为Tomcat的端口号),页面显示 "Hello World!" 就表示项目配置成功

  4).编写Controller及业务页面

    这里我考虑到了前后端分离,所以示例也是以前后端分离的方式编写的,页面通过ajax请求controller,controller 通过传入的参数goodsid 查询信息并返回页面

    @Controller和@RestController的区别:  

    如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

    因此@RestController注解就相当于@Controller + @ResponseBody 联合使用

    GoodsController.java

package com.osgc.web.controller.goods;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import com.osgc.web.bean.goods.Goods;import com.osgc.web.service.goods.IGoodsService;@RestController@RequestMapping(value="/goods")public class GoodsController {    @Autowired    private IGoodsService service;        @RequestMapping(value="/showname",method=RequestMethod.POST)    public String showGoodsName(@RequestParam("goodsid") Long goodsid,HttpServletRequest request,Model model){        System.out.println("showname");        Goods goods = service.selectByPrimaryKey(goodsid);        if(goods != null){            System.out.println(goods.getGoodsname());            return "{\"name\":\""+goods.getGoodsname()+"\"}";        }        System.out.println("没有找到该商品!");return "error";    }    }

      showName.html

showname

Welcome

访问此页面

      需要注意的是html页面的存放位置

   

  5).处理Controller返回数据中文乱码问题

    在spring-mvc.xml文件中加入以下信息即可

  
application/json;charset=utf-8
text/html;charset=utf-8
application/x-www-form-urlencoded

 

   至此,一个基于SSM框架的前后端分离的Web项目就搭建完毕了

4.解决前后端分离出现的跨域问题

  1).编写过滤器CorsFilter.java

package com.osgc.web.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import com.osgc.web.service.util.StringUtil;/** * 跨域访问处理 * 解决前后端分离架构中的跨域问题 * @author 李芊芊 * */public class CorsFilter implements Filter {        @SuppressWarnings("unused")    private static final Logger logger = LoggerFactory.getLogger(CorsFilter.class);    @SuppressWarnings("unused")    private String allowOrigin;    private String allowMethods;    private String allowCredentials;    private String allowHeaders;    private String exposeHeaders;            @Override    public void init(FilterConfig filterConfig) throws ServletException {        allowOrigin = filterConfig.getInitParameter("allowOrigin");        allowMethods = filterConfig.getInitParameter("allowMethods");        allowCredentials = filterConfig.getInitParameter("allowCredentials");        allowHeaders = filterConfig.getInitParameter("allowHeaders");        exposeHeaders = filterConfig.getInitParameter("exposeHeaders");    }    /**      * @description 通过CORS技术实现AJAX跨域访问,只要将CORS响应头写入response对象中即可       * @param req     * @param res     * @param chain     * @throws IOException     * @throws ServletException          * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)          */    @Autowired    @Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)            throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) req;          HttpServletResponse response = (HttpServletResponse) res;         String currentOrigin = request.getHeader("Origin");         response.setHeader("Access-Control-Allow-Origin", currentOrigin);          /**         * Access-Control-Allow-Origin:允许访问的客户端域名,例如:http://web.xxx.com,若为*,则表示从任意域都能访问,即不做任何限制。         * Access-Control-Allow-Methods:允许访问的方法名,多个方法名用逗号分割,例如:GET,POST,PUT,DELETE,OPTIONS。         * Access-Control-Allow-Credentials:是否允许请求带有验证信息,若要获取客户端域下的cookie时,需要将其设置为true。         * Access-Control-Allow-Headers:允许服务端访问的客户端请求头,多个请求头用逗号分割,例如:Content-Type。         * Access-Control-Expose-Headers:允许客户端访问的服务端响应头,多个响应头用逗号分割。         */                if (StringUtil.isNullOrEmpty(allowMethods)) {              response.setHeader("Access-Control-Allow-Methods", allowMethods);          }          if (StringUtil.isNullOrEmpty(allowCredentials)) {              response.setHeader("Access-Control-Allow-Credentials", allowCredentials);          }          if (StringUtil.isNullOrEmpty(allowHeaders)) {             response.setHeader("Access-Control-Allow-Headers", allowHeaders);          }          if (StringUtil.isNullOrEmpty(exposeHeaders)) {              response.setHeader("Access-Control-Expose-Headers", exposeHeaders);          }          chain.doFilter(req, res);            }    @Override    public void destroy() {        // TODO Auto-generated method stub    }}

  2).在web.xml中加载过滤器,添加如下代码

corsFilter
com.osgc.web.filter.CorsFilter
allowOrigin
*
allowMethods
GET,POST,PUT,DELETE,OPTIONS
allowCredentials
true
allowHeaders
Content-Type
corsFilter
/*

 

至此,SSM三大框架整合已全部完成了

参考:

源代码:

转载于:https://www.cnblogs.com/circle-quan/p/10432400.html

你可能感兴趣的文章
软工实践练习一——个人
查看>>
类中实现 Dispose And Finalize
查看>>
1.6——周总
查看>>
sublime 用到的插件
查看>>
gnats配置文件
查看>>
进度条
查看>>
c3p0连接池
查看>>
python 读取并显示图片的两种方法
查看>>
strtol,strtoll,strtoul, strtoull字符串转化成数字
查看>>
决策树笔记:使用ID3算法
查看>>
WPF 可视化树的用途
查看>>
【CUDA 基础】6.3 重叠内和执行和数据传输
查看>>
Linux - 重定向与管道
查看>>
性能测试学习随笔
查看>>
mysql 5.7.12的 zip安装
查看>>
Oracle-SQL高级查询
查看>>
DevExpress中获取RichTextEdit中RichEditControl的两种方式
查看>>
Bloom Filter
查看>>
天津政府应急系统之GIS一张图(arcgis api for flex)讲解(七)地图打印模块
查看>>
equals & ==
查看>>