久没有写博客了, 今年事情太多了, 也没了心思. 去深圳出差, 转java, 更重要的结婚的事情, 一茬接一茬. 好在最近闲暇一些, 就想记录一些曾经困扰过我的问题(现在用spring boot真是太方便了, 很多问题, 都不会再是问题).SSM(spring + springm ...
久没有写博客了, 今年事情太多了, 也没了心思. 去深圳出差, 转java, 更重要的结婚的事情, 一茬接一茬. 好在最近闲暇一些, 就想记录一些曾经困扰过我的问题(现在用spring boot真是太方便了, 很多问题, 都不会再是问题).
SSM(spring + springmvc + mybatis), 是一款非常流行的框架. 所以把这款框架搭建起来, 也是开发的一项基本功.
SSM的整合, 分为两部分:
一部分是 spring与springmvc间的整合,
一部分是 spring与mybatis间的整合.
其实, 也应该是这样, 因为 springmvc与mybatis间, 没有任何关系. 都只是与spring有关系.
初步的目录结构:
不管是用eclipse还是用idea, 都是使用maven来管理jar包, 且把引用放在pom.
ssh, ssm 框架的 pom.
一. jar包引入
<properties> <spring.version>4.3.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- spring核心包 --> <dependency> <groupId>org.springframework</groupId> <!--包含Spring 框架基本的核心工具类--> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <!--所有应用都用到,包含访问配置文件,创建和管理bean等,是Spring IOC的基础实现--> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <!--提供在基础IOC功能上的扩展服务--> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <!--Spring提供的对AspectJ框架的整合--> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <!--Spring的面向切面编程,提供AOP(面向切面编程)的实现--> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <!-- springmvc相关的spring包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!--spring数据库相关包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <!--对象的--> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <!--用于在Spring 中集成AspectJ AspectJ LTW织入器--> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.10</version> </dependency> <!-- mybatis/spring包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.0</version> </dependency> <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.38</version> </dependency> <!-- 日志包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.20</version> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.18</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.5</version> </dependency> <!--jackson包是springmvc返回json数据时用到的--> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.faster</groupId> <artifactId>jackson-core</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>com.faster</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.2</version> </dependency> <dependency> <groupId>com.faster</groupId> <artifactId>jackson-annotations</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.1.GA</version> </dependency> </dependencies> <build> <finalName>ssm</finalName> <plugins> <!--解决idea中java compile 和 language level在更新pom文件后,重置到5的版本--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
上面的包, 还包含了mybatis的包, 到整合mybatis的时候, 就不会再写一遍pom.
二. web.
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:conf/application.</param-value> </context-param> <!--解决post乱码问题--> <filter> <filter-name>encodingFilter</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> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置spring启动listener入口 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--springmvc入口servlet--> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--contextConfigLocation如果不配置, 则会按照默认的方式去找文件, 如果找不到, 则会抛出异常, 所以这里推荐还是要写一下. 我这里配置的空, 因为在前面application.--> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
在application.
<??><beans ="http://www.springframework.org/schema/beans" ="http://www.w3.org/2001/ ="http://www.springframework.org/schema/context" ="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans > default-lazy-init="true"> <!-- 自动搜索bean --> <context:annotation-config /> <!-- 开启注解 --> <mvc:annotation-driven/> <context:component-scan base-package="org.elvin.ssm" /> <import resource="classpath:conf/spring-mvc. />
<!--在进行mybatis的整合的时候, 这句话要注释回去--> <!--<import resource="classpath:conf/spring-mybatis.--></beans>
三. springmvc配置文件: spring-mvc.
<??><beans ="http://www.springframework.org/schema/beans" ="http://www.springframework.org/schema/context" ="http://www.springframework.org/schema/mvc" ="http://www.w3.org/2001/ xsi:schemaLocation="http://www.springframework.org/schema/beans >> <!-- 注解扫描包 --> <context:component-scan base-package="org.elvin.ssm.controller" > <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> </context:component-scan> <!-- 开启注解 --> <!--<mvc:annotation-driven/>--> <!--静态资源访问--> <mvc:default-servlet-handler /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp" /> </bean> <!-- 避免IE在ajax请求时,返回json出现下载 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean></beans>
配置文件就暂时到这里了, 接下来看一下java代码
四. java代码
在controller文件夹下, 加入一个控制器: HelloController.java
package org.elvin.ssm.controller;import org.elvin.ssm.pojo.*;import org.elvin.ssm.utils.CollectionUtilsLocal;import org.joda.time.DateTime;import org.springframework.stereotype.Controller;import org.springframework.ui.*;import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;import java.util.*;/** * author: Elvin * datetime: 2017/11/29 20:06 * description: */@Controller@RequestMapping("hello")public class HelloController { @GetMapping("index") public String index(ModelMap model){ List<Book> bookList = getBookList(); model.put("bookList",bookList); return "index"; } @RequestMapping(value = "book", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public Book book(@RequestParam("id") Integer id){ List<Book> bookList = getBookList(); Book b = CollectionUtilsLocal.findOneBy(bookList, n -> n.getId().equals(id)); return b; } //region private method private List<Book> getBookList(){ List<Book> bookList = new ArrayList<>(); String[] nameStrs = {"吴", "一", "雪", "动", "额", "阿", "前", "里", "排"}; Random r = new Random(); String timeStr = new DateTime().toString("yyyy-MM-dd HH:mm:ss"); for (int i = 0; i < 10 ; i++){ Book b = new Book(); b.setId(i+1); b.setName(nameStrs[r.nextInt(5)] + nameStrs[r.nextInt(9)]); b.setPublishTime(timeStr); b.setPrice(r.nextInt(100)); bookList.add(b); } return bookList; } //endregion}
这里有个帮助类, 顺手也贴出来, 期望达到的目的就是, 拷贝下来, 就能直接跑起来, 不需要调试
CollectionUtilsLocal.java
package org.elvin.ssm.utils;import java.util.*;import java.util.function.Predicate;/** * author: Elvin * Date: 2017/11/30 9:33 * Description: */public class CollectionUtilsLocal { /** * 功能描述:list去重 **/ public static void removeDuplicateWithOrder(List list) { Set set = new HashSet(); List newList = new ArrayList(); for (Iterator iter = list.iterator(); iter.hasNext(); ) { Object element = iter.next(); if (set.add(element)){ newList.add(element); } } list.clear(); list.addAll(newList); } /** * 判断list是否为空,包括对象为null,内容为空 * * @param list * @return true 代表不为空,false代表为空*/ @SuppressWarnings("rawtypes") public static boolean isNotNullList(List list) { if (null != list && (!list.isEmpty())) { return true; } return false; } /** * 判断集合是否是null或者空集合 * @param list * @return */ public static boolean isNullOrEmptyList(List list){ if(list == null || list.isEmpty()){ return true; } return false; } /** * @param map * @return true 代表不为空,false代表为空 * @Title: isNotNullMap * @Description: 校验map是否为空 * @Since: 2017年6月12日下午1:15:31 */ @SuppressWarnings("rawtypes") public static boolean isNotNullMap(Map map) { if (null != map && !map.isEmpty()) { return true; } return false; } /** * 根据条件删除集合中的元素 * @param list 待删除元素的集合 * @param predicate 条件 * @param <T> * @return */ public static <T> List<T> removeAll(List<T> list, Predicate<T> predicate){ if (!isNotNullList(list)) { return null; } List<T> resList = new ArrayList<>(); for (T item : list) { if (!predicate.test(item)) { resList.add(item); } } return resList; } /** * 根据查询条件查找满足条件的数据,并返回 * * @param list 要查找的集合 * @param predicate 查找的条件 * @param <T> * @return */ public static <T> T findOneBy(List<T> list, Predicate<T> predicate) { if (!isNotNullList(list)) { return null; } for (T item : list) { if (predicate.test(item)) { return item; } } return null; } /** * 根据条件查找集合中所有的数据 * @param list 待查找集合 * @param predicate 条件 * @param <T> * @return */ public static <T> List<T> findAllBy(List<T> list, Predicate<T> predicate) { if (!isNotNullList(list)) { return null; } List<T> resList = new ArrayList<>(); for (T item : list) { if (predicate.test(item)) { resList.add(item); } } return resList; }}
在pojo文件夹下, 加入一个实体文件: Book.java
package org.elvin.ssm.pojo;/** * author: Elvin * datetime: 2017/11/29 20:46 * description: */public class Book { private Integer id; private String name; private Integer price; private String publishTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public String getPublishTime() { return publishTime; } public void setPublishTime(String publishTime) { this.publishTime = publishTime; }}
五. 前台代码
在jsp文件夹下加入一个index.jsp文件
<%-- Created by IntelliJ IDEA. User: Elvin Date: 2017/11/30 Time: 9:17 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><%@ taglib prefix="c" uri="" %><html><head> <title>Title</title></head><body> <h1>ssm</h1><table> <thead> <tr> <td>id</td> <td>name</td> <td>price</td> <td>publishTime</td> </tr> </thead> <tbody> <c:if test="${bookList!=null && bookList.size()>0}"> <c:forEach var="item" items="${bookList}"> <tr> <td>${item.id}</td> <td>${item.name}</td> <td>${item.price}</td> <td>${item.publishTime}</td> </tr> </c:forEach> </c:if> </tbody></table></body></html>
六. 结果展示
1. 访问页面:
2. 访问数据
如果想让springmvc直接返回数据, 要注意几点
1. 要引入 jackson 的jar包, springmvc没有提object to json 的功能
2. 在springmvc的配置文件中, 要加上 <mvc:annotation-driven/>
3. 在controller控制器的action方法上面加上 @ResponseBody 注解
3. 访问静态资源
想要访问静态资源, 需要加上 <mvc:default-servlet-handler /> , 或者自己配置一些资源, 否则是不能访问到的.
原标题:SSM整合: spring 与 springmvc 整合
关键词:Spring
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。