工程结构如下图所示:
首先我们新建一个动态的web工程,之后再配置它所对应的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>SpringMVCmybatisSpring</display-name>
<!-- 设置工程默认第一个运行页面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- encoding用来指定一个具体的字符集 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 设置forceEncoding是否启用 -->
<init-param>
<!-- 过滤器会判断request.getCharacterEncoding()是否为null,如果是null那么就会进行request.setCharacterEncoding("UTF-8")的操作,如果不是null那么过滤器什么也不会做。 -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤本地路径所有的文件 -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener>
和 <context-param></context-param> 2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext. 4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext
= ServletContextEvent.getServletContext(); -->
<!-- 绑定spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext.xml</param-value>
</context-param>
<!-- 配置容器管理bean监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 容器清理监听侦听器当容器进行清理工作时可能有的bean还在运行而容器会直接把它清除,这个方法就是自动判别bean有没有被使用什么时候可以清除 -->
<listener>
<listener-class>
org.springframework.web.context.ContextCleanupListener
</listener-class>
</listener>
<!-- 这个Spring Web应用程序的前端控制器,负责处理所有应用程序请求 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--将所有请求映射到spring-mvc处理 -->
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第二步:我们来配置它所对应的spring-mvc-servlet.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-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 扫描com.zhiyuan.controller目录下的控制器 -->
<context:component-scan base-package="com.zhiyuan.controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<!-- 设置前缀 -->
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<!-- 设置后缀 -->
<value>.jsp</value>
</property>
</bean>
</beans>
当我们的spring-mvc配置完成以后我们就可以来进行spring与mybatis的配置了,当然它们的配置没有前后关系,但萝卜青菜各有所爱。我就喜欢先配置spring-mvc以后再配置其他的
,废话不多说我们来进行spring与mybatis的配置了,我们新建一个spring bean con...... .xml文件进行spring的配置,代码如下:
<?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:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
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-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/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
default-autowire="byName" default-lazy-init="false">
<!-- 设置连接池,我们使用的式dbcp连接方式需要把相关架包传到本地路径下 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/springmvc?characterEncoding=utf8"
p:username="root" p:password=" " p:maxActive="10" p:maxIdle="10">
</bean>
<!-- 事务管理配置 -->
<bean
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 根据配置文件创建工厂 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource属性指定要用到的连接池 -->
<property name="dataSource" ref="dataSource"></property>
<!--configLocation属性指定mybatis的核心配置文件 -->
<property name="configLocation" value="classpath:config/config.xml"></property>
<!-- 所有配置的mapper文件 -->
<property name="mapperLocations" value="classpath*:com/zhiyuan/mapper/*.xml"></property>
</bean>
<!-- 映射文件路径 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zhiyuan.mapper"></property>
</bean>
</beans>
下面我们来进行mybatis的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<typeAliases>
<typeAlias alias="User" type="com.zhiyuan.pojo.User"/>
<typeAlias alias="Order" type="com.zhiyuan.pojo.Order"/>
<typeAlias alias="Canshu" type="com.zhiyuan.pojo.Canshu"/>
</typeAliases>
</configuration>
然后我们来进行log4j的配置
log4j.rootLogger = debug,stdout,file
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
# Redirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
#outputs to Tomcat home
log4j.appender.file.File=${catalina.home}/logs/Fenye.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
这时候我们的spring-mvc,spring,mybatis就完成整合,顺便把log4j配置了一下,然后就让我们趁热打铁实现分页显示的功能吧!
首先我们编写一下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>
</head>
<body>
<form action="User/Fenye" method="get">
<input type="text" name="id"/>
<input type="submit" value="提交">
</form>
</body>
</html>
然后我们就去web工程的src目录下编写与其相关的控制类与实体类以及它所对应的映射文件首先我们先将编写数据库表所对应的实体类与它所对应的操作方法,
控制器conllort的代码为:
package com.zhiyuan.conllert;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.zhiyuan.mapper.UserMapper;
import com.zhiyuan.pojo.Canshu;
import com.zhiyuan.pojo.Order;
@Controller
@RequestMapping("User")
public class Conllert {
private static final Logger log=Logger.getLogger(Conllert.class);
@Autowired
UserMapper UserMapper;
@RequestMapping(value = "Fenye", method = RequestMethod.GET)
public ModelAndView add(HttpServletRequest request, HttpServletResponse response) {
int id = Integer.parseInt(request.getParameter("id"));
int page = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page"));
if (page <= 0) {
page = 1;
}
Canshu canshu = new Canshu();
// 设置页数
int yeshu;
// 获取查询所得的记录数
int op = UserMapper.shu(id);
if (op % canshu.getOp() == 0) {
yeshu = op / canshu.getOp();
} else {
yeshu = 1 + op / canshu.getOp();
}
String pageStr = "";
if (page >= yeshu) {
pageStr = String.format("<a href=\"%s\">上一页</a> <a href=\"%s\">下一页</a>",
request.getRequestURI() + "?page=" + (page - 1) + "&id=" + id,
request.getRequestURI() + "?page=" + (page) + "&id=" + id);
}else{
pageStr = String.format("<a href=\"%s\">上一页</a> <a href=\"%s\">下一页</a>",
request.getRequestURI() + "?page=" + (page - 1) + "&id=" + id,
request.getRequestURI() + "?page=" + (page + 1) + "&id=" + id);
}
int m = canshu.getOp();
int n = (page - 1) * m;
List<Order> list = UserMapper.Userbyid(id, n);
ModelAndView mav = new ModelAndView("Fenye");
mav.addObject("orders", list);
mav.addObject("pagelist", pageStr);
mav.addObject("page",page);
return mav;
}}
数据表所对应的实体类的代码为(com.zhiyuan.pojo包下):
User:
package com.zhiyuan.pojo;
import java.util.List;
public class User {
private int id;
private String username;
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
order:
package com.zhiyuan.pojo;
public class Order {
private int orderId;
private String orderNo;
private float money;
private int userId;
private User user;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
}
Canshu(这个里面是分页所常用到的值我们将它封装到一个类里面(由于个人比较懒所以我在页面上基本上没怎么使用这个类,而是直接传值,希望大家不要更我一样ヾ(@⌒ー⌒@)ノ)):
package com.zhiyuan.pojo;
public class Canshu {
public int id;//根据条件的id
public int page;//页数
public int zongpage;//总页数
public int n;//开始
public int m;//每页显示记录
public int op=3;//每页显示记录
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getZongpage() {
return zongpage;
}
public void setZongpage(int zongpage) {
this.zongpage = zongpage;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
public int getM() {
return m;
}
public void setM(int m) {
this.m = m;
}
public int getOp() {
return op;
}
public void setOp(int op) {
this.op = op;
}
}
(com.zhiyuan.mapper包下)配置实体类所对应的接口与映射文件:
package com.zhiyuan.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.zhiyuan.pojo.Order;
public interface UserMapper {
public int shu(int id);
public List<Order> Userbyid(@Param("id")int id,@Param("n")int n);
public void data(@Param("user_id")int user_id,@Param("order")int order);
public void update(Order order);
public Order whi(@Param("id")int id);
}
映射文件的代码为
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.zhiyuan.mapper.UserMapper">
<select id="shu" parameterType="int" resultType="int">
SELECT count(*) FROM `order` o where o.user_id=#{id}
</select>
<resultMap id="UserByid" type="Order">
<id property="orderId" column="order_id" />
<result property="orderNo" column="order_no" />
<result property="money" column="money" />
<result property="userId" column="user_id" />
<collection property="user" column="user_id" ofType="User">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="mobile" column="mobile" />
</collection>
</resultMap>
<select id="Userbyid" parameterType="int" resultMap="UserByid">
SELECT o.*,u.* FROM `order` o,`user` u WHERE o.user_id=u.id and o.user_id=#{id} limit #{n},3
</select>
<delete id="data" parameterType="int" >
delete from `order` where user_id=#{user_id} and order_id=#{order}
</delete>
<select id="whi" parameterType="int" resultType="com.zhiyuan.pojo.Order">
SELECT * FROM `order` WHERE order_id=#{id}
</select>
<update id="update" parameterType="Order">
UPDATE `order` SET order_no=#{orderNo},money=#{money} WHERE order_id=#{orderId}
</update>
</mapper>
最后我们就可以来编写分页的jsp页面了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.zhiyuan.pojo.*,java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
html, body {
padding: 0;
margin: 0;
position: relative;
background: url(../img/body.jpg);
background-repeat: repeat;
color: #fff;
letter-spacing: 1px;
font-family: Georgia, "Times New Roman", Times, serif;
}
.zebra caption {
font-size: 20px;
font-weight: normal;
background: url(../img/zebratable.png);
background-repeat: no-repeat;
background-position: 130px center;
padding-top: 20px;
height: 50px;
}
#container {
padding-top: 20px;
width: 960px;
margin: 0 auto;
}
table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
-webkit-box-shadow: 0px 2px 1px 5px rgba(242, 242, 242, 0.1);
box-shadow: 0px 2px 1px 5px rgba(242, 242, 242, 0.1);
}
.zebra {
border: 1px solid #555;
}
.zebra td {
border-left: 1px solid #555;
border-top: 1px solid #555;
padding: 10px;
text-align: left;
}
.zebra th, .zebra th:hover {
border-left: 1px solid #555;
border-bottom: 1px solid #828282;
padding: 20px;
background-color: #151515 !important;
background-image: -webkit-gradient(linear, left top, left bottom, from(#151515),
to(#404040)) !important;
background-image: -webkit-linear-gradient(top, #151515, #404040)
!important;
background-image: -moz-linear-gradient(top, #151515, #404040) !important;
background-image: -ms-linear-gradient(top, #151515, #404040) !important;
background-image: -o-linear-gradient(top, #151515, #404040) !important;
background-image: linear-gradient(top, #151515, #404040) !important;
color: #fff !important;
font-weight: normal;
}
.zebra tbody tr:nth-child(even) {
background: #000 !important;
color: #fff;
}
.zebra tr:hover * {
background: #eeeeee;
color: #000;
}
.zebra tr {
background: #404040;
color: #fff;
}
</style>
<script src="../js/jquery-3.1.1.js"></script>
</head>
<body>
<div id="container">
<table class="zebra">
<caption>Beautiful design tables in HTML in the style of a
zebra.</caption>
<thead>
<tr>
<th>用户编号</th>
<th>用户名</th>
<th>用户号码</th>
<th>消费编号</th>
<th>预留号码</th>
<th>消费金额</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<%
List<Order> list = (List<Order>) request.getAttribute("orders");
int p = 0;
for (Order or : list) {
User us = or.getUser();
%>
<tr>
<td><p><%=us.getId()%></p></td>
<td><p><%=us.getUsername()%></p></td>
<td><p><%=us.getMobile()%></p></td>
<td><p><%=or.getOrderId()%></p></td>
<td><p><%=or.getOrderNo()%></p></td>
<td><p><%=or.getMoney()%></p></td>
<td><a
href="../User/nihao?id=<%=us.getId()%>&order=<%=or.getOrderId()%>&page=<%=request.getAttribute("page")%>"><input
type="button" value="nihao"></a> <a
href="../User/update?id=<%=us.getId()%>&order=<%=or.getOrderId()%>&page=<%=request.getAttribute("page")%>"><input
type="button" value="nihao"></a></td>
</tr>
<%
p++;
}
if (p < 3) {
for (int o = p; o < 3; o++) {
%>
<tr>
<td><p></p></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<%
}
}
%>
<tr>
<td colspan="7">
<%
String op = (String) request.getAttribute("pagelist");
%><%=op%></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
最后大功告成,我们现在来总结一下分页功能所要用到的公式,我们进行分页第一个要知道的就是我们一页要显示多少条记录,和它总共查询了多少条记录,和当前页面所在的页数最后通过limit限制查询,第一个条件可以由我们来进行设置,第二个条件我们可以通过sql语句的count函数获取,第三个我们可以先默认为1然后通过页面的上一页现已也来进行增减,这种时候我们所谓的公式就出来啦limit里面总共有两个函数第一个式查询从多少条记录+1行开始查询,第二个就是要查询多少条记录,比如它的函数为n与m,那么当前页数与n,m之间的关系就是n=(当前页数-1)*m+1,由于limit限制查询中n是在它后一条数据开始查询所以我们的公式最后为n=(当前页数-1)*m,然后将它运用到工程上就可以了