SSM整合基础知识
1 ssm整合概念
spring+springmvc+mybatis
spring提供ioc+aop
springmvc提供controller
mybatis提供持久层
ssm
ssm2:struts2
ssh
ssh2
2 创建web项目 更改编码集
3 导入jar包
springioc
springaop
springmvc
mybatis
json
log4j
jstl
mybatis-spring
upload
4 分包
action
service
dao
interceptor
exception
util
entity
js
css
imgs
5 WEB-INF下引入核心标签库的tld文件
6 创建springmvc的核心配置文件
springmvc_conf.xml
- 通过context标签扫描创建bean的包
- 通过mvc标签自动注册注解形式的映射器和适配器
- 配置视图解析器
- 配置多部件表单解析器
- 配置拦截器
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- * 通过context标签扫描创建bean的包 -->
<context:component-scan base-package="com.zhiyou100"/>
<!-- * 通过mvc标签自动注册注解形式的映射器和适配器 -->
<mvc:annotation-driven/>
<!-- * 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- * 配置多部件表单解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="99999999"/>
</bean>
<!-- * 配置拦截器 -->
</beans>
7 创建spring核心配置文件
spring_config.xml
- 配置datasource的bean
- 配置sqlsessionfactory的bean
- 配置事物管理bean
- 配置动态获取mapper接口实现类对象的bean
<!--1 创建数据源datasource的bean -->
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/db_37" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
<!-- 2 创建sqlsessionfactory的bean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="ds"/>
<!-- 指定mapper映射文件的路径 -->
<property name="mapperLocations" value="classpath:com/zhiyou100/dao/*.xml"/>
</bean>
<!-- 3创建事物管理bean -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 指定数据源 -->
<property name="dataSource" ref="ds"/>
</bean>
<!-- 4 创建 MapperScannerConfigurer的bean 自动扫描dao包 为mapper接口创建实现类对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zhiyou100.dao"/>
</bean>
8 配置web的核心配置文件
web.xml
-
配置欢迎页面
-
配置servletcontext的初始化参数contextCondfigLocation指定spring核心配置文件的位置
-
配置spring的上下文监听器
-
配置springmvc的中央控制器
-
配置springmvc的全站编码过滤器
-
配置自己的过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>java37_frame_ssm_01</display-name>
<welcome-file-list>
<welcome-file>student.jsp</welcome-file>
</welcome-file-list>
<!-- * 配置欢迎页面 -->
<!-- * 配置servletcontext的初始化参数contextCondfigLocation指定spring核心配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring_config.xml</param-value>
</context-param>
<!-- * 配置spring的上下文监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- * 配置springmvc的中央控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc_conf.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- * 配置springmvc的全站编码过滤器 -->
<filter>
<filter-name>filterEncoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterEncoding</filter-name>
<url-pattern>*.action</url-pattern>
<dispatcher>ERROR</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!-- * 配置自己的过滤器 -->
</web-app>
9 创建数据库 并启动项目
10 创建数据库和表
USE db_37;
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(11) UNIQUE,
sage INT,
sdy BOOLEAN,
sbirthday DATE,
score FLOAT(4,1),
tid INT,
CONSTRAINT fk_1111 FOREIGN KEY(tid) REFERENCES teacher(tid)
);
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(11) UNIQUE,
tpwd VARCHAR(6)
);
INSERT INTO teacher VALUES(NULL,"张三","123456");
INSERT INTO teacher VALUES(NULL,"李四","123456");
INSERT INTO teacher VALUES(NULL,"王五","123456");
INSERT INTO teacher VALUES(NULL,"赵六","123456");
INSERT INTO student VALUES(
NULL,
SUBSTRING(UUID(),1,4),
TRUNCATE(RAND()*10+15,0),
RAND()>0.5,
CONCAT(TRUNCATE(RAND()*10+2000,0),"-",TRUNCATE(RAND()*12+1,0),"-",TRUNCATE(RAND()*30+1,0)),
TRUNCATE(RAND()*100+0,1),
TRUNCATE(RAND()*4+1,0)
);
SELECT * FROM student;
11 根据表创建实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable{
// sid INT PRIMARY KEY AUTO_INCREMENT,
// sname VARCHAR(11) UNIQUE,
// sage INT,
// sdy BOOLEAN,
// sbirthday DATE,
// score FLOAT(4,1),
// tid INT,
private Integer sid;
private String sname;
private Integer sage;
private Boolean sdy;
private Date sbirthday;
private Float score;
private Integer tid;
private Teacher teacher;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher implements Serializable{
// tid INT PRIMARY KEY AUTO_INCREMENT,
// tname VARCHAR(11) UNIQUE,
// tpwd VARCHAR(6)
private Integer tid;
private String tname;
private String tpwd;
}
12 创建dao接口
public interface StudentMapper {
List<Student> getAll();
List<Student> getAllByTid(int tid);
Student getOneBySid(int sid);
Student getOneBySname(String sname);
int deleteOneBySid(int sid);
int addOne(Student s);
int updateOne(Student s);
}
public interface TeacherMapper {
Teacher getOneByTname(String tname);
Teacher getOneByTid(int tid);
}
13 根据dao接口创建sql映射文件
<?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.zhiyou100.dao.StudentMapper">
<!-- List<Student> getAll(); -->
<select id="getAll" resultType="com.zhiyou100.entity.Student">
select * from student
</select>
<!-- List<Student> getAllByTid(int tid); -->
<select id="getAllByTid" resultType="com.zhiyou100.entity.Student" parameterType="int">
select * from student where tid=#{tid}
</select>
<!-- Student getOneBySname(String sname); -->
<select id="getOneBySname" resultType="com.zhiyou100.entity.Student" parameterType="string">
select * from student where sname=#{sname}
</select>
<!-- Student getOneBySid(int sid); -->
<select id="getOneBySid" resultType="com.zhiyou100.entity.Student" parameterType="int">
select * from student where sid=#{sid}
</select>
<!-- int deleteOneBySid(int sid); -->
<delete id="deleteOneBySid" parameterType="int">
delete from student where sid=#{sid}
</delete>
<!-- private Integer sid; -->
<!-- private String sname; -->
<!-- private Integer sage; -->
<!-- private Boolean sdy; -->
<!-- private Date sbirthday; -->
<!-- private Float score; -->
<!-- private Integer tid; -->
<!-- private Teacher teacher; -->
<!-- int addOne(Student s); -->
<insert id="addOne" parameterType="com.zhiyou100.entity.Student">
insert into student(sname,sage,sdy,sbirthday,score,tid)
values(#{sname},#{sage},#{sdy},#{sbirthday},#{score},#{tid})
</insert>
<!-- int updateOne(Student s); -->
<update id="updateOne" parameterType="com.zhiyou100.entity.Student">
update student
<set>
<if test="sname != null">
sname=#{sname},
</if>
<if test="sage != null">
sage=#{sage},
</if>
<if test="sdy != null">
sdy=#{sdy},
</if>
<if test="sbirthday != null">
sbirthday=#{sbirthday},
</if>
<if test="score != null">
score=#{score},
</if>
<if test="tid != null">
tid=#{tid},
</if>
</set>
<where>
sid=#{sid}
</where>
</update>
</mapper>
<?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.zhiyou100.dao.TeacherMapper">
<!-- Teacher getOneByTname(String tname); -->
<select id="getOneByTname" parameterType="String" resultType="com.zhiyou100.entity.Teacher">
select * from teacher where tname=#{tname}
</select>
<!-- Teacher getOneByTid(int tid); -->
<select id="getOneByTid" parameterType="int" resultType="com.zhiyou100.entity.Teacher">
select * from teacher where tid=#{tid}
</select>
</mapper>
14 创建service接口和其实现类
package com.zhiyou100.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhiyou100.dao.StudentMapper;
import com.zhiyou100.entity.Student;
import com.zhiyou100.exception.StudentCrudException;
@Service
public class StudentServiceImp implements StudentService{
@Autowired
private StudentMapper studentMapper;
public List<Student> getAll() {
return studentMapper.getAll();
}
@Override
public List<Student> getAllByTid(int tid) {
return studentMapper.getAllByTid(tid);
}
@Override
public Student getOneBySid(int sid) {
return studentMapper.getOneBySid(sid);
}
@Override
public int deleteOneBySid(int sid) {
return studentMapper.deleteOneBySid(sid);
}
public int addOne(Student s) {
Student dbStudent=studentMapper.getOneBySname(s.getSname());
if(dbStudent!=null){
throw new StudentCrudException("学生名字已经存在,添加失败!");
}
return studentMapper.addOne(s);
}
@Override
public int updateOne(Student s) {
return studentMapper.updateOne(s);
}
}
@Service
public class TeacherServiceImp implements TeacherService {
@Autowired
private TeacherMapper teacherMapper;
public Teacher login(String tname, String tpwd) {
Teacher teacher=teacherMapper.getOneByTname(tname);
if(teacher==null){
throw new TeacherLoginException("账号不存在!");
}
if(!teacher.getTpwd().equals(tpwd)){
throw new TeacherLoginException("密码错误!");
}
return teacher;
}
}
15 实现登录和查询所有功能
15.1 创建页面
- 老师登录页面:teacher_login.jsp
<h1>老师登录页面</h1>
<c:if test="${not empty message }">
<font color="red">提示信息:${message}</font><br/>
</c:if>
<form action="<c:url value='/teacher/login.action'/>" method="post">
<table>
<tr>
<th>老师名字:</th>
<td><input type="text" name="tname" value="${teacher.tname}"/></td>
</tr>
<tr>
<th>老师密码:</th>
<td><input type="password" name="tpwd" value="${teacher.tpwd}"/></td>
</tr>
<tr>
<th colspan="2">
<input type="submit" value="老师登录"/>
</th>
</tr>
</table>
</form>
- 学生管理页面:student_manager.jsp
<h1>学生管理页面:${title}</h1>
<c:if test="${not empty message }">
<font color="red">提示信息:${message}</font><br/>
</c:if>
<table>
<tr>
<th>顺序</th>
<th>学号</th>
<th>名字</th>
<th>年龄</th>
<th>党员</th>
<th>生日</th>
<th>分数</th>
<th>老师</th>
<th>操作</th>
</tr>
<c:if test="${not empty list}">
<c:forEach items="${list}" varStatus="vs" var="stu">
<tr>
<td>${vs.index+1}</td>
<td>${stu.sid}</td>
<td>${stu.sname}</td>
<td>${stu.sage}</td>
<td>${stu.sdy}</td>
<td>${stu.sbirthday}</td>
<td>${stu.score}</td>
<td>${stu.teacher.tname}</td>
<td><a href="">删除</a><a href="">修改</a></td>
</tr>
</c:forEach>
</c:if>
</table>
15.2 创建action
- teacheraction
@Controller
@RequestMapping("/teacher")
public class TeacherAction {
@Autowired
private TeacherService teacherService;
@RequestMapping(value="/login.action",method=RequestMethod.POST)
public String loginMethod(Teacher teacher,HttpSession session,Model model){
try {
Teacher dbTeacher=teacherService.login(teacher.getTname(), teacher.getTpwd());
session.setAttribute("teacher", dbTeacher);
return "forward:/student/getAll.action";
} catch (TeacherLoginException e) {
model.addAttribute("message", e.getMessage());
return "teacher_login";
}
}
}
- studentaction
@Controller
@RequestMapping("/student")
public class StudentAction {
@Autowired
private StudentService studentService;
@RequestMapping("/getAll.action")
public String getAllMethod(Model model){
model.addAttribute("list", studentService.getAll());
model.addAttribute("title", "查询所有学生信息");
return "student_manager";
}
}
15.3 测试
15.4 细节更改1
- 党员显示是/否
<c:choose>
<c:when test="${stu.sdy}"> 是</c:when>
<c:otherwise>否</c:otherwise>
</c:choose>
- 日期显示
public String getSbirthdayStr(){
return new SimpleDateFormat("yyyy年MM月dd日").format(sbirthday);
}
${stu.sbirthdayStr}|<fmt:formatDate value="${stu.sbirthday}" pattern="yyyy年MM月dd日"/>
15.5 显示老师
- 更改studentMapper.xml 查询学生时获取学生的老师信息
<resultMap type="com.zhiyou100.entity.Student" id="studentMap1">
<id column="sid" property="sid"/>
<result column="sname" property="sname"/>
<result column="sage" property="sage"/>
<result column="sdy" property="sdy"/>
<result column="sbirthday" property="sbirthday"/>
<result column="score" property="score"/>
<result column="tid" property="tid"/>
<!-- 给属性teacher赋值 -->
<association property="teacher" column="tid" select="com.zhiyou100.dao.TeacherMapper.getOneByTid" />
</resultMap>
<select id="getAll" resultMap="studentMap1">
select * from student
</select>
15.6 当前老师只能删除和修改当前老师的学生
<c:if test="${sessionScope.teacher.tid eq stu.tid}">
<a href="<c:url value='/student/deleteOne/${stu.sid}.action'/>">删除</a>
<a href="<c:url value='/student/getOne.action?sid=${stu.sid}'/>">修改</a>
</c:if>
16 实现删除
16.1 jsp:student_manager.jsp
<a href="<c:url value='/student/deleteOne/${stu.sid}.action'/>">删除</a>
16.2 action:
@RequestMapping(value="/deleteOne/{sid}.action",method=RequestMethod.GET)
public String deleteOneMethod(@PathVariable("sid") int sid,Model model){
studentService.deleteOneBySid(sid);
model.addAttribute("message", "删除"+sid+"成功!");
return "forward:/student/getAll.action";
}
17 实现修改和添加
17.1 修改和添加使用同一个页面:student_update_add.jsp
<script type="text/javascript" src="<c:url value='/js/jquery-1.6.4.min.js'/>"></script>
<h1>${title}</h1>
<c:if test="${not empty message }">
<font color="red">提示信息:${message}</font><br/>
</c:if>
<c:set var="actionName" value="${empty requestScope.student?'addOne.action':'updateOne.action'}"/>
${actionName}<br/>
<form action="<c:url value='/student/${actionName}'/>" method="post" id="form_1">
<input type="hidden" name="sid" value="${requestScope.student.sid}">
<table>
<tr>
<th>学生名字:</th>
<td><input type="text" name="sname" value="${requestScope.student.sname}"/></td>
</tr>
<tr>
<th>学生年龄:</th>
<td><input type="text" name="sage" value="${requestScope.student.sage}"/></td>
</tr>
<tr>
<th>学生分数:</th>
<td><input type="text" name="score" value="${requestScope.student.score}"/></td>
</tr>
<tr>
<th>学生生日:</th>
<td><input type="text" name="sbirthday" value="${requestScope.student.sbirthdayStr}"/></td>
</tr>
<tr>
<th>是否党员:</th>
<td>是:<input type="radio" name="sdy" value="true"/> |
否:<input type="radio" name="sdy" value="false"/>
</td>
</tr>
<tr>
<th colspan="2"><input type="submit" value="${empty requestScope.student?'添加学生':'修改学生'}"/></th>
</tr>
</table>
</form>
<script type="text/javascript">
$(function(){
var sdy='${student.sdy}';
$.each($("#form_1 input[name='sdy']"),function(i,n){
if($(n).val()==sdy){
$(n).attr("checked","checked");
}
});
});
</script>
17.2 修改action:
@RequestMapping(value="/updateOne.action",method=RequestMethod.POST)
public String updateOneMethod(Student stu,Model model){
studentService.updateOne(stu);
model.addAttribute("message", "修改"+stu.getSid()+"学生信息成功!");
return "forward:/student/getAll.action";
}
17.3 添加action
@RequestMapping(value="/addOne.action",method=RequestMethod.POST)
public String addOneMethod(Student stu,Model model,HttpSession session){
Teacher teacher=(Teacher)session.getAttribute("teacher");
stu.setTid(teacher.getTid());
studentService.addOne(stu);
model.addAttribute("message", "添加"+stu.getSname()+"学生信息成功!");
return "forward:/student/getAll.action";
}
17.4 注意事项:@DateTimeFormat not supported
导入jar包:joda-time-2.10.13.jar