当前位置: 首页 > news >正文

在哪里可以建网站有什么网站是做名片印刷的

在哪里可以建网站,有什么网站是做名片印刷的,网站培训网站建设,wordpress动漫主题一、如何定制和修改Servlet容器的相关配置 前言#xff1a; SpringBoot在Web环境下#xff0c;默认使用的是Tomact作为嵌入式的Servlet容器#xff1b; 【1】修改和server相关的配置#xff08;ServerProperties实现了EmbeddedServletContainerCustomizer#xff09;例如…一、如何定制和修改Servlet容器的相关配置 前言 SpringBoot在Web环境下默认使用的是Tomact作为嵌入式的Servlet容器 【1】修改和server相关的配置ServerProperties实现了EmbeddedServletContainerCustomizer例如修改端口号 #通用的Servlet容器设置:修改端口号 server:port: 8081tomcat: #设置Tomact的相关属性例如编码格式uri-encoding: utf-8☞ 我们也可以进入port所属的对象中发现其他可修改的参数等等如下 ConfigurationProperties(prefix server,ignoreUnknownFields true ) public class ServerProperties implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {private Integer port;private InetAddress address;private String contextPath;private String displayName application;......【2】编写一个EmbeddedServletContainerCustomizer嵌入式的 Servlet容器的定制器来修改 Servlet容器的配置。其实1中的 ServerProperties也是实现了 EmbeddedServletContainerCustomizer。xxxCustomizer 帮组我们进行定制配置。 Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {Beanpublic EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){return new EmbeddedServletContainerCustomizer() {Overridepublic void customize(ConfigurableEmbeddedServletContainer container) {container.setPort(8082);}};}二、注册Servlet三大组件【Servlet、Filter、Listener】 由于SpringBoot默认是以 jar包的方式启动嵌入的Servlet容器来启动SpringBoot的web应用没有web.xml文件。注册三大组件的方式如下 【1】通过 ServletRegistrationBean注册自定义的Servlet。 //首先创建一个Servlet public class MyServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write(Hello MyServlet);super.doPost(req, resp);} }//将创建的Servlet通过配置类注入到容器中两个是不同的类。 Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {Beanpublic ServletRegistrationBean myServlet(){ServletRegistrationBean registrationBean new ServletRegistrationBean(new MyServlet(), /myServlet);return registrationBean;}【2】通过 FilterRegistrationBean 注册拦截器 Filter。 //自定义一个filter实现servlet.Filter接口 public class myFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.printf(myFilter);filterChain.doFilter(servletRequest,servletResponse);}Overridepublic void destroy() {} }//通过配置类注入自定义的Filter Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {Beanpublic FilterRegistrationBean myFilter(){FilterRegistrationBean registrationBean new FilterRegistrationBean();registrationBean.setFilter(new myFilter());registrationBean.setUrlPatterns(Arrays.asList(/hello,/myFilter));return registrationBean;} 【3】通过ServletListenerRegistrationBean注册自定义的Listener。 java //创建自定义的Listener监听 public class myListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.printf(服务启动);}Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.printf(服务销毁);} }//通过配置类注入自定义的listener Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {public ServletListenerRegistrationBean myListener(){ServletListenerRegistrationBeanMyListener servletListenerRegistrationBean new ServletListenerRegistrationBean(new MyListener());return servletListenerRegistrationBean;}三、使用其他 Servlet容器Jetty(长连接引用)、Undertow(不支持JSP) 【1】我们在定制嵌入式的Servlet容器时会传入ConfigurableEmbeddedServletContainer类我们通过CtrlT查看此可配置嵌入式类容器中可以配置Tomcat、Jetty和Undertow。 //ConfigurableEmbeddedServletContainer Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){return new EmbeddedServletContainerCustomizer() {Overridepublic void customize(ConfigurableEmbeddedServletContainer container) {container.setPort(8082);}}; }【2】默认使用Tomcat因为starter-web引入的是Tomcat的starter。我们排除Tomcat的依赖引入Jetty的依赖即可。 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusionartifactIdspring-boot-starter-tomcat/artifactIdgroupIdorg.springframework.boot/groupId/exclusion/exclusions /dependencydependencyartifactIdspring-boot-starter-Jetty/artifactIdgroupIdorg.springframework.boot/groupId /dependency四、嵌入式 Servlet容器自动配置原理 【1】EmbeddedServletContainerAutoConfiguration类主要用来自动配置嵌入式的Servlet容器。 AutoConfigureOrder(-2147483648) Configuration ConditionalOnWebApplication//导入BeanPostProcessorsRegistrar:后置处理器在bean初始化前后执行刚创建完对象还没属性赋值初始化工作.//给容器中导入一些组件,导入了embeddedServletContainerCustomizerBeanPostProcessor Import({EmbeddedServletContainerAutoConfiguration.BeanPostProcessorsRegistrar.class}) public class EmbeddedServletContainerAutoConfiguration {ConfigurationConditionalOnClass({Servlet.class, Tomcat.class})//判断当前Servlet中是否引入的Tomcat依赖ConditionalOnMissingBean(value {EmbeddedServletContainerFactory.class},search SearchStrategy.CURRENT)//判断当前容器中没有用户自定义的EmbeddedServletContainerFactory嵌入式的Servlet容器工厂//作用创建嵌入式的servlet容器。public static class EmbeddedTomcat {public EmbeddedTomcat() {}Beanpublic TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {return new TomcatEmbeddedServletContainerFactory();}}ConfigurationConditionalOnClass({Servlet.class, Undertow.class, SslClientAuthMode.class})ConditionalOnMissingBean(value {EmbeddedServletContainerFactory.class},search SearchStrategy.CURRENT)public static class EmbeddedUndertow {public EmbeddedUndertow() {}Beanpublic UndertowEmbeddedServletContainerFactory undertowEmbeddedServletContainerFactory() {return new UndertowEmbeddedServletContainerFactory();}}ConfigurationConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class})ConditionalOnMissingBean(value {EmbeddedServletContainerFactory.class},search SearchStrategy.CURRENT)public static class EmbeddedJetty {public EmbeddedJetty() {}Beanpublic JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {return new JettyEmbeddedServletContainerFactory();}} }【2】嵌入式的容器工厂EmbeddedServletContainerFactory用来创建嵌入式的Servlet容器。 public interface EmbeddedServletContainerFactory {//获取嵌入式的Servlet容器EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... var1); }☛ SpringBoot 再带了三种嵌入式的容器工厂如下 【3】EmbeddedServletContainer嵌入式的容器SpringBoot 为我们提供了三种不同的嵌入式容器与工厂相互对应如下 【4】我们进入工厂类 TomcatEmbeddedServletContainerFactory发现其实也是创建一个 Tomcat并配置其基本属性。 public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers) {//创建TomcatTomcat tomcat new Tomcat();//配置Tomcat的基本环境File baseDir this.baseDirectory ! null?this.baseDirectory:this.createTempDir(tomcat);tomcat.setBaseDir(baseDir.getAbsolutePath());Connector connector new Connector(this.protocol);tomcat.getService().addConnector(connector);this.customizeConnector(connector);tomcat.setConnector(connector);tomcat.getHost().setAutoDeploy(false);this.configureEngine(tomcat.getEngine());Iterator var5 this.additionalTomcatConnectors.iterator();while(var5.hasNext()) {Connector additionalConnector (Connector)var5.next();tomcat.getService().addConnector(additionalConnector);}this.prepareContext(tomcat.getHost(), initializers);//将配置好的Tomcat传入并启动TomcatTomcat.start()return this.getTomcatEmbeddedServletContainer(tomcat); }【5】用户自定义的Servlet容器配置类和SpringBoot默认的ServerProperties配置类都实现了EmbeddedServletContainerCustomizer接口。到底是怎么实现的哪其实是SpringBoot自动配置类中引入了后置处理器如下 //与用户自定义的Servlet容器实现的接口名很类似有一定的命名规则。 embeddedServletContainerCustomizerBeanPostProcessor☛ 进入后置处理器类中重点看如下代码 //初始化之前执行 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {//如果当前初始化的是当前ConfigurableEmbeddedServletContainer类型的组件if(bean instanceof ConfigurableEmbeddedServletContainer) {this.postProcessBeforeInitialization((ConfigurableEmbeddedServletContainer)bean);}return bean; }//上面的postProcessBeforeInitialization方法 private void postProcessBeforeInitialization(ConfigurableEmbeddedServletContainer bean) {Iterator var2 this.getCustomizers().iterator();while(var2.hasNext()) {//获取所有的定制器调用每一个定制器的customize方法来给servlet属性赋值。EmbeddedServletContainerCustomizer customizer (EmbeddedServletContainerCustomizer)var2.next();customizer.customize(bean);}private CollectionEmbeddedServletContainerCustomizer getCustomizers() {if(this.customizers null) {//this.beanFactory.xx表示从容器中获取XXCustomizer自定义类型的组件this.customizers new ArrayList(this.beanFactory.getBeansOfType(EmbeddedServletContainerCustomizer.class, false, false).values());Collections.sort(this.customizers, AnnotationAwareOrderComparator.INSTANCE);this.customizers Collections.unmodifiableList(this.customizers);}return this.customizers; }整理下步骤 【1】SpringBoot根据pom.xml中导入的依赖给容器中添加其对应的嵌入式的服务容器工厂类例如默认的Tomcat工厂EmbeddedServletContainerFactory【TomcatEmbeddedServletContainerFactory】 【2】给容器中某个组件要创建对象就会触发后置处理器EmbeddedServletContainerCustomizerBeanPostProcessor只要是嵌入式的Servlet容器工厂后置处理器就会工作默认的ServerProperties也是实现了此类接口的所以肯定存在相关配置类 【3】后置处理器从容器中获取所有的EmbeddedServletContainerCustomizer调用定制器的定制方法。 五、嵌入式Servlet容器启动原理 根据上述的流程我们要研究Servlet容器的启动原理。其实就是研究什么时候创建嵌入式的容器工厂和何时获取嵌入式的容器并启动Tomcat。获取嵌入式的Servlet容器工厂的过程在new TomcatEmbeddedServletContainerFactory()时打一个断电查看过程 【1】SpringBoot 应用启动运行 run() 方法。 【2】this.refreshContext(context) 方法用来初始化 IOC容器既创建 IOC容器对象并初始化IOC容器中的每一个组件。 protected ConfigurableApplicationContext createApplicationContext() {Class? contextClass this.applicationContextClass;if(contextClass null) {try {//判断是不是web环境是Web环境引入AnnotationConfigEmbeddedWebApplicationContext否则引入AnnotationConfigApplicationContextcontextClass Class.forName(this.webEnvironment?org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext:org.springframework.context.annotation.AnnotationConfigApplicationContext);} catch (ClassNotFoundException var3) {throw new IllegalStateException(Unable create a default ApplicationContext, please specify an ApplicationContextClass, var3);}}return (ConfigurableApplicationContext)BeanUtils.instantiate(contextClass); }【3】this.refresh(context)刷新刚才创建好的IOC容器。 【4】this.onRefresh()web的IoC容器重写了onRefresh()方法。 protected void onRefresh() {super.onRefresh();try {//重点是创建了嵌入式的Servlet容器this.createEmbeddedServletContainer();} catch (Throwable var2) {throw new ApplicationContextException(Unable to start embedded container, var2);} }【5】this.createEmbeddedServletContainer()web的IOC容器会创建嵌入式的Servlet容器。 private void createEmbeddedServletContainer() {EmbeddedServletContainer localContainer this.embeddedServletContainer;ServletContext localServletContext this.getServletContext();if(localContainer null localServletContext null) {// 1、获取嵌入式的Servlet嵌入式的工厂EmbeddedServletContainerFactory containerFactory this.getEmbeddedServletContainerFactory();this.embeddedServletContainer containerFactory.getEmbeddedServletContainer(new ServletContextInitializer[]{this.getSelfInitializer()});} }【6】获取嵌入式工厂后便可从容器中获取EmbeddedServletContainerFactory的组件tomcatEmbeddedServletContainerFactory来创建Tomcat对象后置处理器就会触发获取所有的定制器来确定Servlet容器的相关配置。 【7】通过嵌入式工厂获取嵌入式容器如下 this.embeddedServletContainer containerFactory.getEmbeddedServletContainer(new ServletContextInitializer[]{this.getSelfInitializer()});● 嵌入式的Servlet容器创建并启动对象 public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers) {//创建对象Tomcat tomcat new Tomcat();//启动对象this.tomcat.start();● 先启动嵌入式的Servlet容器再将IOC容器中剩下没有创建的对象进行初始化如下 this.onRefresh();//启动完嵌入式容器后后续还有其他对象的初始化工作this.registerListeners();this.finishBeanFactoryInitialization(beanFactory);this.finishRefresh(); } catch (BeansException var9) {六、使用外置的Servlet容器 嵌入式Servlet容器的缺点 默认不支持JSP、优化和定制比较复杂。外置Servlet容器安装外部的Tomcat步骤如下 1、必须创建一个war项目需要手动创建目录利用Idea快速创建如下 2、将嵌入式的Tomcat指定为provideIdea创建完后会自动帮我们完成但我们需要了解 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdscopeprovided/scope /dependency3、需要编写一个SpringBootServletInitializer的子类并调用configure方法 public class ServletInitializer extends SpringBootServletInitializer {Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(SpringBootWebApplication.class);} }4、配置本地的Tomcat并启动Tomcat即可。此项目运行run()方法是不能启动项目的需要设置名称和本地Tomcat的路径即可使用外部Servlet。 七、外置服务器的使用原理 ☞ jar包执行SpringBoot主类的main方法启动并初始化IOC容器且创建嵌入式的Servlet容器。 ☞ war包启动服务器后调用SpringBootServletInitializer中的configure()方法加载我们的SpringBoot应用并启动。 Servlet3.0规则  1、服务器启动后会创建当前web应用中包含的每个jar内的ServletContainerInitializer实例。  2、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下javax.servlet.ServletContainerInitializer内容就是ServletContainerInitializer的全类名  3、可以使用handlesTypes注解在应用启动时加载我们需要的类。 流程  1、启动Tomcat后获取servlet.ServletContainerInitializer文件如下其中的内容同下 #文件中的内容 org.springframework.web.SpringServletContainerInitializer2、进入SpringServletContainerInitializer发现此类将HandlesTypes({WebApplicationInitializer.class})标注的所有这个类型的类都传入到onStartup方法中的SetClass?并为这些类创建实例。 HandlesTypes({WebApplicationInitializer.class}) public class SpringServletContainerInitializer implements ServletContainerInitializer {//onStartup方法用来实例化感兴趣的对象public void onStartup(SetClass? webAppInitializerClasses, ServletContext servletContext) throws ServletException {if(webAppInitializerClasses ! null) {var4 webAppInitializerClasses.iterator();while(var4.hasNext()) {Class? waiClass (Class)var4.next();if(!waiClass.isInterface() !Modifier.isAbstract(waiClass.getModifiers()) WebApplicationInitializer.class.isAssignableFrom(waiClass)) {try {//实例化initializers.add((WebApplicationInitializer)waiClass.newInstance());} catch (Throwable var7) {throw new ServletException(Failed to instantiate WebApplicationInitializer class, var7);}}}}3、每一个WebApplicationInitializer都调用自己的onStartup()方法。 while(var4.hasNext()) {WebApplicationInitializer initializer (WebApplicationInitializer)var4.next();//onStartup()方法initializer.onStartup(servletContext);}4、WebApplicationInitializer只是一个接口其实现类主要有以下三个SpringBootServletInitalizer正是SpringBoot给我们创建好的启动类会被创建对象并启动自身的onStartup()方法。 5、执行onStartup()方法时会调用createRootApplicationContext()方法来创建容器 public void onStartup(ServletContext servletContext) throws ServletException {this.logger LogFactory.getLog(this.getClass());//创建容器WebApplicationContext rootAppContext this.createRootApplicationContext(servletContext);if(rootAppContext ! null) {servletContext.addListener(new ContextLoaderListener(rootAppContext) {public void contextInitialized(ServletContextEvent event) {}});//容器的具体调用实现protected WebApplicationContext createRootApplicationContext(ServletContext servletContext) {//创建Spring应用的构建器SpringApplicationBuilder builder this.createSpringApplicationBuilder();//设置主类builder.main(this.getClass());//创建一些环境ApplicationContext parent this.getExistingRootWebApplicationContext(servletContext);if(parent ! null) {this.logger.info(Root context already created (using as parent).);servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, (Object)null);builder.initializers(new ApplicationContextInitializer[]{new ParentContextApplicationContextInitializer(parent)});}builder.initializers(new ApplicationContextInitializer[]{new ServletContextApplicationContextInitializer(servletContext)});builder.contextClass(AnnotationConfigServletWebServerApplicationContext.class);//重要子类中重写了此方法子类出入了应用的主程序类builder this.configure(builder);builder.listeners(new ApplicationListener[]{new SpringBootServletInitializer.WebEnvironmentPropertySourceInitializer(servletContext, null)});//使用build()创建一个Spring应用SpringApplication application builder.build();if(application.getAllSources().isEmpty() AnnotationUtils.findAnnotation(this.getClass(), Configuration.class) ! null) {application.addPrimarySources(Collections.singleton(this.getClass()));}Assert.state(!application.getAllSources().isEmpty(), No SpringApplication sources have been defined. Either override the configure method or add an Configuration annotation);if(this.registerErrorPageFilter) {application.addPrimarySources(Collections.singleton(ErrorPageFilterConfiguration.class));}//启动应用return this.run(application);}6、执行应用的run()方法来启动Spring应用并创建IOC容器。 public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch new StopWatch();stopWatch.start();ConfigurableApplicationContext context null;CollectionSpringBootExceptionReporter exceptionReporters new ArrayList();this.configureHeadlessProperty();SpringApplicationRunListeners listeners this.getRunListeners(args);listeners.starting();Collection exceptionReporters;try {ApplicationArguments applicationArguments new DefaultApplicationArguments(args);ConfigurableEnvironment environment this.prepareEnvironment(listeners, applicationArguments);this.configureIgnoreBeanInfo(environment);Banner printedBanner this.printBanner(environment);context this.createApplicationContext();exceptionReporters this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, new Object[]{context});this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);//刷新IOC容器this.refreshContext(context);this.afterRefresh(context, applicationArguments);stopWatch.stop();if(this.logStartupInfo) {(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);}listeners.started(context);this.callRunners(context, applicationArguments);} catch (Throwable var10) {this.handleRunFailure(context, var10, exceptionReporters, listeners);throw new IllegalStateException(var10);}try {listeners.running(context);return context;} catch (Throwable var9) {this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);throw new IllegalStateException(var9);} }
http://wiki.neutronadmin.com/news/443117/

