本文主要内容是SSM整合项目中所需要配置的一些jar包信息,xml文件以及所配置内容的详细注释
1.添加jar包:
- 添加所有的Spring工具包
- 添加自己导入的jar包,主要有以下几个:
2.配置web.xml文件:
web.xml文件主要是配置监听器,接收请求的核心servlet也就是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>SSM1</display-name>
<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>
<!-- 监听器,坚挺服务器启动或者销毁 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 监听IOC容器,注意文件名的配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!-- 添加springMVC的核心servlet,用来接收所有请求,作为分发器 -->
<servlet>
<!-- 随便取名字 -->
<servlet-name>springmvc</servlet-name>
<!-- 完整的类路径 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 自定义springmvc配置文件的读取位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 代表服务器启动开始加载,运行不会卡 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- jsp页面提交post请求的话会有中文乱码,需要自己手动添加过滤器配置 -->
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3.配置springmvc.xml文件:
这里主要配置了用于扫描和激活java文件中注解的标签,解决js等文件引用问题的静态资源过滤器和跳转页面所需的视图解析器,详细作用及代码:
<?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:p="http://www.springframework.org/schema/p"
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.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- 该文件名字命名固定,是web.xml中的servletname中设置的名字-servlet的形式 -->
<!-- 配置springmvc的请求映射-->
<!-- 由于springmvc的配置一般由注解来完成, -->
<!-- 激活扫描注解标签 告诉它要扫描注解的包名 -->
<!-- 这个是激活@controller这个注解的 -->
<context:component-scan base-package="com.controller"></context:component-scan>
<!-- 这个是激活里面的方法@RequestMapping这个注解的 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 静态资源过滤器 ,这句话的作用是,解决由于springmvc过滤了所有文件当页面中需要引用图片css样式,js文件等就会异常-->
<mvc:default-servlet-handler/>
<!-- 配置视图解析器,用来实现controller的一个跳转用的,就是价格前缀后缀,跳转的时候java里面只需要写名字就可以了 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 给所有跳转的文件名统一配置前缀 -->
<!-- 将文件放到web-inf下面也可以在这里配置成/WEB-INF/ -->
<property name="prefix" value="/WEB-INF/page/"></property>
<!-- 统一配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.配置spring.xml也就是applicationContext.xml文件:
这里配置的有注解扫描和激活的标签,数据库连接池也就是数据源的创建,使用Spring来管理mybatis映射文件,创建mybatis函数工厂,创建dao的实现类,配置事务管理等,详细作用及代码:
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<!-- 如果程序中使用了注解,注解本身并没有特别的功能 我们需要让IOC容器知道类中哪里使用了注解,
那么就去创建对应的bean context:component-scan作用用于扫描注解类 base-package代表注解类所在的包,
可以设置多个值,用逗号分隔,也可以使用通配符,也可以是使用父级包名 -->
<context:component-scan base-package="com.service"></context:component-scan>
<!-- 激活aop注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- 创建数据库连接池,也就是创建数据源,jdbc连接 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"></property>
</bean>
<!-- 这里要添加一个mchange-commons-java-0.2.3.4.jar的包,还要重新配置spring管理 -->
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${url}"></property>
<property name="driverClass" value="${driver}"></property>
<property name="user" value="${name}"></property>
<property name="password" value="${pwd}"></property>
<!-- 初始化的连接数量 -->
<property name="initialPoolSize" value="10"></property>
<!-- 最大连接数 -->
<property name="maxPoolSize" value="50"></property>
</bean>
<!-- 使用spring来管理mybatis -->
<!-- myBatista需要创建sessionFactory对象来调用mapper -->
<!--创建SqlSessionFactory,mybatis中的工厂函数对象 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 首先是连接数据库,上面数据源创建好后,这里注入,使用dataSource属性,引用用ref -->
<property name="dataSource" ref="datasource"></property>
<!-- 读取mapper映射文件 使用mapperLocations属性,可以使用目录文件通配符,可以同时读取多个mapper文件-->
<property name="mapperLocations" value="classpath:com/mapper/*.xml"></property>
<!-- 给文件取别名 -->
<property name="typeAliasesPackage" value="com.entity"></property>
<!-- 把myBatis.xml文件内容再读取一遍 -->
<!-- <property name="configLocation" value="classpath:mybatis.xml"></property> -->
<!-- 可以实现分页查询 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- 创建dao的impl实现类 ,进入MapperScannerConfigurer的class来创建-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage该标签就是自动去value值里面对应的包下面找接口文件,然后再自动关联mapper映射文件,自动生成接口的实现类-->
<!-- 可以在service中使用@AutoWired注解来引用dao层对象的实现类注入 -->
<property name="basePackage" value="com.dao"></property>
</bean>
<!-- 配置事务管理 ,创建事务管理类-->
<!-- 先导入DataSourceTransactionManager类 -->
<bean id="txmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 如果要管理事务的提交,回滚等操作,需要数据库连接,那么就需要注入数据源对象 -->
<property name="dataSource" ref="datasource" ></property>
</bean>
<!-- 方式二,利用注解来实现事务管理类 ,先添加激活事务注解标签,注入对应的事务管理类-->
<tx:annotation-driven transaction-manager="txmanager"/>
<!-- 然后再java中需要进行事务管理的service类中的方法或类名上方添加注解@Transactional 来实现事务控制-->
<!-- 利用aop切入原理进行事务管理,添加一个tx标签 -->
<!-- <tx:advice 用于配置管理事务的策略 -->
<!-- <tx:advice id="txadvice" transaction-manager="txmanager" > -->
<!-- 声明式事务管理,明确每个方法使用的具体策略 -->
<!-- <tx:attributes> -->
<!-- 针对增删改方法开起事务管理策略 -->
<!-- <tx:method name="add*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="edit*"/>
<tx:method name="save*"/> -->
<!-- 针对查询方法使用只读策略 -->
<!-- <tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice> -->
<!-- 那个地方的方法使用事务管理还是使用aop来控制 -->
<!-- <aop:config>
<aop:pointcut expression="execution(* com.demo3.service.impl.*.*(..))" id="pc"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="pc"/>
</aop:config> -->
</beans>
下面是java文件部分:实体类,控制层,业务层,dao层
5.entity实体类:
这里用的是简单的学生表实体类(班级类省略):
package com.entity;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 实体类
* @author Administrator
*
*/
public class Student {
private Integer sid;
private String sname;
@DateTimeFormat(pattern="YYYY-MM-DD")
private Date birthday;
private String sex;
private Clazz clz;//对象属性
private Integer cid;
//用来格式化日期时间再传到页面当中
private String showdate;
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getShowdate() {
//把对象原本的时间属性格式化成年月日类型再从页面获取
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD");
return sdf.format(birthday);
}
public void setShowdate(String showdate) {
this.showdate = showdate;
}
public Clazz getClz() {
return clz;
}
public void setClz(Clazz clz) {
this.clz = clz;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
6.创建controller控制层:
这里是完成客户端的请求与处理功能,下面是一些注解的详细介绍和几个简单的增删改查操作:
package com.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.entity.Clazz;
import com.entity.Student;
import com.github.pagehelper.PageInfo;
import com.service.ClazzService;
import com.service.StudentService;
/**
* 控制层,用于接收和响应客户端的请求
* @author Administrator
*
*/
//想要接收请求,就要创建bean控制层的用@Controller注解来创建
@Controller
public class StudentController {
//创建TestDao对象
//依赖注入的注解,给属性注解用@Autowired
//作用是给当前注解的属性赋值
//它会自动去IOC容器中寻找与当前属性类型匹配的bean,然后赋值
@Autowired
StudentService studentService;
@Autowired
ClazzService clazzService;
/**
* 查询方法
* 请求映射,方法要接收请求,就要使用@RequestMapping注解
* 接收的请求有后面的value来确定
*/
@RequestMapping("show")
public String showAll(HttpServletRequest request,Integer pageNum,Integer pageSize){
//使用了分页工具以后,这里查询就需要传入两个参数,如果参数为空就赋上初始值
if(pageNum==null){
pageNum=1;
}
if(pageSize==null){
pageSize=3;
}
List<Student> list = studentService.getAllStudent(pageNum,pageSize);
//分页工具类的一个对象,这里面有了所有需要的参数,可以在jsp中调用里面的参数实现上下页
PageInfo<Student> pageinfo = new PageInfo<Student>(list);
request.setAttribute("pageinfo",pageinfo);
//若是视图解析器配置的文件地址不一样,可以使用重定向或者转发跳转方式,指定跳转标签
//return "forward:/index.jsp";代表转发跳转
//return "redirect:url";代表重定向
return "show";
}
/**
* 查询班级信息
* 数据用在下拉列表显示用
*/
@RequestMapping("addpage")
public String addpage(HttpServletRequest request){
//跳到add.jsp页面之前查询出年级信息用下拉列表来展示
List<Clazz> list = clazzService.getAll();
request.setAttribute("clazzlist",list);
return "add";
}
/**
* 添加操作
*/
@RequestMapping("add")
public String add(Student stu){
if(studentService.addStudent(stu)){
//这里使用重定向跳转到show请求里,而不是跳转到show.jsp页面
return "redirect:/show";
}
return "redirect:/addpage";
}
/**
* 删除操作
* 这里使用的是ajax异步请求,注解标签为@ResponseBody
*/
//ajax异步请求注解,这样返回值就不会进行跳转,而是直接返回给客户端一个值,接收后就可以执行相关操作
@RequestMapping("del")
@ResponseBody
public String delete(Integer sid){
if(studentService.deleteStudent(sid)){
return "1";
}
return "0";
//如果返回的字符串中有中文字符会出现中文乱码,需要在@RequestMapping注解中添加一个参数
//加上produces="text/html;charset=utf-8" 这条参数就可以解决
}
/**
* 查询出单个人的信息
*/
//修改查询一个人信息
@RequestMapping("selectone")
public String add(HttpServletRequest request,Integer sid){
List<Clazz> list = clazzService.getAll();
request.setAttribute("clzlist",list);
Student student = studentService.getOne(sid);
request.setAttribute("student",student);
return "update";
}
/**
* 更新操作
*/
@RequestMapping("update")
public String update(Student stu){
if(studentService.updateStudent(stu)){
//在跳转页面的参数里加上相对应的值,到jsp页面的script里面用
//jsp中用var param = '${param.a}';表达式接收再做响应的提示操作
return "redirect:/show?a=1";
}
System.out.println("修改失败");
return "redirect:/show";
}
}
7.创建Service接口和serviceimpl业务操作层:
Service接口:定义所需功能(班级类的省略)
package com.service;
import java.util.List;
import com.entity.Student;
/**
* 学生service层接口
* @author Administrator
*
*/
public interface StudentService {
//添加方法
public boolean addStudent(Student stu);
//查询所有方法
public List<Student> getAllStudent(int pageNum,int pageSize);
//删除方法
public boolean deleteStudent(Integer sid);
//查询一个方法
public Student getOne(Integer sid);
//修改方法
public boolean updateStudent(Student stu);
}
ServiceImpl实现类(班级类省略):完成接口定义的方法,详细注解及代码:
package com.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dao.StudentDao;
import com.entity.Student;
import com.github.pagehelper.PageHelper;
import com.service.StudentService;
/**
* service业务逻辑层
* 用@Servicec来注解
* 作用是创建该实现类的对象,方便在servlet中注入该对象
*/
//在需要进行事务管理的service类中的方法或类名上方添加注解@Transactional 来实现事务控制
//该注解也可以直接写在类上方对所有该类所有方法实现事务控制
@Service
@Transactional//事务管理 导包注意导springfromwork的包
public class StudentServiceImpl implements StudentService {
//创建TestDao对象
//依赖注入的注解,给属性注解用@Autowired
//作用是给当前注解的属性赋值
//它会自动去IOC容器中寻找与当前属性类型匹配的bean,然后赋值
@Autowired
StudentDao studentDao;
@Override
public boolean addStudent(Student stu) {
if(studentDao.add(stu)>0){
return true;
}
return false;
}
//进行事务管理的注解可以添加readOnly属性来设置只读@Transactional(readOnly=true)
@Override
public List<Student> getAllStudent(int pageNum,int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return studentDao.selectAll();
}
@Override
public boolean deleteStudent(Integer sid) {
if(studentDao.delete(sid)>0){
return true;
}
return false;
}
@Override
public Student getOne(Integer sid) {
Student student = studentDao.selectOne(sid);
return student;
}
@Override
public boolean updateStudent(Student stu) {
System.out.println("进入修改的impl层");
if(studentDao.update(stu)>0){
return true;
}
return false;
}
}
8.创建Dao层:
只需创建dao接口即可,daoImpl在xml问价中用bean创建,在映射文件mapper完成响应功能:
package com.dao;
import java.util.List;
import com.entity.Student;
/**
* 学生表dao层
*/
public interface StudentDao {
//添加方法
public int add(Student stu);
//查询所有方法
public List<Student> selectAll();
//删除方法
public int delete(Integer sid);
//查询一个方法
public Student selectOne(Integer sid);
//修改方法
public int update(Student stu);
}
9.配置mapper.xml映射文件:
这里用来完成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.dao.StudentDao">
<resultMap type="com.entity.Student" id="stumap">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<association property="clz" javaType="clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</association>
</resultMap>
<select id="selectAll" resultMap="stumap">
select * from student a,clazz b where a.clzzid = b.cid
</select>
<select id="selectOne" resultType="com.entity.Student">
select * from student where sid=#{sid}
</select>
<insert id="add">
insert into student values(null,#{sname},#{birthday},#{sex},#{clz.cid})
</insert>
<delete id="delete">
delete from student where sid=#{sid}
</delete>
<delete id="update">
update student set sname =#{sname},birthday=#{birthday},sex=#{sex},clzzid=#{clz.cid} WHERE sid =#{sid}
</delete>
</mapper>
10.配置jdbc.properties文件存放数据库连接信息:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8
name=root
pwd=admin
11.下面是对应的Jsp页面内容(一般放在WEB-INF下面的单独文件中):
配置c标签:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
导入js文件:
<script type="text/javascript" src="/SSM1/js/jquery-3.3.1.js"></script>
查询内容显示页面:
<body>
<h1>显示学生信息</h1>
<p><a href="/SSM1/addpage">新增数据</a></p>
<table border="1">
<tr><td>全选</td><td>序号</td><td>姓名</td><td>生日</td><td>性别</td><td>班级</td><td>删除</td><td>修改</td></tr>
<!-- ${pageinfo.list}这个是分页工具类封装好的集合 -->
<c:forEach items="${pageinfo.list}" var="s" varStatus="i">
<!-- varStatus="i"和${i.count}来代表循环的次数,用来代替id序号 -->
<tr><td>选择标签</td><td>${i.count}</td><td>${s.sname}</td><td>${s.birthday}</td><td>${s.sex}</td><td>${s.clz.cname}</td>
<!-- 删除这里使用的是异步请求,先将a标签的点击事件取消,在添加自己的单击事件 -->
<!-- this代表的是当前的这个a标签,后面可以带参数 -->
<td><a href="javaScript:void(0)" onclick="del(this,'${s.sid}')">删除</a></td>
<td><a href="selectone?sid=${s.sid}">修改</a></td></tr>
</c:forEach>
</table>
<p>
<!-- 使用的是分页工具类,可以在pagehelper网站工具上查看使用 -->
<c:if test="${pageinfo.hasPreviousPage}">
<a href="show?pageNum=${pageinfo.pageNum-1}">上一页</a>
</c:if>
<c:if test="${pageinfo.hasNextPage}">
<a href="show?pageNum=${pageinfo.pageNum+1}">下一页</a>
</c:if>
</p>
<script type="text/javascript">
/* 在java跳转的时候url中加上参数,在这里用param来接收
做响应的操作提示*/
var param = '${param.a}';
if(param!=''){
if(param==1)
alert("修改成功");
}
function del(a,sid){
var result = confirm("确定要删除吗")
if(result){
/* 使用异步方式进行删除,提交访问控制层的地址,和需要用到的参数 */
$.post("del","sid="+sid,function(r){
/* 回调函数里面接收控制层返回的值判断进行相应操作 */
if(r==1){
$(a).parent().parent().remove();
alert("删除成功");
}else{
alert("删除失败");
}
})
}
}
</script>
</body>
添加信息功能页面:
<body>
<h1>新增学生</h1>
<form action="add" method="post">
<p>学生姓名:<input name="sname"/></p>
<p>学生生日:<input type="date" name="birthday"/></p>
<p>学生性别:<select name="sex">
<option>男</option>
<option>女</option>
</select></p>
<!-- 在java控制层查询后用来显示下拉列表使用 -->
<p>学生班级:<select name="clz.cid">
<c:forEach items="${clazzlist}" var="c">
<option value="${c.cid}">${c.cname}</option>
</c:forEach>
</select></p>
<p><input type="submit" value="新增"/></p>
</form>
</body>
修改信息页面:
<body>
<h1>修改学生</h1>
<form action="update" method="post">
<!-- 使用隐藏域传递完整参数 -->
<input type="hidden" name="sid" value="${student.sid}">
<!-- 里面用value来显示修改信息时候的默认值 -->
<p>学生姓名:<input name="sname" value="${student.sname}" /></p>
<!-- 时间调用的是格式化后的时间参数 -->
<p>学生生日:<input type="date" name="birthday" value="${student.showdate}"/></p>
<p>学生性别:<select name="sex">
<option>${student.sex}</option>
<option>男</option>
<option>女</option>
</select></p>
<!-- 提交的属性是对象里的对象的属性名称 -->
<p>学生班级:<select name="clz.cid">
<c:forEach items="${clzlist}" var="c">
<!-- 中间加入一个if判断来显示默认值,中间用selected -->
<!-- 循环的内容要有value值 -->
<option <c:if test="${student.cid==c.cid }">selected</c:if> value="${c.cid}">${c.cname}</option>
</c:forEach>
</select></p>
<p><input type="submit" value="确认修改"/></p>
</form>
</body>
(参考使用)