最近在使用ssm框架,所以就在这里分享一下我的经验。
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命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
我用的是eclipse编译器,如果是idea编译器的话在src目录下建立mapper包时你会发现idea是识别不了这个包下的接口类和配置文件的
1. Spring与Mybatis整合(applicationContext.xml)
ps:头文件挺重要的,如果头文件缺少,那么你在配置文件中写到某些代码时,配置文件是识别不出来的。
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 读取jdbc.properties -->
<context:property-placeholder
location="classpath:jdbc.properties" />
<!-- 创建DataSource -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url}" />
<property name="driverClassName" value="${jdbc.driverClass}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- 创建SqlSessionFactory对象 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 关联连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载sql映射文件 -->
<property name="mapperLocations"
value="classpath*:/mapper/*.xml" />
</bean>
<!-- Mapper接口的扫描 -->
<!-- 注意:如果使用Mapper接口包扫描,那么每个Mapper接口在spring的容器中的id名称为类名:例如UserMapper ->
userMapper -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置mapper接口所在包路径 -->
<property name="basePackage" value="com.HHL.mapper" />
</bean>
<!-- 开启Spring的IOC注解扫描 -->
<context:component-scan base-package="com.HHL" />
<!-- 开启Spring的事务 -->
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 启用spring事务注解 -->
<tx:annotation-driven
transaction-manager="transactionManager" />
</beans>
2. SpringMVC配置文件(spring-mvc.xml)
ps:必须认识SpringMVC的三大组件:HandlerMapping(映射器)、HandlerAdapter(适配器)、ViewResolver(视图解析器)
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 扫描Controller所在的包 -->
<context:component-scan base-package="com.HHL.controller"/>
<!-- 注解驱动 -->
<mvc:annotation-driven/>
<!-- 处理静态资源 -->
<mvc:default-servlet-handler/>
<!-- 视图解析器:简化在Controller类编写的视图路径 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3. web.xml配置
ps:这里是有一个问题的,那就是springmvc当中的urlpattern我是用了“/”,而不是“.do”或者“/*”,说明我访问路径的时候不用再写“.do”或者“.action”了,但是问题也就来了。如果用了“/”那就代表springmvc拦截所有请求,包括静态资源,也就是你的样式什么都被拦截下来了,这也是为什么我要在后面加上处理静态资源那一段
<?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>SSMtext</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 启动Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 启动Springmvc -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 参数:读取Spring-mvc.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置Springmvc編碼過濾器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*
default
*.jpg
default
*.js
default
*.css
1. domain持久层
ps:这里跟数据库对应就好了
package com.HHL.domain;
public class User {
private Integer id;
private Integer password;
private String name;
private String gender;
private String telephone;
private String address;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2. mapper
package com.HHL.mapper;
import java.util.List;
import com.HHL.domain.User;
public interface UserMapper {
//添加
public void saveUser(User user);
//删除
public void deleUser(int id);
//修改
//根据id查找到对应的单个用户
public User updaUserByid(int id);
//更新
public void updaUser(User user);
//查找全部
public List<User> findAll();
//查找单个用户
public List<User> seleUserByid(int id);
}
ps:这是用来跟数据库映射的接口,下面的就是持久层框架Mybatis跟数据库交互的sql语句
ps:正常来说这是对应的,一个User那么就对应一个配置文件。
这里有几个问题:1.配置文件中的id必须与接口中的方法名一致,不然无法进行操作。
2.parameterType 代表的是元素类型,我这里只有根据id查询单个用户才需要。
3.resultType 代表的是返回类型,填写你的bean所在目录就行,我这里是在domain下面。
4.ssm代表的是我的数据库名字,t_user代表的是我的数据表名称
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 该文件编写mybatis中的mapper接口里面的方法提供对应的sql语句 -->
<mapper namespace="com.HHL.mapper.UserMapper">
<!-- 添加用户 -->
<insert id="saveUser" parameterType="com.HHL.domain.User">
INSERT INTO
ssm.t_user(password,NAME,gender,telephone,address)VALUES(#{password},#{name},#{gender},#{telephone},#{address})
</insert>
<!-- 删除用户 -->
<delete id="deleUser" parameterType="com.HHL.domain.User">
DELETE FROM ssm.t_user where
id=#{id}
</delete>
<!-- 查询所有数据 -->
<select id="findAll" parameterType="com.HHL.domain.User" resultType="com.HHL.domain.User">
SELECT * FROM ssm.t_user
</select>
<!-- 修改用户 -->
<select id="updaUserByid" resultType="com.HHL.domain.User">
SELECT * FROM ssm.t_user
where id=#{id}
</select>
<update id="updaUser" parameterType="com.HHL.domain.User">
UPDATE ssm.t_user SET
password=#{password},name=#{name},gender=#{gender},telephone=#{telephone},address=#{address}
where id=#{id}
</update>
<!-- 根据ID查询某个用户 -->
<select id="seleUserByid" parameterType="Integer"
resultType="com.HHL.domain.User">
SELECT * FROM ssm.t_user where id=#{id}
</select>
</mapper>
3. service业务层
ps:这是业务层的接口
package com.HHL.service;
import java.util.List;
import com.HHL.domain.User;
public interface IUserService {
// 添加
public void saveUser(User user);
// 查询全部
public List<User> findAll();
// 删除
public void deleUser(int id);
// 修改
public void updaUser(User user);
public User updaUserByid(int id);
// 查找单个用户
public List<User> seleUserByid(int id);
}
ps:这是业务层的实现类,一定要加上注解@Service和@Transactional,这两个注解是一定要有的!
@Resource注解也是一样,是必须要加上去的,不能省略!
package com.HHL.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.HHL.domain.User;
import com.HHL.mapper.UserMapper;
import com.HHL.service.IUserService;
import com.github.pagehelper.PageHelper;
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
// 注入
@Resource
private UserMapper usermapper;
// 添加
public void saveUser(User user) {
usermapper.saveUser(user);
}
// 查询全部
public List<User> findAll() {
return usermapper.findAll();
}
// 删除
public void deleUser(int id) {
usermapper.deleUser(id);
}
// 修改
public void updaUser(User user) {
usermapper.updaUser(user);
}
public User updaUserByid(int id) {
return usermapper.updaUserByid(id);
}
// 查询单个
public List<User> seleUserByid(int id) {
return usermapper.seleUserByid(id);
}
}
4. controller控制层
ps:控制层一定要写注解@Controller、@RequestMapping、@Resource
@Controller:代表当前是一个控制类
@RequestMapping:表示映射的路径让映射器找到它,我这是用户控制类,所以我写的是“user”,
下面的@RequestMapping表示的是映射的方法,方便适配器找到它。
找到之后交给后端控制器,后端控制器执行完成之后返回ModelAndView(我这里用的是Model),适配器 再将这个结果返回给前端控制器DispatcherServlet,前端控制器接到结果后将值传给ViewReslover(视图解析器),ViewReslover解析后返回具体的View(视图),然后前端控制器根据View进行渲染视图(即将模型数据填充至视图中,最后DispatcherServlet 响应用户,流程结束。
解释一下为什么我这里有些方法中返回的是list(model),是为了再次刷新页面,相当于重新获取数据。
package com.HHL.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.HHL.domain.User;
import com.HHL.service.IUserService;
@Controller
@RequestMapping("/user")
public class UserController {
// 注入
@Resource
private IUserService userService;
// 添加(跳转至添加界面)
@RequestMapping("/add")
public String input() {
return "add";
}
// 保存
@RequestMapping("/save")
public String save(User user, Model model) {
userService.saveUser(user);
return list(model);
}
// 查询全部
@RequestMapping("/list")
public String list(Model model) {
List<User> list = userService.findAll();
model.addAttribute("list", list);
return "list";
}
// 删除
@RequestMapping("/delete")
public String deleUser(int id, Model model) {
userService.deleUser(id);
return list(model);
}
// 修改
@RequestMapping("/update")
public String updaUser(User user, Model model) {
userService.updaUser(user);
return list(model);
}
@RequestMapping("/updateByid")
public String updaUserByid(int id, Model model) {
User user = userService.updaUserByid(id);
model.addAttribute("userlist", user);
return "edit";
}
// 查询单个用户
@RequestMapping("/select")
public String seleUserByid(HttpServletRequest request, Model model) {
String id = request.getParameter("keywords");
Integer keywords = Integer.valueOf(id);
List<User> user = userService.seleUserByid(keywords);
model.addAttribute("userlist", user);
return list(model);
}
}
1.src:
ps:jdbc没什么好说的,就是连接数据库的语句,log4j也是一样
2.WebRoot
ps:这里有一个问题,tld文件夹!这里面放的是jstl标签库中用的东西,当你在jsp界面用到的jstl标签的时候最好把这个标签库放到WEB-INF下面,不然会出现一些奇怪的错误 哈哈…
看这里:
不要觉得奇怪为什么我在后面才说jar包的版本,因为文章是我写的。哈哈,开个玩笑,主要是开始的时候忘了,现在加上也不晚。
1. spring:4.3.3
2. springmvc:4.3.3
3. mybatis:3.4.4
还有下面这些jar包
ps:spring的jar包下载之后里面其实有springmvc的jar包的,因为springmvc是spring的后续产品(别忘了连接数据库的jar包)
补充一下访问路径,我的是${pageContext.request.contextPath}/user/list
先学技术,再悟思想,实践出真理。先学会怎么用ssm框架再研究它的思想吧。楼主也是小白,有问题的话可以一起探讨,写的不好的地方请多见谅。