HttpServletBean(继承来自java的HttpServlet):参与创建(不处理请求);派生出FrameworkServlet:初始化WebApplicationContext;重写doXXX()请求方法(doOptions()中新增对PATCH类型请求的处理);请求的一些前置处理如核心模板(装饰模式)方法processRequest(request,response)中调用doService(request,response)并由DispatcherServlet实现
web.xml配置/maven依赖使用
配置前端控制器Servlet---配置处理器映射器HandlerMapping---配置处理器适配器HandlerAdapter---配置视图解析器ViewResolver---开发表现层,配置Action/Controller
Spring MVC 充当控制层,接受前台传递的参数(基于方法的设计),调用业务逻辑层进行业务处理以及将返回的结果集返回前台进行展示, web.xml 中配置Spring MVC 的前端总控制器DispatcherServlet并加载Spring MVC 的配置文件,在Controller 层上加上@Controller 注解,使其充当控制层,在Spring mvc的配置文件中通过component-scan 对Controller 层进行扫描从而使类中的@Controller 注解生效;@PathVariable从路径中获取信息,@Resource 进行Bean 注入;将返回值类型改为ModelAndView并在配置文件中配置视图解析器的前缀和后缀,以此来给我们前台页面传递数据,也可以在方法中通过ModelMap进行返回数据,也可以通过@ResponseBody将返回的实体类或者实体类的集合转换为指定的格式进行前台页面交互;@RequestMapping是将Url映射到具体的方法上。文件上传时@RequestParam来接收前台上传的文件 核心处理方法:doService() 先对request中的Attribute做快照备份;设置request属性:webApplicationContext,localResolver,themeResolver,themeSource和与flashMap(redirect时参数传递)相关属性 然后它调用(将请求转发)doDispatch(): 1、根据request(先检查是否为上传请求,转为MultipartHttpServletRequest)通过HandlerMapping(处理器映射)的getHandler(request)返回HandlerExcutionChain找到Handler(处理器/控制器;对应Controller具体类或方法如@RequestMapping,包括Interceptor) 2、找到HandlerAdapter(适配器。由于Servlet处理请求的方式固定参数(request,response)不灵活)灵活使用Handler处理请求,返回信息(模型Model,实质为Map,被格式化如html发送给视图);处理之前先判断get/head请求头中的lastModified是否过期(返回304表示未过期,直接使用缓存;过期则重新生成资源),然后执行Interceptor和preHandler;控制器打包模型和标记视图名,返回DispatcherServlet 3、调用prosessDispatchResult()处理结果(使用各种Resolver渲染输出(主要ViewResolver(将String类型的逻辑视图(不是真正的视图)解析为View类型的视图)处理View(渲染页面));如果是异常用HandlerExceptionResolver,);返回之前同样先执行Interceptor和postHandler 自动装配DispatcherServlet和应用上下文到servlet容器: 实现(由它创建DispatcherServlet和另一个上下文ContextLoaderListener)并重写方法AbstractAnnotationConfigDispatcherServletInitializer(或手动装配即实现WebApplicationInitailizer初始化器): String[] getServletMapping():参数”/”即映射到默认servlet处理请求 Class>[] getRootConfigClasses():用定义在方法中的返回(反射得出的class)即配置类(即@Configration标注)或配置文件中bean配置ContextLoaderListener上下文 Class>[] getServletConfigClasses():同理配置DispatcherServlet上下文 @EnableWebMvc标注配置类 配置类开启组件扫描(扫描@Controller标注的bean否则只能使用默认servlet)并配置视图解析器: @Bean ViewResolver viewResolver() { resolver.setPrefix(“WEB-INF/views/”)/setSuffix(“.jsp”)//确定用来渲染模型的视图的物理位置 } 对应 通过resolveViewName()返回View接口(接收model和request及response并输出结果渲染到response) @Controller声明它是要被扫描的控制器 @RequestMapping(value方法要处理的请求路径[数组],method=”RequestMethod.GET/HEAD/PUT/POST/DELETE[,produces=”application/json”]);如果标注bean,则是类级别请求处理,方法上注解进行补充;且注意返回的字符串的完整性与URL的完整性和对应性(返回modelandview时可能要先调用其setViewName()添加类上的@RequestMapping,否则404) @ResponseBody将方法返回的对象(不是html而是某些格式的数据时)通过HttpMessageConventer转为指定格式,写入响应体 传递Model到视图:@AutoWired注入bean(包括service,dao等),构造model(如addAttribute()) 返回结果: String(逻辑视图名,被配置的视图解析器Resolver解析为实际视图,根据url推断model) model/map或者List ModelAndView返回值和页面地址;Model返回值,地址需要return 查询参数/get(如分页需要参数total总条数,size每页条数): 业务逻辑方法或Controller方法的参数(即在需要前端传递来参数的地方)被标注且value值必须与参数名相同,如@RequestParam(value=”total”,defaultValue=””) int total 表单参数/处理表单/post:前台数据传递到后台处理 处理器方法参数一般为对象,对象属性用请求中同名数据填充 数据校验(至少不能提交空的表单): 初级方式:方法中代码先检查值的合法性,不合法则重新显示表单(或者前端表单校验);扰乱了处理器方法逻辑 API校验(JSR-303):javax.validation.constraints下注解@Valid用在方法参数上标注该对象需要校验合法;紧跟其后的参数Errors处理校验出错的情况(方法最先调用Errors.hasErrors()检查错误,出错则返回重写表单视图);而@Digits,@AssertTrue/false,@Max/Min,@Null/NotNull,@Pattern,@Size等用在POJO属性上实现限制 请求处理完后重定向(如到基本信息页面)防止重复提交;但重定向不携带请求(中的模型和属性);跨域数据传输: 以路径变量或查询参数String直接添加在url后面不安全;使用URL模板以路径变量或查询参数作占位符传递数据(重写重定向的url)安全;重定向之前将对象放在会话(长期存在且跨请求)中,在需要时可取;但spring认为不需要管理这些数据,提供flash功能(携带数据),通过RedirectAttributes(Model的子类,所以也是Map的key-value形式)设置flash属性,如addFlashAttribute();flash属性被保存到会话,重定向以后又从会话转义到模型 路径变量/get: url显示/…/10;它区别于查询参数(url显示/…/路径方法?total=10);方法标注和{}占位(其中的值必须与参数名相同),如@RequestMapping(value=”/{total}”);方法的参数标注告知占位符用于哪个参数,如@PathVariable(“total”) int total;它只是作用,即可省value属性(它假设占位符名与参数名相同),路径变量都会传给参数 @RequestBody(前台传来的json格式数据解析为bean),@RequestAttribute,@RequestParam,@RequestHeader,@CookieValue,@SessionAttribute:从http请求的各地方获取参数,如请求体(复杂数据如json),请求的attribute中(过滤器或拦截器时手动设置的一些临时数据),请求参数(简单数据,键值对),请求头,cookie中,会话中等 @ResponsBody(实例类转为json格式数据)/@RestController:实现RestFul接口;设置复杂的响应数据如json restful风格:请求处理,使之还能支持delete/put请求,且url简洁明晰 视图解析器:BeanNameViewResolver/XmlViewResolver解析为上下文/xml文件中定义的bean;FreeMarkerViewResolver/VelocityViewResolver解析为模板;InternalResourceViewResolver解析为应用的内部资源如JSP;ThymeleafViewResolver multipart格式的数据将表单拆分为多个输入域,其中存放普通文本数据和二进制数据(文件) 装配MultipartResolver解析器(派生出CommonsMultipartResolver和StandarServletMultipartResolver) java配置MultipartConfigElement,略;对一个 前端 接收参数一般为byte[]类型;MultipartFile功能等丰富:获取文件的byte,文件名、大小、输入流(读取数据)和transferTo()将文件写入本地文件系统;还可用Part、DiskFileItemFactory、CommonsMultipartFile(多文件上传) 自动或@ResponseStatus标注异常类手动抛出将异常映射为http状态码(如404对应spring抛出异常NoSuchRequestHandlingMethodException);或者@ExceptionHandler标准处理器方法亲自处理异常,属性为反射的异常类 提高复用:@ControllerAvice(包含了@Component功能)标注的类实现针对控制器(类)的通知;其中包含@ExceptionHandler,@InitBinder,@ModelAttribute标注的方法;所有抛出和属性值相同的异常类,都会用处理器此方法处理 拦截器基于java的反射机制,使用代理模式;不依赖servlet容器;只对action方法起作用并访问上下文,堆栈里面的对象 过滤器基于函数回调;依赖servlet容器;对所有的请求起作用(可以保护资源);不能访问所过滤的URL上下文以及其中内容 spring web flow:编写流程化(元素按规定流程运行)的web程序、 web.xml==》 SpringMV核心控制器DispatcherServlet加载controller.xml,配置component-scan扫描controller层并是注解生效;配置视图解析器使页面添加前缀后缀; Spring监听器ContextLoaderListener加载spring-common.xml,配置dbcp等数据连接池/数据源,配置sqlSession加载sqlMapper.xml即扫描dao层; 控制层@Controller,@RequestMapping;@Resource注入service层; service层:@Service并通过@Autowired注入dao层,配置切面控制service层事务; dao层:只要接口,配合sqlMapper.xml通过namespcae指明实现的dao接口,sql语句与接口中方法名一致从而指定调用的sql SSH流程的不同是配置FilterDispatcher加载struts.xml,并对指定后缀名文件拦截;控制层继承AcitonSupport-BaseAction,提供getRealPath(),outjson()等方法;dao层继承HibernateDaoSupport;spring-conmon.xml配置sessionFactory,注入数据源dataSource 身份认证、授权/访问控制;包含核心(core,提供SpringSecurity基本库),配置(configuration,通过xml和java配置SpringSecurity的功能支持),web(SpringSecurity基于Filter的web安全性支持),JSP标签库,加密,切面…等模块 DelegatingFilterProxy(特殊ServletFilter)委托javax.servlet.Filter实现过滤;java配置方式:bean继承初始化器WebApplicationInitializer(或其下的AbstractSecurityWebApplicationInitializer,类中已经重载appendFilters()或insertFilters()注册Filter,可添加自定义Filter,spring已在web容器注册DelegationFilterProxy);XML方式 创建实现WebSecurityConfigurer(或继承WebSecurityConfigurerAdapter)的配置类bean,并@EnableWeb[Mvc]Security标注来启用web安全性功能;重载方法(实现安全细节: configure(WebSecurity):配置Filter链过滤请求 configure(HttpSecurity):配置拦截器保护请求 默认实现(指定了请求保护方式及客户端用户认证方案;分别为要求http请求进行验证and启用默认的基于表单的简单登录andHTTPBasic方法式验证):httpSecurity.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic(); authorizeRequests()方法返回的对象的其他方法配置验证(请求级别),如 -antMatchers/regexMatchers('[HttpMethod.GET/POST,]“/…/…”)规定指定的路径[的请求方法]下的请求需要认证,路径参数列表支持Ant风格通配符/正则表达式或** -requiresChannel()声明URL必须要求走的通道(强制通道安全,如提交密码时走https,与上一个方法配合: .requiresChannel().antMathcers(“/a/form”).requiresSecure()/requiresInsecure()) -authenticated()要求执行请求时必须已登录,否则重定向到登录页 -hasAuthority/hasRole(string)用户具有指定权限/角色才能访问- rememberMe()用户实现过Remember-me功能认证则允许访问 -anyRequest()不需要认证和权限,应在最后(方法可连接但功能按顺序发挥,请求相关应放在前) -permitAll()允许请求无任何安全限制 … 通常这些方法是一维(如hasRole()与hasIpAddress()不共存);SpEL被SpringSecurity扩展,借助access()声明复杂访问限制: .access(“hasRole(string) and hasIpAddress(‘192…)”) 防止跨站请求伪造CSRF(来自其它站点的请求,提交后数据保存到它的服务器):虽默认开启防护,但还需处理 拦截状态变化的请求(非get,head,options,trace)请求并检查是否包含或匹配服务器中的同步的CSRF token;否则请求失败,CsrfException 表单必须在”_csrf”域中提交token,如 configure(AuthenticationManagerBuiler amb):配置user-detail服务(用户存储支撑认证即注册后,数据库、内存、LDAP或自定义存储用户信息否则不能登录) 用户存储-用户验证: 1)到内存(启用内存存储,存储用户名、密码、授予权限):amb.inMemoryAuthentication().withUser(“userName”).password(“password”).roles(“USER”).and().withUser(“admin”).password(“password”).roles(“USER”,“ADMIN”);//用户2具有admin和user两个角色,也即*拥有admin权限 UserDetailsManagerConfigurer.UserDetailsBuilder的详细配置用户信息方法: accountExpired(boolean)://账号是否过期 accountLocekd(boolean)://锁定 roles(string)/authorities(GrantedAuthority…)://授权 disabled(booelan)://禁用 withUser(string)password(string): 权限设计:5张表 用户表:登录后,获取用户信息(id) 角色表:角色信息,角色id 用户角色关联表:用户id关联得到用户拥有的角色id集合 权限/菜单表:权限信息,根据权限id显示菜单 角色权限关联表:角色id关联到角色拥有的权限id集合 2)到数据库: bean中@Autowired注入DataSource来访问数据库 重写查询功能代替默认的amb.jdbcAuthentication().dataSource(dataSource).自定义如usersByUsernameQuery(“sql语句”).authoritiesByUsernameQuery(“sql语句”); 查询基本协议:以用户名做唯一的查询参数;用户认证=姓名、密码、是否启动;鉴权=查询0或多行包含姓名和权限信息的数据(群组权限包含群组ID) 密码转码:PasswordEncoder接口(3个实现类:BccyptPasswordEncoder,NoOpPasswordEncoder,StandardPasswordEncode;或自定义实现接口)的passwordEncoder(new 实现类()) 3)到LDAP: 基于轻量级目录访问协议LDAP搭建的认证(用户数据存放在LDAP服务器),https加密传输,用于文档管理 4)到非关系数据库(如Mongo,Neo4j) 实现UserDetailsService及方法loadUserByUsername() .httpBasic()启用HTTPBasic认证(通过请求本身来认证用户,如弹出模态对话框要求输入password,实质涉及http401响应) .rememberMe()启用remember-me功能;.tokenValiditySeconds(秒)在cookie中存储token(包含用户名,密码,过期时间,私钥,写入之前已MD5哈希),默认两周过期;.key(string)私钥默认”SpringSecured”;表单参数增加 .logout()退出(默认由LogoutFilter过滤针对/logout的请求,擦除功能,.logoutUrl()返回登录页,可重写此默认方法);.logoutSuccessUrl()成功退出后重定向到某页面 JSP中引入SpringSecurity支持的标签库security;条件性渲染(显示) 通用属性(不同认证方式有不同属性):principal用户基本信息对象,嵌套了基本字段;details附加信息如ip地址、会话ID;… property标示这些属性,如 access被赋值一个SpEL表达式,标示权限 (入口)请求经过过滤器Filter(如ActionContextCleanUp); 请求交由控制器继承了ActionServlet(线程安全的servlet;根控制器)的 action(多例)处理(之前关联表单,请求参数即表单数据被封装成formBean对象,这样不必getParameter());令牌机制防止表单重复提交; (核心)FilterDispatcher(Servlet)被调用,方法询问ActionMapper来决定对应action处理请求(可能使用代理actionProxy); 处理请求并把表单数据保存到ActionForm对象(不存在则创建); 产生结果返回前端 类级别拦截,一个类对应一个request上下文(springMVC方法级别,更容易resultful);方法之间共享action变量;自有interceptor机制,配置繁琐(springMVC用AOP方式,入口servlet;集成了Ajax即@ResponseBody) 将对象属性映射到数据库的列并自动生成语句和查询;延迟加载(有关联对象时如果只关注原对象的属性,则在需要时才加载所依赖的对象);预先抓取(获取完整的关联对象,而不必多次查询);级联操作(表操作的互相影响);分布式缓存 提供这些服务(通称ORM)的如Hibernate,MyBatis,java数据对象JDO,java持久化API及JPA;JDBC持久化没有ORM session.get():一级缓存(session缓存或事务级别缓存,不能关闭)-二级缓存(应用级别缓存)-数据库-返回null; session.load():缓存-设计配置的延迟加载(返回代理类对象)-二级缓存-数据库-ObjextNotFoundException 二级缓存:配置ehcache包;属于sqlSession级别;跨session并被多个session共享;只能存储对象而非属性;默认开启 对象的状态:session的方法改变它们的状态 瞬时:new而未保存;save()/saveOrUpdate()变为持久;可被GC 持久:已保存到数据库;delete()变为临时;evict()/close()/clear()变为游离;修改后(多次update()或者save()),不会发送sql语句,在事务提交时,将其与session中对象比较,不相同才会发送sql语句; 游离:数据库存在而session中不存在(即不被session托管);delete()变为临时;update()/saveOrUpdate()/lock()变为持久;可被GC; 约定优于配置;简化配置和部署;直接嵌套web容器;提供POM文件简化Maven配置;独立spring的应用程序且尽可能自动配置而没有xml配置;集成大量第三方库如jackson,jdbc,mongo,redis,mail;支持模板引擎配置; 入口启动类注解@SprintBootApplication:主要由 @Configutation:springboot隐藏了Controller的@Bean配置 @EnableAutoConfigration:借助@Import支持,收集和注册符合的bean @ComponentScan (其他如ConfigurationProperties等配置类/文件)的复合注解;一站式启动 run()启动后,创建SpringApplication实例;实例初始化 ConfigurableWebAppplicationContext类创建AppliactionContext实例(给web应用或标准standalone应用) SpringFactoresLoader查找并加载ApplicationContextInitializer …较复杂,暂时略 基于spring/springMVC的注解; @AutoConfigureOrder设置自动配置类的加载顺序;值小优先级高;@AutoConfigreAfter/Before; @ConditionalOnBean/Class/Java/…当满足条件如容器中已经包含指定Bean或名称时匹配; 其他功能:异常处理;邮件发送;拦截器(实现HandlerInterceptor中的preHandler()/postHandler()/afterHandler());过滤器;配合配置文件连接数据库; springboot: 默认日志LOGBACK,级别INFO(其他6个TRAVCE,DEBUG,WARN,ERROR,FATAL,OFF最高) 全局配置文件中指定级别;logging.level.root/org.springframework.web=... 指定日志输出到文件而不是控制台: logging.file=绝对/相对路径 或logging.path=目录,该目录下回自动创建spring.log并写入 自定义如log4j。。。 静态资源的配置:springboot默认从classpath的/static,/public,/MATE-INF/resources下加载静态资源 spring.resources.static-location=classpath:/ 默认配置了消息转换器(编码的等设置);工具类FastJson,消息转换器,对json数据的格式化 (必须叫application; Profile配置即针对不同环境的配置,重命名 如application-dev.properties用作开发环境下使用的配置 application-sit.propertiess用作测试环境 如此配置不同参数,如测试时使用另一个端口号) 全局配置文件:application.properties; spring.profiles.active=dev 指明需要使用的配置环境 #配置以后使用hello前面需要添加demo/ server.port=8081(默认8080) server.servlet.context-path=/demo(默认直接访问127.0.0.1:端口号/hello,配置后为/demo/hello) 推荐使用:.yml文件(application.yml,语法规定冒号后面有空格) @ConfigurationProperties基于bean对象类型安全,用于类上,减少@Value的使用,prefix拼接属性变量(需要getter和setter)后与配置中匹配即可;当使用多个数据库/源时,在构建数据库的工具类方法上此注解的属性profix=""还可指定使用哪一个数据源 然后新建user类并提供getter和setter,对类使用@ConfigurationProperties(prefix="user")注解(获取前缀为user的配置) 使用(在其他类中作为属性应用,则属性需注解@Autowired,如果报错不能生成bean,则user类还需注解@Component) 配置文件的复用提高: 多个配置文件application-1.yml,application-2.yml,则application.yml配置文件引用它们: spring: profiles: active: 1(或者2) @EnableAutoConfiguration 开启自动配置,根据依赖;能自动配置的可在spring-boot-autoconfigyre.jar下查看;属性exclude可以指定不自动配置的类 它调用initalize()方法,调用springfactory一些工厂方法,搜寻创建实例化jar @Controller:处理HTTP请求(需要配合只用模板) @RestController:等同于springMVC的@Controller + @ResponsBody(返回以json格式为主的字符串) @RequestManpping:配置URL映射,指定控制器可以处理哪些URL请求 value值可以是集合:value = { "/hello","/hi"} 此注解位于类上,则只有一个值,访问时值用/拼接起来 @PathVariable:获取URL请求中的动态参数(参数值需要在url进行占位),@RequestMapping中{参数}需要和此注解参数保持一致 @RequestParam:获取请求参数的值 @GetMapping:组合注解 spring data jpa: springData是spring子项目,简化数据库访问。它支持关系数据库存储技术包括JDBC和JPA(数据持久化) spring data jpa:java持久化规范,旨在减少数据库访问层(dao)的开发量,开发者仅声明持久层的接口即可 声明持久层接口(继承自Repository或子接口,这些接口定义了常用的增删查改和分页相关方法。可以重写函数) 新建Respository接口继承JpaRespository接口(泛型为实体类型和主键对应属性的的类型) 新建service层及其实现(实现中调用Respository继承来的方法,所有CRUD都可以依赖于它来实现,解脱了程序员自定义操作) 支持诸多关键字:Like如findByNameLike(),In如findByAgeIn()... 框架对方法名解析,去除固定前缀,解析自定义部分 4、事务处理 @Transactional,一般除了查,其他操作都可能需要事务处理 报错1:500,实体类不能被序列化 由于hibernate延迟加载、序列化的机制和json格式机制和springboot序列化机制 需要在实体类注解@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) 忽视某些属性,如果在字段前面加上@JsonIgnore,则查找出来的json对象中会把相关字段全部为null值 5、拦截器 继承WebMvcConfigureAdapter,是先HandlerInterceptor中的方法;注册拦截器 6、异步调用 实现AsyncService接口 7、邮件发送 数据库连接池: dbcp:隶属Apache,Tomcat默认使用的连接池组件;没有自动回收空闲连接的功能;提供最大连接数;维护多个连接对象,高效省内存 c3p0:JDBC连接池即支持JDBC规范,实现了数据源和JNDI绑定,hibernate和spring使用它;自动回收空闲连接;提供最大空闲时间 实现EntityManagerFactory工厂,获取EntityManager实体管理器实例 实现Repository接口,使用各种方法 项目管理工具;生命周期 [clean-] 验证validate(保证项目正确) – compile编译 –test测试 – package打包(创建jar/war等依赖包;部署到服务器) – verify检查(验收) – install安装(到本地仓库,供使用) – deploy部署(拷贝到远程仓库);对应命令mvn pre-clean/clean/post-clean,mvn test/package/install/deploy 简单3个标准生命周期:clean-default/build(部署)-site(项目站点文档创建) 本地仓库:第一次执行maven命令是创建;远程(私有)仓库:开发人员上传共用;中央仓库:网络连接下载;依赖搜索为本地-中央-远程 POM:项目对象模型;可配置项目依赖,插件,执行目标,项目构建,版本,开发者列表,邮件列表; maven坐标:roupId(组id ,机构名,公司名) + artifactId(产品名或id)+ version(版本号); 文件;版本控制;必须要有服务端,网络能连上服务端才能提交和更新;一旦服务器坏了,整个版本库的历史记录就消失,没法再回滚;先更新,再提交,共同操作 源数据;每一台装有git的电脑都是服务端;各台电脑之间相互同步和推送,不需要网络就可提交到本地的git库里;避免SVN的缺点; git仓库的三个组成部分:单独操作,除了创建者,可能没有权限提交更新到中心库 工作区(Working Directory):在git管理下的正常目录都算是工作区,处理编辑工作; 暂存区(Stage):临时区域。git/index目录,存放将要提交文件的快照; 历史记录区(History):git commit 后的记录区; git add/git stage把某个文件加入暂存区;svn add 将某个文件加入版本控制; git reset把文件从历史记录中放到暂存区,反之git commit; 传输控制协议Transmission Control Protocol/Internaet Protocol;网络连接与数据传输的标准;包含一系列处理数据通信的协议: TCP:应用程序之间通信的传输控制协议(发送通信请求,三次握手) UDP:应用程序之间的简单通信的用户数据包协议 IP:计算机之间通信的网际协议(无连接即不占用通信线路) ICMP,DHCP: HTTP(s):web服务器与web浏览器之间的超文本传输协议(安全的) URI:统一资源标识符;建立连接,传输数据; URL:统一资源定位符;特殊URI; 协议:http;域名;端口;目录;参数; request:请求头,请求行,请求数据,空行; response:响应头,状态行,响应内容,空行; SMTP(简易邮件传输),POP(邮局协议),FTP(文件传输) http请求的8个动作:get,post,put,delete,head,options,trace,connect Tomcat调优:配置文件server.xml中参数设置;调优线程数,连接数;调优JVM及非堆内存分配,内存限制,;调优连接和IO |--顶层容器Server:一个;默认实现类StandardServer |--Service:提供服务,n个;实现类StandardService |--Connector:处理连接,并提供Socket连接、request封装、response转换;一个;用属性executor配置线程池 |--Adapter |--Container: |--Engine:引擎,管理站点,一个 |--Host:站点/虚拟主机;应用集合 |--Context:应用程序,web.xml,root目录下是主应用 |--Wrapper:封装和管理Servlet,处理请求 BootStrap:Tomcat入口 main()中创建了BootStrap,调用init()初始化WebAppClassLoader(用来创建Catalina) Catalina:管理Tomcat(服务器生命周期) setAwait():Server启动后是否进入等待状态 load():根据server.xml创建Server并调用init()进行初始化 start():启动服务器(调用Server的start()) stop():调用Server的stop() await():循环 对应方法都是按照层级结构逐级调用 Server:服务器; addServic/remove(service): init(),start() ctrl+alt切换系统;列出文件列表ls; power on/off开关机 创建/移除目录:mkdir/rmkdir; 显示当前目录:pwd; 创文件:touch;看文件cat;wq保存后退出 rm –rf删除文件 显示文件后几行内容:tail; 打包/并压缩:tar –xvf/-zcvf; 查找字符串:grep; 编辑器:vim vi; 目录跳转:cd… ,cd..上一级,ls插卡目录 rsync/scp文件同步 ping,ifconfig, top性能分析工具,能显示进程情况 more分页查看,vi:文件编辑 1)缓存:将从数据库获取的结果暂存,下次使用时直接获取而不是操作数据库;用户缓存,信息缓存 方式1,通过程序直接保存到内存:Map,ConcurrentHashMap 方式2,缓存框架:Redis 缓存创建时机:第一次获取时,程序启动时,或缓存失效时 缓存失效机制:定期失效,或数据变化时失效(粗粒度失效,细粒度失效) 2)页面缓存/静态化(同时处理高并发):程序保存生成的页面,二次调用时无需重新生成 方式:模板技术Freemarker,Velocity 3)数据库优化: 表结构优化 SQL优化 (同表)分区与分表:弊端,连表操作 索引优化 使用存储过程代替直接操作 4)分离活跃数据:如将活跃用户(最近登录或者登录次数等判断)与不活跃用户分离到不同数据表,查询时默认从存储活用用户的表开始检索 5)批量读取与延迟修改:减少操作次数 多次查询合并成一次(如插入数据,因之前需要判断表中是否已存在;每插入一条就查询一次的效率低;将所有要插入的数据的代表字段读取到一个变量,in语句统一查询一次);多个请求(高并发)合并一起(如2秒内的请求合并一起查询一次数据库) 将高并发而频繁增改的数据缓存,定时将缓存中的数据保存到数据库(可能数据丢失) 6)读写分离:对高并发的数据库集群 写(增删改)操作交给主服务器;从底层将数据同步(集群需要处理的核心问题)到其他服务器;多个请求分配到不同服务器处理 7)分布式数据库 不同的表放到不同的数据库,再放到不同服务器;单个复杂请求分配到不同服务器处理 8)应用与静态资源分离(针对高并发) 静态资源(图片,视屏,脚本甚至css文件)存放到服务器,通过域名访问 提高服务器高并发处理能力: 提高CPU并发计算能力(资源,IO,网络);多进程、线程,少进程切换,少用锁,考虑进程优先级;cpu使用率,系统负载 减少内存分配和释放 持久连接/长连接 硬件环境 乱码问题 SpringMVC的字符编码过滤器CharacterEncodingFilter request/response设置字符编码 前台用户输入进行JS验证,防止sql注入,对特殊字符屏蔽,限制输入长度,某些信息限制重复,二次密码一致,用户名与密码匹配,敏感信息加密;后台Bean的注解限制;拦截器过滤器配合权限校验,安全管理;自定义错误页面,良好用户体验;不要动态拼接(+连接)sql,而是参数化(用?传参) 用户注册: 填写手机号,保存手机号和验证码到缓存,设置过期时间 调用短信接口将验证码发送给用户,输入并提交验证码后,根据手机号到缓存中查询并对比验证码,跳转信息页 用户登录: sessionId作为key,用户信息为value保存(到session,内存或缓存框架redis);拦截器拦截并查找,存在则已登录;否则跳转登录页 测试: junit基于注解的方式,@RunWith加载springjunit核心类,@ContextConfiguration加载相关配置文件,@Resource按名字注入Bean,在测试方法上@Test
SSM流程
Spring Security
Struts
Hibernate
SpringBoot
Spring Data JPA
Maven,SVN与Git
最后:其他