Skip to content
zhangjie edited this page Oct 12, 2020 · 10 revisions

通过命令行读取参数

  1. java -jar xxx.jar aaa bbb cccc
    1.1 通过main方法的参数获取
    1.2 或者通过ApplicationArguments注入获取
  2. java -jar xxx.jar --a1=aaa --b1=bbb
    2.1 可以通过@Value("${a1}") 获取

测试用例

pom文件引入jar包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.2.RELEASE</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

单元测试编写

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
                        "classpath:beans.xml",
                        "classpath:mybatis.xml"
                    })
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ServiceTest {
   @Resource
   private TrackService trackService;

   @Test
   public void testFindListByReferenceNo(){
       List<TrackEnt> list =  service.findListByReferenceNo("KKon0019998");
       assertEquals(10,list.size());
   }
}

1.1 通过@Before实现测试用例运行前初始化
1.2 通过@After实现测试用例完成后清理
1.3 参考:https://www.jianshu.com/p/83eadf7b352f

Spring MVC

拦截器
  1. 执行顺序:filter -> Interceptor -> controller
  2. handleInterceptor拦截比filter更加精准,可以到达方法级别
    2.1 preHandle是在进入controller之前执行,postHandle是在返回model渲染视图之前执行,afterCompletion是在request执行完成后执行的
    2.2 拦截配置:
    public class MvcConfig implements WebMvcConfigurer{
        	@Override
        	public void addViewControllers(ViewControllerRegistry registry) {
        		registry.addViewController("/").setViewName("forward:/WEB-INF/views/login.jsp");
        		registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        	}
        
        	@Override
        	public void addResourceHandlers(ResourceHandlerRegistry registry) {
        		registry.addResourceHandler("/webapp/static/**").addResourceLocations("classpath:/webapp/static/");
        	}
        
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(userInterceptor).addPathPatterns("/**").excludePathPatterns("/login/sub.do");
            }
    }
    
    2.3 被拦截后返回错误码
    public class UserInterceptor extends HandlerInterceptorAdapter {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            PdaResponse pdaResult = new PdaResponse();
            pdaResult.setSuccess(false);
            pdaResult.setCode("-2");
            pdaResult.setMessage("pdaNeedReLogin");
            response.getOutputStream().write(JsonUtl.Object2Json(pdaResult).getBytes());
            response.getOutputStream().close();
            return false;
        }
    }
    
session
  1. getSession(boolean create):返回当前request中的HttpSession
    -->如果当前reqeust中的HttpSession为null
    (1)当create为true,就创建一个新的session
    (2)当create为false,返回null
  2. HttpServletRequest.getSession(ture)等同于HttpServletRequest.getSession()
  3. session原理图
    session原理图
    3.1 注册过滤器代理
    tomcat注册过滤器代理
    3.2 Session过滤器执行流程分析
    Session过滤器执行流程分析
    (1)对请求的HttpServletRequest ,HttpServletResponse 对进行包装
    (2)调用 filterChain.doFilter(strategyRequest, strategyResponse)往后传递
    --> 获得session的话,得到的将会是Spring Session 提供的 HttpServletSession实例
    (3)整个过滤器链执行完后,提交session:wrappedRequest.commitSession();
    3.3 SessionRepositoryFilter$SessionRepositoryRequestWrapper#getSession方法分析
     1. S requestedSession = getRequestedSession();
       1.1 List<String> sessionIds = SessionRepositoryFilter.this.httpSessionIdResolver
           						                                .resolveSessionIds(this);
          (1)httpSessionIdResolver分为CookieHttpSessionIdResolver和HeaderHttpSessionIdResolver
             --> 分别从cookie或者头部获取sessionId
       1.2 S session = SessionRepositoryFilter.this.sessionRepository
          							                    .findById(sessionId);
          -->通过sessionId在存储里查找session
     2. 如果根据sessionId没有找到sesssion并且create参数为true,则新建
       --> S session = SessionRepositoryFilter.this.sessionRepository.createSession();
    

Clone this wiki locally