目标:ajax 查询分页 。
需求 :
1、整体框架必须使用完整的配置办法。
2、spring中包含注解扫描、属性文件加载、数据源、sqlsessionfactory对象、扫描器、声明式事务。
3、页面显示使用ajax。
4、对象向json字符串转换使用Gson工具包
5、service中注解
效果图如下:
步骤、
1、 建立数据库相关表 -- emp(学生信息表) dept(学院信息表)
2、在程序中建立响应的类
a.首先要明确所需信息是由两表联合查询到的,且 由emp表中的列 deptno 与 dept 表中的列 id 进行连接查询
所以创建的emp类中应包含dept表中信息。
建立如下两个实体类:
b. 因为需要实现分页,故创建相应的PageInfo类 来存储每一页的信息,以及相关分页的信息。
3、创建mapper接口 通过注解形式进行数据库查询
public interface ShowMapper {
@Select("select a.*,b.id `dept.id`,b.name `dept.name` from emp a LEFT JOIN dept b on a.deptno = b.id limit #{0},#{1}")
List<Emp> selAll(int pageStart ,int pageSize);
@Select("select count(*) from emp")
int selTotal();
}
4、创建相应的service类
@Service // 此处注解自动注册,不需要添加bean到applicationContext.xml文件中
public class ShowServiceImpl implements ShowService {
@Resource // 注意此处需添加注解,实现依赖注入
private ShowMapper mapper;
@Override
public PageInfo showAll(int pageNum, int pageSize) {
int pageStart = (pageNum-1)*pageSize; // 根据当前页数 计算出查询的记录数开始位置
PageInfo pi = new PageInfo();
pi.setPageNum(pageNum);
pi.setPageSatrt(pageStart);
pi.setPageSize(pageSize);
//System.out.println(mapper);
//System.out.println(pageStart+" "+pageSize);
int total = mapper.selTotal();
List<Emp> list = mapper.selAll(pageStart, pageSize);
pi.setList(list);
int t=0;
if(total%pageSize==1){
t = total/pageSize+1;
}else
t = total/pageSize;
pi.setTotal(t);
return pi;
}
// 此处为调试程序所写,无用,忽略
@Override
public int test() {
System.out.println("just a test");
return 0;
}
}
5、建立servlet
@WebServlet("/show")
public class ShowServlet extends HttpServlet {
private ShowService ser;
@Override
public void init() throws ServletException {
//初始化 得到相应的service实体类
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
ser = context.getBean("showServiceImpl",ShowServiceImpl.class);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String pageNumStr = req.getParameter("pageNum");
String pageSizeStr = req.getParameter("pageSize");
int pageNum = 1;
int pageSize = 2;
if(pageNumStr!=null && !pageNumStr.equals("")){
pageNum = Integer.parseInt(pageNumStr);
}
if(pageSizeStr!=null && !pageSizeStr.equals("")){
pageSize = Integer.parseInt(pageSizeStr);
}
PageInfo pageInfo = ser.showAll(pageNum, pageSize);
resp.setContentType("application/json;charset=utf-8"); //设置返回内容的格式 为JSON对象
PrintWriter out = resp.getWriter();
//ObjectMapper mapper = new ObjectMapper(); // Jackson工具包使用 本程序使用Gson
out.write(new Gson().toJson(pageInfo));
out.flush();
out.close();
}
}
6、创建前端显示 index.jsp页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function() {
var pageNum = 1;
var pageSize = 2;
var total = 0;
getMyData(); // 刚载入页面调用此函数 显示第一页内容
$("a:eq(0)").click(function() {
pageNum = pageNum - 1;
if (pageNum <= 0) {
pageNum = 1;
} else {
getMyData();
}
return false;
})
$("a:eq(1)").click(function() {
pageNum = pageNum + 1;
// alert(pageNum);
//alert(total);
if (pageNum > total) {
pageNum = total;
} else {
getMyData();
}
return false;
})
function getMyData() {
$.post("show", {
"pageSize" : pageSize,
"pageNum" : pageNum
}, function(data) {
//总页数
//var data = JSON.parse(data);
//alert(pageNum);
total = data.total;
var result = "";
for (var i = 0; i < data.list.length; i++) {
result += "<tr>";
result += "<td>" + data.list[i].empno + "</td>";
result += "<td>" + data.list[i].name + "</td>";
result += "<td>" + data.list[i].dept.name + "</td>";
result += "</tr>"
}
//alert(result)
$("#Tbody").html(result);
})
}
})
</script>
</head>
<body>
<table border="1px">
<tr>
<td>员工编号</td>
<td>姓名</td>
<td>所在院系</td>
</tr>
<tbody id="Tbody">
</tbody>
</table>
<a href="">上一页</a>
<a href="">下一页</a>
</body>
</html>
7、配置web.xml文件
为整合mybatis需要配置以下内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<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>
</web-app>
8、配置applicationContext.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.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"
default-autowire="byName"> <!-- 设置自动注入 根据名字 -->
<!-- 扫描组件 自动注册bean id 把类的第一个大写字母变小写 -->
<context:component-scan base-package="com.yyl.service.impl"></context:component-scan>
<!-- 配置读取属性 由于需要读取配置文件 所以需要指明文件所在位置-->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置datasource 数据库连接信息 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<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>
<!-- 配置factory -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"></bean>
<!-- 扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yyl.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="factory"></property>
</bean>
<!-- 配置事务 -->
<bean id="myTxMagage"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"></bean>
<!-- 声明事务 -->
<tx:advice id="myTxAdvisor" transaction-manager="myTxMagage">
<tx:attributes>
<tx:method name="ins*" />
<tx:method name="del*" />
<tx:method name="upd*" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 配置AOP -->
<aop:config>
<aop:pointcut expression="execution(* com.yyl.service.impl.*.*(..))"
id="mypoint" />
<aop:advisor advice-ref="myTxAdvisor" pointcut-ref="mypoint" />
</aop:config>
<!-- 配置代理设置 设为cglib代理模式 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
</beans>