目录
SSM整合
导入jar
首先要导入相关的jar包,包括spring、springMVC、以及mybatis的还有一些第三方的jar包,比如:log4j,pageHelper,AspectJ,jackson,jstl。我已将常用的jar包打包上传到csdn了点此下载
搭建springMVC
配置web.xml
- DispatcherServlet
- HiddenHttpMethodFilter
- CharacterEncodingFilter
<!--解决中文乱码问题-->
<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>/*</url-pattern>
</filter-mapping>
<!--支持RESTfu格式-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<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>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置springMVC.xml
扫描控制层组件
视图解析器
Default Servlet
MVC驱动
可选:MultipartResolver(处理文件上传),拦截器
<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--设置控制层组件-->
<context:component-scan base-package="com.glq.controller"></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--解决静态资源的问题-->
<!--默认的servlet-->
<mvc:default-servlet-handler/>
<!--mvc驱动-->
<mvc:annotation-driven/>
<!--文件上传-->
<!--<!–处理文件上传,id必须为multipartResolver–>-->
<!--<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">-->
<!--<!–设置文件解析的编码,与页面的一致–>-->
<!--<property name="defaultEncoding" value="UTF-8"></property>-->
<!--<!–设置上传文件的最大的大小–>-->
<!--<property name="maxInMemorySize" value="102400"></property>-->
<!--</bean>-->
<!-- 拦截器 -->
<!--<mvc:interceptors>-->
<!--<!–默认拦截所有请求–>-->
<!--<bean class="com.glq.FirstInterceptor"></bean>-->
<!--<bean class="com.glq.SencondInterceptor"></bean>-->
<!--<!–自定义拦截方式–>-->
<!--<!–<mvc:interceptor>–>-->
<!--<!–<bean></bean>–>-->
<!--<!–要拦截的请求–>-->
<!--<!–<mvc:mapping path=""/>–>-->
<!--<!–不拦截的请求–>-->
<!--<!–<mvc:exclude-mapping path=""></mvc:exclude-mapping>–>-->
<!--<!–</mvc:interceptor>–>-->
<!--</mvc:interceptors>-->
</beans>
整合springMVC和spring
配置web.xml:
使用监听器来提前加载spring的配置文件
ContextLoaderListener
context-param
<!--配置spring监听器,自定义spring配置文件的位置和名称-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置spring.xml:
只需要在spring.xml中配置扫描组件,这里要注意的是要排除controller,因为在springmvc中已经配置过了
<!--扫描组件-->
<context:component-scan base-package="com.glq">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
搭建mybatis:
配置相应的数据源,引入相应的mapper文件,然后设置别名、懒加载、插件之类的
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--标签有先后顺序-->
<!--properties?,-->
<!--settings?,-->
<!--typeAliases?,-->
<!--typeHandlers?,-->
<!--objectFactory?,-->
<!--objectWrapperFactory?,-->
<!--reflectorFactory?,-->
<!--plugins?,-->
<!--environments?,d-->
<!--atabaseIdProvider?,m-->
<!--appers?-->
<properties resource="jdbc.properties"></properties>
<settings>
<!--把下划线转换为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--懒加载-->
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"></setting>
<!--是否查询所有数据-->
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
<!--为类型设置类型别名,type设置java类型,若只设置type则默认的别名为类名且不区分大小写。-->
<typeAliases>
<!--<typeAlias type="com.glq.bean.User" alias="u"></typeAlias>-->
<package name="com.glq.bean" ></package>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper resource="EmpMapper.xml"/>-->
<package name="com.glq.mapper"></package>
</mappers>
</configuration>
spring整合mybatis
将mybatis中的数据源之类的交给spring来管理,在mybatis中只留下settings和plugins
spring.xml:
properties文件的引入
DataSource数据源的配置
事务管理器
开启事务驱动
SqlSessionFactoryBean:管理SqlSession
MapperScannerConfigurer
<!-- 引入资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 声明事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 管理mybatis操作数据库的会话对象SqlSession -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 设置mybatis核心配置文件的路径 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 设置数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 设置类型别名 -->
<property name="typeAliasesPackage" value="com.glq.bean"></property>
<!-- 设置映射文件的路径 -->
<property name="mapperLocations" value="classpath:com/glq/mapper/*.xml"></property>
</bean>
<!-- 在所设置的包下,将所有的接口生成动态代理实现类,并由spring容器管理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.glq.mapper"></property>
</bean>
整合完成的四个配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--解决中文乱码问题-->
<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>/*</url-pattern>
</filter-mapping>
<!--支持RESTfu格式-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<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>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置spring监听器,自定义spring配置文件的位置和名称-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
spring.xml
<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--扫描组件-->
<context:component-scan base-package="com.glq">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
<!-- 引入资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 声明事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 管理mybatis操作数据库的会话对象SqlSession -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 设置mybatis核心配置文件的路径 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 设置数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 设置类型别名 -->
<property name="typeAliasesPackage" value="com.glq.bean"></property>
<!-- 设置映射文件的路径 -->
<property name="mapperLocations" value="classpath:com/glq/mapper/*.xml"></property>
</bean>
<!-- 在所设置的包下,将所有的接口生成动态代理实现类,并由spring容器管理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.glq.mapper"></property>
</bean>
</beans>
springMVC.xml
<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--设置控制层组件-->
<context:component-scan base-package="com.glq.controller"></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--解决静态资源的问题-->
<!--默认的servlet-->
<mvc:default-servlet-handler/>
<!--mvc驱动-->
<mvc:annotation-driven/>
<!--文件上传-->
<!--<!–处理文件上传,id必须为multipartResolver–>-->
<!--<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">-->
<!--<!–设置文件解析的编码,与页面的一致–>-->
<!--<property name="defaultEncoding" value="UTF-8"></property>-->
<!--<!–设置上传文件的最大的大小–>-->
<!--<property name="maxInMemorySize" value="102400"></property>-->
<!--</bean>-->
<!-- 拦截器 -->
<!--<mvc:interceptors>-->
<!--<!–默认拦截所有请求–>-->
<!--<bean class="com.glq.FirstInterceptor"></bean>-->
<!--<bean class="com.glq.SencondInterceptor"></bean>-->
<!--<!–自定义拦截方式–>-->
<!--<!–<mvc:interceptor>–>-->
<!--<!–<bean></bean>–>-->
<!--<!–要拦截的请求–>-->
<!--<!–<mvc:mapping path=""/>–>-->
<!--<!–不拦截的请求–>-->
<!--<!–<mvc:exclude-mapping path=""></mvc:exclude-mapping>–>-->
<!--<!–</mvc:interceptor>–>-->
<!--</mvc:interceptors>-->
</beans>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--标签有先后顺序-->
<!--properties?,-->
<!--settings?,-->
<!--typeAliases?,-->
<!--typeHandlers?,-->
<!--objectFactory?,-->
<!--objectWrapperFactory?,-->
<!--reflectorFactory?,-->
<!--plugins?,-->
<!--environments?,d-->
<!--atabaseIdProvider?,m-->
<!--appers?-->
<settings>
<!--把下划线转换为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--懒加载-->
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"></setting>
<!--是否查询所有数据-->
<setting name="aggressiveLazyLoading" value="false"></setting>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--<!–为类型设置类型别名,type设置java类型,若只设置type则默认的别名为类名且不区分大小写。–>-->
<!--<typeAliases>-->
<!--<!–<typeAlias type="com.glq.bean.User" alias="u"></typeAlias>–>-->
<!--<package name="com.glq.bean" ></package>-->
<!--</typeAliases>-->
<!--配置分页插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
基于SSM和RESTful的列表、分页、修改、批量删除
列表+分页
获取客户端传过来的页码,然后根据页码查询到相应的emp,再获得分页条的数据,最后再把分页条和emp放到域中,在jsp中遍历显示即可。
controller:
@RequestMapping(value = "/emps/{pageNum}",method = RequestMethod.GET)
public String getEmp(@PathVariable("pageNum")Integer pageNum, HttpServletRequest req, Map<String,Object> map){
System.out.println("getEmp");
//从第pageNum页开始,查询2条数据
PageHelper.startPage(pageNum,2);
List<Emp> emps = empService.getAllEmp();
//获取分页的html
PageInfo<Emp> pageInfo = new PageInfo<>(emps, 3);
String page = PageUtil.getPageInfo(pageInfo, req);
//放到作用域中
map.put("emps",emps);
map.put("page",page);
return "list";
}
list.html
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/5/17
Time: 14:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>列表</title>
<link rel="stylesheet" href="${pageContext.servletContext.contextPath}/css/index_work.css">
<script type="text/javascript" src="${pageContext.servletContext.contextPath}/js/jquery-1.8.2.min.js"></script>
</head>
<body>
<form>
<table>
<tr>
<th>EID</th>
<th>ENAME</th>
<th>AGE</th>
<th>SEX</th>
<th>DEPARTMENTNAME</th>
<th>OPTIONS</th>
</tr>
<c:forEach items="${emps}" var="emp">
<tr>
<td>${emp.eid}</td>
<td>${emp.ename}</td>
<td>${emp.age}</td>
<td>${emp.sex}</td>
<td>${emp.dept.dname}</td>
<td>
<a href="${pageContext.servletContext.contextPath}/emp/${eid}">修改</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="6">
${page}
</td>
</tr>
</table>
</form>
</body>
</html>
pageutil:
public class PageUtil {
public static String getPageInfo(PageInfo<Emp> pageInfo, HttpServletRequest request) {
String path = request.getContextPath() + "/";
StringBuilder builder = new StringBuilder();
//拼接首页
builder.append("<a href='"+path+"emps/1'>首页</a>");
builder.append(" ");
//拼接上一页
if(pageInfo.isHasPreviousPage()) {
builder.append("<a href='"+path+"emps/"+pageInfo.getPrePage()+"'>上一页</a>");
builder.append(" ");
}else {
builder.append("上一页");
builder.append(" ");
}
//拼接页码
int[] nums = pageInfo.getNavigatepageNums();
for (int i : nums) {
if(i == pageInfo.getPageNum()) {
builder.append("<a style='color:red;' href='"+path+"emps/"+i+"'>"+i+"</a>");
builder.append(" ");
}else {
builder.append("<a href='"+path+"emps/"+i+"'>"+i+"</a>");
builder.append(" ");
}
}
//拼接下一页
if(pageInfo.isHasNextPage()) {
builder.append("<a href='"+path+"emps/"+pageInfo.getNextPage()+"'>下一页</a>");
builder.append(" ");
}else {
builder.append("下一页");
builder.append(" ");
}
//拼接尾页
builder.append("<a href='"+path+"emps/"+pageInfo.getPages()+"'>尾页</a>");
builder.append(" ");
return builder.toString();
}
}
修改
首先从客户端获取要修改的用户的id,然后获取到用户的信息及所有部门的信息跳转到update.jsp进行回显,然后用户修改完成以后进行获取,然后进行修改。
@RequestMapping(value = "/emp/{eid}",method = RequestMethod.GET)
public String updateEmp(@PathVariable("eid") String eid, Map<String, Object> map){
Emp emp = empService.getEmpByEid(eid);
List<Dept> depts = empService.getAllDept();
Map<String,Object> sex = new HashMap<>();
sex.put("0","女");
sex.put("1","男");
map.put("emp",emp);
map.put("depts",depts);
map.put("sex",sex);
return "update";
}
@RequestMapping(value="/emp", method=RequestMethod.PUT)
public String updateEmp(Emp emp) {
empService.updateEmp(emp);
return "redirect:/emps/1";
}
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/5/17
Time: 15:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html>
<head>
<title>Title</title>
<link rel="stylesheet" href="${pageContext.servletContext.contextPath }/css/index_work.css" />
</head>
<body>
<form:form action="${pageContext.servletContext.contextPath}/emp" method="post" modelAttribute="emp">
<input type="hidden" name="_method" value="PUT">
<form:hidden path="eid"></form:hidden>
<table>
<tr>
<th colspan="2">更新用户信息</th>
</tr>
<tr>
<td>ename</td>
<td>
<form:input path="ename"></form:input>
</td>
</tr>
<tr>
<td>age</td>
<td>
<form:input path="age"></form:input>
</td>
</tr>
<tr>
<td>sex</td>
<td>
<form:radiobutton path="sex" items="${sex}"></form:radiobutton>
</td>
</tr>
<tr>
<td>department</td>
<td>
<form:select path="dept.did" items="${depts}" itemLabel="dname" itemValue="did"></form:select>
</td>
</tr>
<td>
<input type="submit" value="修改">
</td>
</tr>
</table>
</form:form>
</body>
</html>
批量删除
首先在前面加上一列多选框,然后编写全选全不选的js代码,然后点击批量删除按钮的时候将选中的eid进行传输,注意这里要加一个隐藏域,使用delete方式。最后再controller层进行获取和删除。注意controller层只能使用字符串或者数组进行接收多个eid。
<th>
<input type="checkbox" id="selectAll" />
</th>
<td>
<input type="checkbox" name="eid" value="${emp.eid }" />
</td>
$("#selectAll").click(function () {
$("[name='eid']").prop("checked", $(this).prop("checked"));
});
$("#deleteMore").click(function () {
$("form").attr("action", $(this).attr("href")).submit();
return false;
});
@RequestMapping(value="/emps", method=RequestMethod.DELETE)
public String deleteMore(String[] eid) {
//获取客户端name属性相同的多个元素的值,可以通过字符串字节或去,每个值中间以逗号分隔,也可以以数组直接获取
System.out.println(Arrays.toString(eid));
return "";
}