ssm(struts2+spring+mybatis)开发步骤
一、环境搭建
-
新建JavaWeb项目
-
导入相关jar包
-
引入相关配置文件
applicationContext.xml/struts.xml/mapper.xml
二、初始化配置
- 在web.xml中配置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>
</filter-mapping>
- 在web.xml中配置Spring工厂监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- spring配置文件 -->
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
三、DAO
- 创建表(table)
create table t_admin(
id integer primary key,
username varchar2(100),
password varchar2(100),
realName varchar2(100),
sex varchar2(2)
);
- 创建实体 (entity)
package com.xpf.entity;
import java.io.Serializable;
public class Admin implements Serializable{
private Integer id;
private String username;
private String password;
private String realName;
private String sex;
public Admin() {
super();
}
public Admin(Integer id, String username, String password, String realName,
String sex) {
super();
this.id = id;
this.username = username;
this.password = password;
this.realName = realName;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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 getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
- 定义DAO接口
-
定义基础接口(所有DAO都可以继承)
package com.xpf.dao; import java.util.List; public interface BaseDAO<T> { public void insert(T t); public void delete(Integer id); public void update(T t); public List<T> queryAll(); public T queryOne(Integer id); }
-
DAO接口
package com.xpf.dao; import org.apache.ibatis.annotations.Param; import com.xpf.entity.Admin; public interface AdminDAO extends BaseDAO<Admin> { /* * 登录功能 */ public Admin queryAdminByUsernameAndPassword(@Param("username")String username,@Param("password")String password); }
-
- Mapper文件实现DAO接口
<?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.xpf.dao.AdminDAO">
<!-- 注册 -->
<insert id="insert">
<!-- 主键 -->
<selectKey keyProperty="id" order="BEFORE" resultType="int">
select seq_user.nextval from dual
</selectKey>
insert into t_admin (id,username,password,realName,sex) values(#{id},#{username},#{password},#{realName},#{sex})
</insert>
<!-- 登录 -->
<select id="queryAdminByUsernameAndPassword" resultType="Admin">
select id,username,password,realName,sex from t_admin where username=#{username} and password=#{password}
</select>
</mapper>
- Spring的配置文件进行配置(在applicationContext.xml中)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
">
<!-- 注解的扫描 --> <!-- 对所有的包都进行扫描 -->
<context:component-scan base-package="*"></context:component-scan>
<!-- 引入数据库连接的配置文件 -->
<context:property-placeholder location="classpath:com/xpf/config/db.properties"/>
<!-- 连接数据库 配置数据源 --> <!-- 采用第三方连接池dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 配置连接数据库运行的相关参数 -->
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 创建SqlSessionFactory对象 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 属性 -->
<property name="dataSource">
<!-- 为属性做依赖注入 -->
<ref local="dataSource"/>
</property>
<!-- 给实体类起别名 -->
<property name="typeAliasesPackage" value="com.xpf.entity"/>
<!-- Mapper文件的注册 -->
<property name="mapperLocations">
<list>
<value>classpath:com/xpf/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<!-- Spring自动创建DAO实现类对象 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定给哪一个包下的DAO接口创建实现类对象 -->
<property name="basePackage" value="com.xpf.dao"/>
</bean>
<!-- service层的事务控制 -->
<!-- 引出Spring的控制事务的额外功能类 -->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 控制事务需要连接 创建连接必须要有连接数据库的相关参数 -->
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- 激活@Transactional -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
</beans>
四、Service
- service接口
package com.xpf.service;
import com.xpf.entity.Admin;
public interface AdminService {
//登录
public Admin login(String username,String password);
//注册
public void register(Admin admin);
}
- service实现类
package com.xpf.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.xpf.dao.AdminDAO;
import com.xpf.entity.Admin;
import com.xpf.service.AdminService;
//创建service的实现类对象
@Service
/*
* @Transactional 使用前在applicationContext.xml中激活
* 事务控制(为service中的所有方法添加对应的事务控制,但局部优先)
* 增删改 @Transactional中属性默认
*/
@Transactional
public class AdminServiceImpl implements AdminService {
/*
* @Autowired注解 书写在成员变量上面,会直接通过反射为成员变
量赋值,而忽略set get. 书写在set方法上面,调用set方法完成赋
值
*/
@Autowired
private AdminDAO adminDAO;
public AdminDAO getAdminDAO() {
return adminDAO;
}
public void setAdminDAO(AdminDAO adminDAO) {
this.adminDAO = adminDAO;
}
@Override
/*
* @Transactional
* 查询方法,为了提高查询效率,设置属性
*/
@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
public Admin login(String username, String password) {
return adminDAO.queryAdminByUsernameAndPassword(username, password);
}
@Override
public void register(Admin admin) {
adminDAO.insert(admin);
}
}
五、Controller
- 创建Action
package com.xpf.action;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
import com.xpf.entity.Admin;
import com.xpf.service.AdminService;
/*
* @Contorller 创建Action对象
*/
@Controller
/*
* @Scope 控制创建对象的次数
* 默认为singleton:单例
*/
@Scope(value="prototype")
public class AdminAction extends ActionSupport{
/*
* 为Action中的service成员变量自动注入
*/
@Autowired
private AdminService adminService;
private Admin admin;
public Admin getAdmin() {
return admin;
}
public void setAdmin(Admin admin) {
this.admin = admin;
}
public AdminService getAdminService() {
return adminService;
}
public void setAdminService(AdminService adminService) {
this.adminService = adminService;
}
//注册
public String register(){
adminService.register(admin);
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.setValue("#session.admin", admin);
return "showAll";
}
//登录
public String login(){
Admin ad = adminService.login(admin.getUsername(), admin.getPassword());
if(ad!=null){
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.setValue("#session.admin", ad);
return "showAll";
}else{
return "login";
}
}
//退出
public String exit(){
HttpSession session = ServletActionContext.getRequest().getSession();
session.invalidate();
return "login";
}
}
- 配置Struts的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "struts-2.3.dtd" >
<struts>
<package name="admin" extends="struts-default" namespace="/admin">
<!-- class:因为action中注解@Controller 无需Action的全限定名,Action类名首字母小写即可 -->
<action name="admin_*" class="adminAction" method="{1}">
<result name="showAll" type="redirectAction">
<param name="namespace">/employee</param>
<param name="actionName">employee_showAll</param>
</result>
<result name="login" type="redirect">/login.jsp</result>
</action>
</package>
</struts>
六、其他
- 关于DAO的测试
package com.xpf.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xpf.dao.AdminDAO;
import com.xpf.entity.Admin;
public class TestAdminDAO {
//拿到工厂
private ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
/*
* 通过DAO接口名首字母小写,拿到DAO接口实现类对象
*/
private AdminDAO adminDAO =(AdminDAO) ac.getBean("adminDAO");
@Test
public void testRegister(){
adminDAO.insert(new Admin(null,"xpf","123456","xpf","m"));
}
@Test
public void testLogin(){
Admin admin = adminDAO.queryAdminByUsernameAndPassword("xpf", "123456");
System.out.println(admin);
}
}
- 相关jar包和配置文件
ssm的jar和相关配置文件下载
密码:oosm