myeclipse的ssm框架整合(实现增删改查)
一、实验效果:二、环境搭建说明:
myEclipse+jdk1.8+mysql1.6+ssm框架
ssm所有的jar包(百度网盘):
https://pan.baidu.com/s/1tPw0tYy-LKLyX3p3yp6wxQ
提取码:9lr5
三、项目分层截图:四、数据库设计截图:
五、web.xml配置文件:
<?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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>nueo_ssmOne</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>
<!-- SpringMVC前端控制器配置 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--设定初始化参数,在初始化的时候就加载配置文件信息-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--加载spring配置文件-->
<param-value>classpath:applicationContext.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>
<!-- 解决中文乱码 spring带的解决乱码的配置 -->
<filter>
<filter-name>charcterEncoding</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>charcterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 启动tomcat容器时候,加载spring的ioc容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
六、applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!--这是各类命名空间,这个有提示作用,导入命名空间,myEclipse会自动加载资源-->
<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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-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/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 前端视图名的配置,例子:你访问..../index.jsp,那么用了前端视图配置,就直接在控制器层写
..../inde即可,它与index.jsp相同,就是想以.jsp结尾的都几种统一写了 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀名,这里主要是指定jsp页面在什么目录下面如果在根目录下就写 / -->
<property name="prefix" value="/"></property>
<!--后缀名,视图资源的后缀名是,这里是 .jsp -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置数据源的bean,高效连接数据库,这是连接数据库的配置 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://192.168.191.144:3306/ssm?useUnicode=true&characterEncoding=UTF-8">
</property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--让Spring管理mybatis中的核心对象SqlSessionFactory,将SQL工厂由spring来创建-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入依赖对象:dataSource 注意这里的名字,一定不能乱起 -->
<property name="dataSource" ref="dataSource"></property>
<!-- mybatis配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- Mapper接口所在包名,Spring会自动查找其下的类并生成接口的实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.nueo.mapper"></property>
<!--sqlSessionFactory 指定SqlSessionFactoryBean 对象 -->
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
</bean>
<!--配置事务处理类 ,配置了事务处理就不需要在service实现层管自己去管理事务了,但是要注意增删改的方法名 -->
<bean id="tm"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 这里会引用上面的数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="tm">
<!--
定义事务传播属性 这里的事务就限定了你在实现类中起名字的规定,需要事务的
增删改以update、add、delete开头
-->
<tx:attributes>
<!--以update开头的方法名会执行spring管理的事务-->
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 配置事务切面 -->
<aop:config>
<aop:pointcut id="mycut"
expression="execution(* com.nueo.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="mycut" />
</aop:config>
<!-- 扫描包中的注解,实现依赖注入 -->
<context:component-scan base-package="com.nueo.controller,com.nueo.service.impl"></context:component-scan>
<!-- 开启注解功能 -->
<mvc:annotation-driven />
<!-- 开启静态资源功能 -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
</beans>
八、各层代码的实现:
1、实体类pojo:
Person
public class Person implements Serializable {
private int pid;
private String pname;
// 年龄
private int page;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public Person() {
}
public Person(int pid, String pname, int page) {
super();
this.pid = pid;
this.pname = pname;
this.page = page;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page
+ "]";
}
}
PageBean.java
/**
* 分页Model类
* @author
*
*/
public class PageBean {
/**
* 总记录数
*/
private int total;
/**
* 总页数
*/
private int totalPage;
private int page; // 第几页
private int pageSize; // 每页记录数
private int start; // 起始页
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
// 计算总页数
public int getTotalPage() {
return total%pageSize==0?total/pageSize:(total/pageSize+1);
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public PageBean(int page, int pageSize) {
super();
this.page = page;
this.pageSize = pageSize;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getStart() {
return (page-1)*pageSize;
}
@Override
public String toString() {
return "PageBean [total=" + total + ", totalPage=" + totalPage
+ ", page=" + page + ", pageSize=" + pageSize + ", start="
+ start + "]";
}
}
2、mapper:
接口:PersonMapper.java
public interface PersonMapper {
public List<Person> getAll();
public void add(Person person);
public void delete(int pid);
public Person getById(int pid);
public void update(Person person);
//分页
public List<Person> findPage(Map<String,Object> map);
public Long getTotal();
}
映射mapper:PersonMapper.xml
<mapper namespace="com.nueo.mapper.PersonMapper">
<select id="getAll" resultType="person">
select * from person
</select>
<insert id="add" parameterType="person" useGeneratedKeys="true">
insert into person(pname,page) values(#{pname},#{page})
</insert>
<delete id="delete" parameterType="int">
delete from person where pid=#{pid}
</delete>
<select id="getById" resultType="person" parameterType="int">
select * from person where pid=#{pid}
</select>
<update id="update" parameterType="person">
update person set pname=#{pname}, page=#{page} where pid=#{pid}
</update>
<select id="getTotal" resultType="Long">
select count(*) from person
</select>
<select id="findPage" parameterType="Map" resultType="person">
select * from person limit #{start},#{size}
</select>
<select id="getTotal" resultType="Long">
select count(*) from person
</select>
</mapper>
3、service层:
接口:PersonService.java
public interface PersonService {
public List<Person> getAll();
public void add(Person person);
public void delete(int pid);
public Person getById(int pid);
public void update(Person person);
public List<Person> findPage(Map<String,Object> map);
public Long getTotal();
}
实现类:
//将service实现交给springIOC管理
@Service(value="personServiceImpl")
public class PersonServiceImpl implements PersonService{
@Resource
private PersonMapper personMapper;
@Override
public List<Person> getAll() {
return personMapper.getAll();
}
@Override
public void add(Person person) {
personMapper.add(person);
}
@Override
public void delete(int pid) {
personMapper.delete(pid);
}
@Override
public Person getById(int pid) {
return personMapper.getById(pid);
}
@Override
public void update(Person person) {
personMapper.update(person);
}
@Override
public List<Person> findPage(Map<String, Object> map) {
return personMapper.findPage(map);
}
@Override
public Long getTotal() {
return personMapper.getTotal();
}
}
4、controller控制器:
PersonController.java
@Controller
public class PersonController {
@Resource
private PersonService personService;
@RequestMapping("/list")
public String list(@RequestParam(value = "page", required = false,defaultValue="1")String page,ModelMap datamap){
// if (page == null || page.equals("")) {
// page = "1";
// }
//每页显示条数
int pagesize=2;
PageBean pageBean = new PageBean(Integer.parseInt(page), pagesize);
// 获得数据总条数
long total = personService.getTotal();
// 将总数set进页面对象
pageBean.setTotal(Integer.parseInt(total + ""));
Map<String, Object> map = new HashMap<String, Object>();
map.put("start", pageBean.getStart());
map.put("size", pageBean.getPageSize());
List<Person> list = personService.findPage(map);
System.out.println("pageBean:"+pageBean);
System.out.println("list:"+list);
datamap.put("page", pageBean);
datamap.put("list", list);
return "forward:/list.jsp";
}
@RequestMapping("/getall")
public String getAll(ModelMap datamap) {
List<Person> list = personService.getAll();
datamap.put("list", list);
//return "forward:/list.jsp";
return "list";
}
@RequestMapping("/add")
public String add(Person p) {
personService.add(p);
return "redirect:/getall";
}
@RequestMapping("/delete")
public String delete(int pid) {
personService.delete(pid);
return "redirect:/getall";
}
@RequestMapping("/getbyid")
public String getById(int pid, ModelMap map) {
Person p = personService.getById(pid);
map.put("person", p);
//return "forward:/update.jsp";
return "update";
}
@RequestMapping("/update")
public String update(Person p) {
personService.update(p);
return "redirect:/getall";
}
}
九、前端页面的:
1、index.jsp
<body>
<%response.sendRedirect("getall"); %>
</body>
2、list.jsp
<body>
<a href="add.jsp">添加</a>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>操作</td>
</tr>
<c:forEach items="${list}" var="person">
<tr>
<td>${person.pid }</td>
<td>${person.pname }</td>
<td>${person.page }</td>
<td><a href="delete?pid=${person.pid }">删除</a> <a
href="getbyid?pid=${person.pid }">修改</a></td>
</tr>
</c:forEach>
</table>
<p>
总页数:${page.totalPage } 当前页:${page.page }
<c:if test="${page.page>1}">
<a href="list?page=1">首页</a>
<a href="list?page=${page.page-1 }">上一页</a>
</c:if>
<c:if test="${page.page<page.totalPage}">
<a href="list?page=${page.page+1 }">下一页</a>
<a href="list?page=${page.totalPage }">末页</a>
</c:if>
</p>
</body>
3、add.jsp
<body>
<form action="add" method="post">
姓名:<input type="text" name="pname"><br>
年龄:<input type="text" name="page"><br>
<input type="submit" value="提交">
</form>
</body>
4、update.jsp
<body>
<form action="update" method="post">
姓名:<input type="text" name="pname" value="${person.pname }"><br>
年龄:<input type="text" name="page" value="${person.page }"><br>
<input type="hidden" name="pid" value="${person.pid }">
<input type="submit" value="修改">
</form>
</body>