zoukankan      html  css  js  c++  java
  • SSM练手-增删改查-2-分页

    分页的使用

    1 使用MAVEN引入分页插件:pom.xml

        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>5.0.2</version>
        </dependency>

    2 在 MyBatis 配置 xml 中配置拦截器插件 : 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>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageInterceptor">
                <!--分页参数合理化
                    当该参数设置为 true 时,
                        pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。
                    默认false 时,直接根据参数进行查询。
                -->
                <property name="reasonable" value="true"/>
            </plugin>
        </plugins>
    
    </configuration>

    3 后台代码:

    package com.wgs.controller;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.wgs.domain.Employee;
    import com.wgs.service.EmployeeService;
    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.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.util.List;
    
    /**
     * Created by GenshenWang.nomico on 2017/6/8.
     */
    @Controller
    public class EmployeeController {
    
        @Autowired
        EmployeeService employeeService;
    
        /**
         * 分页查询
         * @param pageNo 页码
         * @return
         */
        @RequestMapping(value = {"/emp/list"}, method = {RequestMethod.GET})
        public ModelAndView getEmpList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo){
    
            ModelAndView mv = new ModelAndView("empList");
            ////获取第1页,10条内容
            PageHelper.startPage(pageNo, 10);
            List<Employee> emps = employeeService.getAll();
    
            // 使用pageInfo包装查询后的结果,只需要将pageInfo交给页面就行了。
            // 封装了详细的分页信息,包括有我们查询出来的数据,传入连续显示的页数
            PageInfo<Employee> pageInfo = new PageInfo(emps, 5);
            mv.addObject("pageInfo", pageInfo);
            return mv;
        }
    }

    4 测试:

    package com.wgs.test;
    
    import com.github.pagehelper.PageInfo;
    import com.wgs.domain.Employee;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mock.web.MockHttpServletRequest;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.web.WebAppConfiguration;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    import java.util.List;
    
    /**
     * Created by GenshenWang.nomico on 2017/6/8.
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:springmvc-servlet.xml"})
    public class MVCTest {
    
        // 传入Springmvc的IOC容器
        @Autowired
        WebApplicationContext context;
    
        MockMvc mockMvc;
    
        @Before
        public void initMokcMvc() {
            mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        }
    
        @Test
        public void testPage() throws Exception{
            //模拟请求
            MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emp/list")
                    .param("pageNo", "3"))
                    .andReturn();
    
            //请求成功以后,请求域中会有pageInfo;我们可以取出pageInfo进行验证
            //获取请求域
            MockHttpServletRequest request = result.getRequest();
    
            PageInfo<Employee> pageInfo = (PageInfo)request.getAttribute("pageInfo");
            System.out.println("当前页码:" + pageInfo.getPageNum());
            System.out.println("总页码:" + pageInfo.getPages());
            System.out.println("总记录数:" + pageInfo.getTotal() );
            System.out.println("在页面连续显示的页码:");
            int[] nums = pageInfo.getNavigatepageNums();
            for (int i : nums){
                System.out.println(" " + i);
            }
    
            //获取传入页码数页面的员工数据
            List<Employee> employeeList = pageInfo.getList();
            for (Employee e  : employeeList){
                System.out.println("Emp id :" + e.getEmpId() + "Emp name :" + e.getEmpName());
            }
        }
    }

    ----------------------------------------------MockMVC------------------------------------------------------------------------------

    spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)

    1、mockMvc.perform执行一个请求;
    
    2、MockMvcRequestBuilders.get("/user/1")构造一个请求
    
    3、ResultActions.andExpect添加执行完成后的断言
    
    4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
    
    5、ResultActions.andReturn表示执行完成后返回相应的结果。

    MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,StandaloneMockMvcBuilder继承了DefaultMockMvcBuilder。直接使用静态工厂MockMvcBuilders创建即可:

    MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;

    MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了;

    其中DefaultMockMvcBuilder还提供了如下API:

    addFilters(Filter... filters)/addFilter(Filter filter, String... urlPatterns):添加javax.servlet.Filter过滤器

    defaultRequest(RequestBuilder requestBuilder):默认的RequestBuilder,每次执行时会合并到自定义的RequestBuilder中,即提供公共请求数据的;

    alwaysExpect(ResultMatcher resultMatcher):定义全局的结果验证器,即每次执行请求时都进行验证的规则;

    alwaysDo(ResultHandler resultHandler):定义全局结果处理器,即每次请求时都进行结果处理;

    dispatchOptions:DispatcherServlet是否分发OPTIONS请求方法到控制器;

    StandaloneMockMvcBuilder继承了DefaultMockMvcBuilder,又提供了如下API:

    setMessageConverters(HttpMessageConverter<?>...messageConverters):设置HTTP消息转换器;

    setValidator(Validator validator):设置验证器;

    setConversionService(FormattingConversionService conversionService):设置转换服务;

    addInterceptors(HandlerInterceptor... interceptors)/addMappedInterceptors(String[] pathPatterns, HandlerInterceptor... interceptors):添加spring mvc拦截器;

    setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager):设置内容协商管理器;

    setAsyncRequestTimeout(long timeout):设置异步超时时间;

    setCustomArgumentResolvers(HandlerMethodArgumentResolver... argumentResolvers):设置自定义控制器方法参数解析器;

    setCustomReturnValueHandlers(HandlerMethodReturnValueHandler... handlers):设置自定义控制器方法返回值处理器;

    setHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)/setHandlerExceptionResolvers(HandlerExceptionResolver... exceptionResolvers):设置异常解析器;

    setViewResolvers(ViewResolver...resolvers):设置视图解析器;

    setSingleView(View view):设置单个视图,即视图解析时总是解析到这一个(仅适用于只有一个视图的情况);

    setLocaleResolver(LocaleResolver localeResolver):设置Local解析器;

    setFlashMapManager(FlashMapManager flashMapManager):设置FlashMapManager,如存储重定向数据;

    setUseSuffixPatternMatch(boolean useSuffixPatternMatch):设置是否是后缀模式匹配,如“/user”是否匹配"/user.*",默认真即匹配;

    setUseTrailingSlashPatternMatch(boolean useTrailingSlashPatternMatch):设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;

    addPlaceHolderValue(String name, String value) :添加request mapping中的占位符替代;

    因为StandaloneMockMvcBuilder不会加载Spring MVC配置文件,因此就不会注册我们需要的一些组件,因此就提供了如上API用于注册我们需要的相应组件。

      

      perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;

      andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;

      andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台;

      andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理;

    MockMvcRequestBuilders主要API:

    MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder;如get("/user/{id}", 1L);

    MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;

    MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get类似,但是是PUT方法;

    MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get类似,但是是DELETE方法;

    MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get类似,但是是OPTIONS方法;

    ResultActions

    调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,通过ResultActions完成如下三件事:

    ResultActions andExpect(ResultMatcher matcher) :添加验证断言来判断执行请求后的结果是否是预期的;

    ResultActions andDo(ResultHandler handler) :添加结果处理器,用于对验证成功后执行的动作,如输出下请求/结果信息用于调试;

    MvcResult andReturn() :返回验证成功后的MvcResult;用于自定义验证/下一步的异步处理;(主要是拿到结果进一步做自定义断言)

  • 相关阅读:
    设置类库项目的程序集名称和默认命名空间
    网上购物系统(Task101)——业务逻辑层BLL(工厂模式实现热插拔)
    网上购物系统(Task102)——登录控件的使用(登录控件的基本配置)
    1.1.3 以类为单位的编程思想
    1.1.2 ADO.NET模型
    网上购物系统(Task100)——业务逻辑层BLL(面向接口的编程模式)
    ASP.NET(C#)命名规范(前缀)
    如果我说,类就是一个人,你会信吗?
    1.1.1 什么是ADO.NET
    [置顶] 编程就是用计算机语言写文章
  • 原文地址:https://www.cnblogs.com/noaman/p/6964483.html
Copyright © 2011-2022 走看看