-
?:最近在学springboot,惊叹springboot的方便,也对一些注解的使用有些迷惑,说到底是之前学过的已经忘得七七八八,决定对ssh ssm springmvc+mybatis这些整合再一次进行了解,记录下来以便不时之需。同时练习一下使用maven和git管理项目。废话不多说,让我们开始吧
-
?:首先是ssh框架的整合,这里我先使用eclipse吧,idea还不是很熟悉
…两天过去了,最后我还是选择了用idea,因为eclipse在提示代码错误方面感觉不如idea,而且tomcat的配置很莫名奇妙,这条路走不通,就试着换了一条,那么,让我们开始了解如何使用maven来实现ssh的整合吧 -
首先按照习惯,我们会将项目分为三层,dao持久层(包括实体)、service业务层以及controller控制层,另外项目所需要的jar包由聚合项目管理。
-
具体步骤:
①创建maven聚合项目(packing是pom的项目),new一个maven项目
聚合项目创建完毕
②在pom.xml文件中添加ssh整合所需的jar包依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.4.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.springframework/spring
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/antlr/antlr -->
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.7.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations -->
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>5.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
<version>2.0.5.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.15.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ognl/ognl -->
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
</dependencies>
找这些依赖的任务可真是烦琐,一次还误删了,而且版本的问题也很多,确实是十分烦人啊。
言归正传,在聚合项目的pom.xml文件中,你好可以利用properties标签来统一管理版本号,我这里太多依赖,就不展示了。
③创建负责dao层的子项目
选中你的聚合项目
finish完成创建
④编写dao层代码,并利用spring依赖注入实现解耦
4.1编写User实体类
package shiqi.model;
/**
* 用户名模块实体类: CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT,
* `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL,
* `name` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `phone`
* varchar(255) DEFAULT NULL, `addr` varchar(255) DEFAULT NULL, `state` int(11)
* DEFAULT NULL, `code` varchar(64) DEFAULT NULL, PRIMARY KEY (`uid`) )
* ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
*/
public class User {
private Integer uid;
private String username;
private String password;
private String name;
private String email;
private String phone;
private String addr;
private Integer state;
private String code;
public User() {
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
4.2 配置hibernate映射文件(User.hbm.xml),放在resources目录下
代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="shiqi.model.User" table="user">
<id name="uid">
<generator class="native"/>
</id>
<property name="username" column="username"/>
<property name="password" column="password"/>
<property name="name" column="name"/>
<property name="email" column="email"/>
<property name="phone" column="phone"/>
<property name="addr" column="addr"/>
<property name="state" column="state"/>
<property name="code" column="code"/>
</class>
</hibernate-mapping>
4.3 编写UserDao接口
package shiqi.dao;
import shiqi.model.User;
public interface UserDao {
// 查找用户
public User selectUserById();
}
4.4 编写UserDao接口实现类
package shiqi.daoImpl;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import shiqi.dao.UserDao;
import shiqi.model.User;
import java.util.List;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
/*
* 查询id为8的用户
*/
public User selectUserById() {
String hql = "from User where uid = 8";
List list = this.getHibernateTemplate().find(hql);
return (User) list.get(0);
}
/*
set方法注入sessionFactory,记得加上,不然会报找不到sessionFactoryBean的错误
*/
public void setS(SessionFactory sessionFactory) {
this.setSessionFactory(sessionFactory);
}
}
4.5 别忘了配置hibernate.conf文件,这一部分文件移至spring配置文件,也放在resources目录下 applicationContext-dao.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd" default-autowire="byName">
<!-- 配置连接池: -->
<!-- 引入外部属性文件,记得自己导入哦 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置C3P0连接池: -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Hibernate的相关信息 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置Hibernate的其他的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
<!-- 配置Hibernate的映射文件 -->
<property name="mappingResources">
<list>
<value>User.hbm.xml</value>
</list>
</property>
</bean>
<!--配置hibernate模板-->
<bean id="HibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userDao" class="shiqi.daoImpl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
注意:数据库的配置自己根据自己数据库信息输入。
至此,dao层的编码基本结束,项目结构如下:
⑤开始编写业务service层
5.1 按照创建dao层的方法创建service层
项目创建完毕
5.2 因为service要调用dao,所以需要在pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ssh-parent</artifactId>
<groupId>shiqi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssh-service</artifactId>
<dependencies>
<!-- 添加依赖 -->
<dependency>
<artifactId>ssh-dao</artifactId>
<groupId>shiqi</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
5.3 编写UserService接口
package shiqi.service;
import org.springframework.transaction.annotation.Transactional;
import shiqi.model.User;
@Transactional
public interface UserService {
// 查找用户
public User selectUserById();
}
5.4 编写UserService的实现类
package shiqi.serviceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import shiqi.dao.UserDao;
import shiqi.model.User;
import shiqi.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public User selectUserById() {
// TODO Auto-generated method stub
return userDao.selectUserById();
}
/*
set方法注入bean
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
5.5 别忘了配置spring配置文件
applicationContext-service.xml,也是放在resources下
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd" default-autowire="byName">
<!-- 引入dao层 -->
<import resource="applicationContext-dao.xml" />
<!-- 事务管理: -->
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!--service的配置-->
<bean id="userService" class="shiqi.serviceImpl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
至此,service层编写完毕,项目结构如下:
⑥进行控制层controller的编写
6.1 创建controller,注意控制层是个web项目,创建方式跟前面两个有些区别
next-next-finish创建完毕,项目结构如下
6.2 首先因为要调用service的方法,需要先添加依赖
<dependency>
<artifactId>ssh-service</artifactId>
<groupId>shiqi</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
开始编写控制层代码,编写一个action,代码如下
package shiqi.controller;
import shiqi.model.User;
import shiqi.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import shiqi.serviceImpl.UserServiceImpl;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private UserService userService;
private User user = new User();
private Integer id;
public String execute() {
User existUser = userService.selectUserById();
if (existUser != null) {
ActionContext.getContext().getValueStack()
.set("existUser", existUser);
}
return "success";
}
public User getModel() {
// TODO Auto-generated method stub
return user;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
6.3 别忘了配置action,配置struts.xml文件,且action的具体实现由spring注入,两个配置文件也放在resources目录下,这里你需要自己创建一个在src/main下的resources目录
并将该文件做如上设置
6.4 编写配置文件
application-controller.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd" default-autowire="byName">
<!-- 引入service层 -->
<import resource="applicationContext-service.xml" />
<!--用户模块的Action -->
<bean id="userAction" class="shiqi.controller.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
</beans>
struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="false" />
<package name="test" extends="struts-default" namespace="/">
<!-- 配置首页访问的Action -->
<action name="find" class="userAction">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
也记得加上日志文件
6.5 最后是在web.xml中配置spring的核心监听器以及struts2的核心过滤器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置Spring的核心监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-controller.xml</param-value>
</context-param>
<!-- struts2核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
</web-app>
6.6 别忘了jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>猫猪商城</title>
</head>
<body>
<table>
<td>
<tr>用户名
</tr>
<tr>密码
</tr>
</td>
<td>
<s:iterator var="user" value="existUser">
<tr>
<s:property value="#user.username" />
</tr>
<tr>
<s:property value="#user.password" />
</tr>
</s:iterator>
</td>
</table>
</body>
</html>
至此控制层代码编写完毕
⑦使用maven编译一次项目
⑧编译完成后将web项目部属到tomcat上
选择本地的tomcat
部署完毕,开始启动
启动完毕,在浏览器输入http://localhost:8080/ssh_controller_war_exploded/find.action
与数据库信息一致,访问成功,ssh整合完美谢幕啦啦啦。
- 总结,遇到的最大困难就是各种版本jar包引起的冲突导致的错误,需要不断调试才能修正