ssm框架

最近复习到java框架这块时,想起大学自学的mybatis、spring、springmvc三大框架时走过的坑,那时候在融合着三个框架时走了很多弯路,现在复习一下自己是怎么搭建开发架构的。
一、mybatis作为项目开发框架的持久层框架,主要负责对数据库的连接实现,相比较传统的jdbc编程,mybatis的有事显而易见,无序频繁创建和释放连接、SQL语句分离、自动将java对象映射到SQL语句儿遍历结果集时又自动映射到java对象中
二、spring框架作为项目的数据源注入框架,它对常用的api做了一些封装,帮我们管理项目中的一些依赖,大大降低了项目的耦合度,其中的IOC容器是spring容器的核心,负责控制反转解耦。spring里的aop编程思想会对项目中的一些事物、权限和日志等形成切面,集中管理,使得我们的代码变得优雅简洁。
三、springmvc框架对数据流进行控制并通过视图解析向客户端响应视图页面
四、maven是一个项目管理的综合工具,在我的所有大学期间开发中都是用maven来管理项目的。该管理工具简化了项目的依赖管理,使得项目结构变得统一,有助于多模块的开发,一个模块开发好后直接发布到仓库,依赖该模块是可以直接从仓库更新而不用自己去编译

三大框架搭建时我首先将spring和springmvc进行融合,因为springmvc本质上就是从spring来的,它们具有天然融合的优势,所以讲这两个框架融合后在考虑mybatis的加入。
首先我们使用maven构建一个web项目,名字为ssm01。构建成功后右击项目选择properties对项目结构进行一些配置调整,在buildpath里添加检查一些运行环境(jre、maven、web app Libraries、Tomcat等);将编码方式改为utf-8;在project Facets里将Dynamic web module设置为3.1版本,这样看着jsp页面结构更加舒服;在server里添加服务器环境Tomcat8.0

下面是融合代码
pom.xml:配置一些项目的jar包和依赖(包括log4j日志、Junit单元测试)

<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.wyj.ssm</groupId>
  <artifactId>ssmmine01</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>ssmmine01 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.18.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.18.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
    <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.18.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.6</version>
</dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
</dependency>
<!-- mybatis整合sping-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
<!-- mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.40</version>
</dependency>
<!-- c3p0 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
  </dependencies>
  <build>
    <finalName>ssmmine01</finalName>
  </build>
</project>

web.xml:配置项目的监听器和核心拦截类DispatcherServlet拦截所有请求

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ssmmine01</display-name>
<!-- needed for ContextLoaderListener -->
<!-- 监听项目的创建和销毁,依据此来创建和销毁ioc容器-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring.xml</param-value>
	</context-param>

	<!-- Bootstraps the root web application context before servlet initialization -->
	<!--spring实现的ServletContextListener类,会在web应用初始化的时候创建IOC容器并装配
	项目启动按照配置文件指定的位置创建容器,项目卸载,销毁容器(jar包+类)-->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
	<!-- 配置核心类,拦截所有请求 -->
	<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:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<!-- 请求路径,/代表所有 -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>  
</web-app>

speingmvc.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.3.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.3.xsd">
<!-- 基础扫描包,注解-->
<context:component-scan base-package="com.wyj"></context:component-scan>

<!-- 配置资源视图解析 ,发送请求时跳转到jsp页面需要通过视图解析器渲染到对应jsp页面,与返回值相关-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- @ResponseBody(json的jar包)和该配置可以跳过视图解析器 -->
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
</beans>

spring-dao.xml:配置c3p0连接池和session工厂,将Mapper接口的代理注入到spring中

<?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-4.3.xsd">

<!-- 导入外部数据库相关信息driver,url,user,password等 -->
<context:property-placeholder location="classpath:dbconfig.properties"/>