相关文章:

  • 电子厂网站建设方案书怎么写都有哪些做二手挖机的网站
  • 低价格网站建设画画外包网站
  • 营销型网站建设的定义网站做导航的地图导航
  • 涿州做网站怎样维护网站建设
  • 网站关键词排名seo阿里巴巴网站详情页怎么做的
  • 小说类网站程序制作微信网页
  • 陶瓷网站源码国外做的好的鲜花网站
  • 网站解析后 问题北京企业官网建设
  • 电商网站建设咨询哈尔滨红军街67号
  • 网站视频建设吉林省住房建设安厅网站安全管理
  • 长春建站网站建设wordpress 官网主题
  • 网站设计建设企业百度账号申诉
  • 网站头图设计网站推广的具体方法
  • 域名解析到别人网站家具网站开发设计任务书
  • 天津怎样做网站推广厦门 网站建设 网站开发 未来网络
  • 十大免费壁纸软件济南优化联系电话
  • 做网站设计参考文献网站百度突然不收录
  • 网站源码是html怎么转成php网站登封做网站推广
  • 网上销售网站建设策划注册网站需要备案吗
  • 网站建设网站设计建设一个公司网站需要多少钱
  • 北京知名网站建设公司关键词挖掘查询工具爱站网
  • 网站制作app班级网站的建设调查表
  • seo快速整站上排名教程河源网页制作公司
  • 河北pc端网站建设某一个网页打不开是什么原因
  • 校园论坛网站怎么做php网站开发实用技术课后习题
  • 北京城乡建设官方网站网站开发项目对自身的意义
  • 怎么做国内网站wordpress后台ftp
  • php网站开发多少钱软件开发工程师前景
  • seo是什么意思怎么解决seo网站设计营销工具
  • 新思域设计公司网站建设学校网站的建设目标