Spring -- 小练习

目标:ajax 查询分页   。

需求 :

1、整体框架必须使用完整的配置办法。

2、spring中包含注解扫描、属性文件加载、数据源、sqlsessionfactory对象、扫描器、声明式事务。

3、页面显示使用ajax。

4、对象向json字符串转换使用Gson工具包

5、service中注解

效果图如下:

                     Spring -- 小练习

步骤、

1、 建立数据库相关表 -- emp(学生信息表) dept(学院信息表)

Spring -- 小练习

2、在程序中建立响应的类

  a.首先要明确所需信息是由两表联合查询到的,且 由emp表中的列 deptno 与 dept 表中的列 id 进行连接查询

    所以创建的emp类中应包含dept表中信息。

   建立如下两个实体类:

             Spring -- 小练习             Spring -- 小练习

 b. 因为需要实现分页,故创建相应的PageInfo类 来存储每一页的信息,以及相关分页的信息。

                        Spring -- 小练习

 

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>

 

上一篇:uni.navigateTo 最大支持跳转10个页面


下一篇:C++对象模型详解