<!-- 外部属性文件 -->
<!--c3p0是一种jdbc数据库连接池。那么为什么使用数据库连接池呢?因为数据库连接是一种关键的、有限的、昂贵的资源。
传统的模式(如传统的java web项目中,servlet的beans中建立数据库连接),每次连接都需要验证用户,消耗了大量的时间和资源。
而数据库连接池在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出
一个已经建立的空闲连接对象。使用完毕后,用户不关闭连接,而是将数据库连接对象放回连接池中。数据库连接池管理数据连接的建立、断开,同时
监视数据库连接数量和使用情况。使用数据库连接池会显著提高整个应用程序的伸缩性(大大提高了连接数量)和健壮性
(能够应对大量用户频繁连接数据库,减少系统资源的消耗),提高应用程序的性能指标。 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${driver}"/>
    <property name="jdbcUrl" value="${url}"/>
    <property name="user" value="${user}"/>
    <property name="password" value="${password}"/>
     <property name="initialPoolSize" value="10"></property>  
        <property name="maxIdleTime" value="30"></property>  
        <property name="maxPoolSize" value="100"></property>  
        <property name="minPoolSize" value="10"></property>  
        <property name="maxStatements" value="200"></property>  
</bean>

<!-- sqlSessionFactory由mybatis创建,并且要配置mybatis需要的全局配置和映射配置地址 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- jdbc的DataSource -->
  <property name="dataSource" ref="dataSource" />
  <!-- 加载mapper映射配置文件的地址,classpath表示发布路径 -->
   <property name="mapperLocations" value="classpath:mybatismapper.xml"/>
   <!-- 加载全局配置文件的地址 -->
   <property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>

<!-- 装载接口扫描,将mapper接口生成代理注入到spring中,代理创建在runtime中映射器必须是接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.wyj.dao" />
</bean>
</beans>

当然,在连接池之前需要一个dbconfig.properties配置文件配置数据库的一些信息:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssm
user=root
password=19971227

mybatisconfig.xml:配置mybatis的缓存和一些基础配置

<?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>

  <settings>
  <!--setting:mybatis的一些设置:比如缓存、懒加载等等 -->
  <setting name="cacheEnabled" value="true"/>
  </settings>
</configuration>

mybatismapper.xml:主要写SQL语句同过namespace接口映射到对应javabean中,设置二级缓存

<?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">
  <!-- 映射到接口 -->
 <mapper namespace="com.wyj.dao.OnepieceDao">
 <!-- 缓存设置 -->
 <cache></cache>
 
 <select id="findByid" resultMap="luffy">
 select * from onepiece where id=#{id}
 </select>
 <resultMap type="com.wyj.bean.Onepiece" id="luffy">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<result column="hobby" property="hobby"/>
</resultMap>
 </mapper>

好了,到这里基本框架搭建完成,我们来测试一下:
首先建一个pojo对象记得添加序列化实现,加上get和set方法以及无参构造哦:

public class Onepiece implements Serializable {
private int id;
private String name;
private String sex;
private int age;
private String hobby;

这个是dao层

public interface OnepieceDao {
	public Onepiece findByid(int id);
}

service层:

@Service
public class OnepieceService {
	@Autowired
	private OnepieceDao dao;
	//调用接口方法
	public Onepiece findbyID(int id){
		return dao.findByid(id);
	}
}

action层:加入@ResponseBody注解,这样我们就可以不用建jsp页面了

@Controller
public class OnepieceAction {
	@Autowired
	private OnepieceService service;
	
	@ResponseBody//不走视图解析,直接写入输入流,通过response对象的body区返回给前台数据(格式一般为json或xml)
	@RequestMapping("/findbyid")
	public Onepiece findByid(@RequestParam("id")int id){
		Onepiece onepiece= service.findbyID(id);
		return onepiece;
	} 
}

测试:返回了onepiece,宽假搭建成功,好了这是我的习惯方法,大神路过可以多多指点。

除此之外,后面做项目时用到了一些shiro,jstl,分页插件和发送邮件时,可以在pom.xml中添加必要的依赖

<!-- jstl标签库-->
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- shiro -->
       <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
             <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
             <version>1.3.2</version>
        </dependency>
        <!-- 分页插件 -->
        <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.6</version>
</dependency>
<!-- 发送邮件-->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

到这里就是我的一些总结,作为初学者可以共勉,大神可以多多指点(>< … ><)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值