精华内容
下载资源
问答
  • Tomcat如何加载web项目

    千次阅读 2019-08-04 11:42:11
    test Tomcat如何加载web项目 WEB项目相信大家一定都很了解,下面抛出两个...tomcat在解析web项目的war包的时候,首先加载一个文件——web.xml文件,这也就是为什么SSM项目或者SSH项目里面必须要有web.xml文件的...

    Tomcat加载web项目的原理

    WEB项目相信大家一定都很了解,但是开发久了慢慢就忘记了基础,下面抛出两个问题:

    (1)tomcat如何加载web项目的?

    (2)tomcat如何加载带有spring的web项目?

    Tomcat如何加载web项目?

    tomcat在解析web项目的war包的时候,会首先加载一个文件——web.xml文件,这个web.xml
    也就是你写的应用程序配置servelt的入口,其中包含了一些url路径,最终外部就是靠这个路径定位到你的servelt的。但是你的servelt搭载的服务器tomcat只能在局域网才能找到。想被其他外网找到的话就必须搭载到一个外网可以访问的服务器。
    此处介绍两个方法:
    直接放到阿里云上
    使用花生壳,或者ngrok。

    这也就是为什么SSM项目或者SSH项目里面必须要有web.xml文件的原因。

    1:tomcat 加载顺序 web.xml文件详解
    (1)、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取listener和context-param两个结点。
    (2)、紧接着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
    (3)、容器将context-param转换为键值对,并交给servletContext。
    (4)、容器创建listener中的类实例,创建监听器。

    2:tomcat加载web.xml后
    (1)其中有一些servlet等待请求的到来。
    (2)tomcat中的HttpServletRequest与HttpServletResponse分别是用来接收客户端的请求,返回处理后的请求。

    墙裂推荐去看看:
    Tomcat的实现原理

    Tomcat如何支持带有spring的web项目?

    下面以一个SSM项目的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"  
        version="3.0">  
        <display-name>Archetype Created Web Application</display-name>  
        <!-- 编码过滤器 -->  
        <filter>  
            <filter-name>encodingFilter</filter-name>  
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
            <async-supported>true</async-supported>  
            <init-param>  
                <param-name>encoding</param-name>  
                <param-value>UTF-8</param-value>  
            </init-param>  
        </filter>  
        <filter-mapping>  
            <filter-name>encodingFilter</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
        <!-- Spring监听器,用来初始化spring-ioc容器 -->  
        <listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener>   
           <!-- Spring的配置文件-->  
      <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB_INF/applicationContext.xml</param-value>  
        </context-param> 
        <!-- 注意:spring mvc框架会根据servlet-name的配置,默认去/WEB_INF/dispatcher-servlet.xml
        作为spring-mvc的配置文件载入到web项目中,其中可以定义一些mvc的bean,比如说ViewResolver,或者HandlerMapping -->  
        <servlet>  
            <servlet-name>DispatcherServlet</servlet-name>  
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
            <load-on-startup>1</load-on-startup>    
        </servlet>  
        <servlet-mapping>  
            <servlet-name>SpringMVC</servlet-name>  
            <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->  
            <url-pattern>*.do</url-pattern>  
        </servlet-mapping>  
        <welcome-file-list>  
            <welcome-file>/index.jsp</welcome-file>  
        </welcome-file-list>  
     
    </web-app>
    

    下面论述下上面文件的配置内容:

    1. 系统变量contextConfigLocation告诉了spring的配置文件在哪里,这样子spring会根据路径找到这些配置文件。

    2. contextLoaderListener实现了ServletContextListener,而ServletContextListener是在整个web工程初始化前后加入自定义代码,所以在web工程初始化前。可以完成对spring容器的初始化。注意:配置contextLoaderListener一定要保证可以找到配置文件,不然会出错。

    3. 配置DispatcherServlet,首先配置了servlet-name,这意味着会默认需要一个/WEB_INF/dispatcher-servlet.xml配置文件,同样我们配置可以在服务器启动的时候初始化完成。

    4. servlet-mapping配置会拦截所有后缀为do的请求,然后处理他,当然最后是交给springmvc,具体是根据spring mvc中一个HandlerMapping这个骚东西去路由到指定的controller下面。

    注意:
    也许你的web工程中没有ContextLoaderListener这样的配置,这个时候DispatcherServlet会在初始化的时候对spring-ioc容器进行初始化。可以看DispatcherServlet源码中,如果检测到没有初始化Spring-Ioc,会首先初始化它。

    DispatcherServlet的继承关系:
    在这里插入图片描述
    从图中看,DispatcherServlet继承FrameworkServlet和HttpServletBean,HttpServletBean继承了web容器的HttpServlet,所以DispatcherServlet是一个可以载入web容器的Servlet。
    web容器对于servlet的初始化,首先调用其init方法,DispatcherServlet的这个方法位于其父类HttpServletBean中。

    public final void init() throws ServletException {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Initializing servlet '" + this.getServletName() + "'");
            }
    
            PropertyValues pvs = new HttpServletBean.ServletConfigPropertyValues(this.getServletConfig(), this.requiredProperties);
            if (!pvs.isEmpty()) {
                try {
                    BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
                    ResourceLoader resourceLoader = new ServletContextResourceLoader(this.getServletContext());
                    bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.getEnvironment()));
                    this.initBeanWrapper(bw);
                    bw.setPropertyValues(pvs, true);
                } catch (BeansException var4) {
                    if (this.logger.isErrorEnabled()) {
                        this.logger.error("Failed to set bean properties on servlet '" + this.getServletName() + "'", var4);
                    }
    
                    throw var4;
                }
            }
    		// 这个方法交给子类实现
            this.initServletBean();
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Servlet '" + this.getServletName() + "' configured successfully");
            }
    
        }
    

    子类FrameworkServlet中的这个方法:

    protected final void initServletBean() throws ServletException {
            this.getServletContext().log("Initializing Spring FrameworkServlet '" + this.getServletName() + "'");
            if (this.logger.isInfoEnabled()) {
                this.logger.info("FrameworkServlet '" + this.getServletName() + "': initialization started");
            }
    
            long startTime = System.currentTimeMillis();
    
            try {
            //初始化 Spring Ioc容器
                this.webApplicationContext = this.initWebApplicationContext();
                
                this.initFrameworkServlet();
            } catch (ServletException var5) {
                this.logger.error("Context initialization failed", var5);
                throw var5;
            } catch (RuntimeException var6) {
                this.logger.error("Context initialization failed", var6);
                throw var6;
            }
    
            if (this.logger.isInfoEnabled()) {
                long elapsedTime = System.currentTimeMillis() - startTime;
                this.logger.info("FrameworkServlet '" + this.getServletName() + "': initialization completed in " + elapsedTime + " ms");
            }
    
        }
    

    看initWebApplicationContext方法

    protected WebApplicationContext initWebApplicationContext() {
            WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
            WebApplicationContext wac = null;
            //判断是否被初始化
            if (this.webApplicationContext != null) {
                wac = this.webApplicationContext;
                if (wac instanceof ConfigurableWebApplicationContext) {
                    ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext)wac;
                    if (!cwac.isActive()) {
                        if (cwac.getParent() == null) {
                            cwac.setParent(rootContext);
                        }
    
                        this.configureAndRefreshWebApplicationContext(cwac);
                    }
                }
            }
    // IOC没有被初始化,则查找是否存在IOC容器
            if (wac == null) {
                wac = this.findWebApplicationContext();
            }
    //没有初始化,也没有找到IOC容器,则DispatcherServlet自己创建他。
            if (wac == null) {
                wac = this.createWebApplicationContext(rootContext);
            }
    // 当onRefresh没有被调用过,则执行onRefresh方法
            if (!this.refreshEventReceived) {
                this.onRefresh(wac);
            }
    
            if (this.publishContext) {
                String attrName = this.getServletContextAttributeName();
                this.getServletContext().setAttribute(attrName, wac);
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Published WebApplicationContext of servlet '" + this.getServletName() + "' as ServletContext attribute with name [" + attrName + "]");
                }
            }
    
            return wac;
        }
    

    下面来看 onRefresh(wac)方法,这个方法在DispatcherServlet中,其也就是在IOC容器完成后,初始化一些与SpringMVC相关的东西。看方法你就很熟悉了:

        protected void onRefresh(ApplicationContext context) {
            this.initStrategies(context);
        }
        protected void initStrategies(ApplicationContext context) {
            this.initMultipartResolver(context);
            this.initLocaleResolver(context);
            this.initThemeResolver(context);
            this.initHandlerMappings(context);
            this.initHandlerAdapters(context);
            this.initHandlerExceptionResolvers(context);
            this.initRequestToViewNameTranslator(context);
            this.initViewResolvers(context);
            this.initFlashMapManager(context);
        }
    

    看到上面熟悉吧。

    总结:有spring的web项目一般是在容器初始化的时候完成spring-ioc容器的初始化,比如ssm就是在web容器启动时候初始化的。

    展开全文
  • IntelliJ IDEA导入Web项目

    万次阅读 多人点赞 2018-03-13 10:47:21
    转自:Idea导入Web项目 概述 主要分为项目配置和tomcat配置两大步骤。 一、项目配置 打开idea,选择导入项目 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置根据原本的...

    概述

    主要分为项目配置和tomcat配置两大步骤。

    一、项目配置

    • 打开idea,选择导入项目
      1.png

    • 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的项目类型更新成idea的项目),此例中选择Eclipse,然后一直next到底即可。
      2.png

    • File->Project Structure打开项目配置窗口

    • 在Project项中配置JDK版本和编译等级
      3.png

    • 在Modules项的Sources标签页中配置项目结构(主要配置需编译的Java文件和配置文件)
      4.png

    • 在Modules项的Paths标签页中配置编译后文件输出路径
      5.png

    • 在Modules项的Dependencies标签页中配置依赖关系
      因为在导入项目的时候选择了导入的是eclipse项目,所以此处依赖关系已自动处理,若手动配置主要是要加上jdk和web-inf/lib的jar包。
      图片中标示的项目名称下有红色波浪线的错误提示,把依赖关系中所有红色的项删掉即可(图中红色的几个eclipse相关项是因为项目原来是在eclipse中打开,而在idea中这些项是不需要的)。
      6.png

    • 在Libraries项中配置需要的库。因为项目需要用到jsp和servlet,而项目的lib中没有相关jar包,所以在此引入tomcat_home/lib目录下的js-api.jar、servlet-api.jar。
      7.png

    • 在Facets项中对项目添加Web模块
      8.png

    • 点击图中标示位置对Web Resource进行修改。idea默认的目录是web,我们的项目是WebRoot,所以注意需要修改此处。
      9.png

    • 在Artifacts项中设置项目的部署配置
      添加WebApplication:Exploded
      10.png

    • 如有需要可以进一步配置,下图是添加后默认的配置没有再进行其他设置
      11.png

    二、Tomcat配置

    • 在界面右上角点击图示出打开运行环境配置
      12.png

    • 添加tomcat运行环境
      13.png

    • 配置tomcat路径、端口
      14.png

    • 在Deployment标签页中添加要部署的项目,添加后可以看见部署操作增加“Build ‘epcsys:war exploded’ artifact”一项
      15.png

    • tomcat配置完成后点击运行tomcat即可
      16.png

    展开全文
  • java web项目不能加载css样式

    千次阅读 2019-11-27 22:28:20
    记录一下错误 css样式在别人电脑上可以加载出来自己就不行 感谢,参考文章:https://blog.csdn.net/weixin_41345933/article/details/98885127 删除 即可 原运行结果: 修改后运行结果: ...

    记录一下错误
    css样式在别人电脑上可以加载出来自己就不行
    感谢,参考文章:https://blog.csdn.net/weixin_41345933/article/details/98885127
    删除
    在这里插入图片描述
    即可
    原运行结果:
    在这里插入图片描述
    修改后运行结果:
    在这里插入图片描述

    展开全文
  • 开发环境是idea+web maven项目开发过程中遇道项目次加载 日志输出的时候,同一个controller里面的同一个请求方法,日志输出四五项目启动需要2,3分钟。在确定不是内存,项目配置有问题的情况下,解决方法是把...
    开发环境是idea+web maven项目开发过程中遇道项目多次加载 日志输出的时候,同一个controller里面的同一个请求方法,日志输出四五次,项目启动需要2,3分钟。在确定不是内存,项目配置有问题的情况下,解决方法是把项目中的idea配置全部删除,然后重新导入到idea开发环境之中,问题得到解决。
    
    
    展开全文
  • Tomcat启动不加载WEB项目

    千次阅读 2019-02-22 11:00:06
    https://blog.csdn.net/u011367411/article/details/78893131
  • 最近在做web项目时遇到了两个奇葩问题: 1、先遇到了这个缓存问题:系统参数对象缓存到了静态变量里,并且用一个通知型任务重新加载数据库修改后的参数,之后奇葩问题便出现了,重新加载后再调用系统参数常量,有时...
  • Java之——Web项目中DLL文件动态加载方法

    万次阅读 热门讨论 2016-12-28 01:36:23
    在Java Web项目中,我们经常用到通过JNI调用dll动态库文件来实现一些JAVA不能实现的功能,或者是一些第三方dll插件。通常的做法是将这些dll文件复制到 %JAVA_HOME%\jre\bin\ 文件夹或者 应用中间件(Tomcat|...
  • 解决IDEA加载web项目目录太慢问题

    千次阅读 2018-06-20 17:31:05
    新安装的软件,加载web目录慢的要死,甚至由于网络问题根本加载不出来。下面教你一种解决方案!!! 一句话OK: -DarchetypeCatalog=internal 明确一点,上图为加载的最终结果,加载完毕后依然没有java和...
  • web项目部署到Tomcat上不加载样式可能是因为: 1.没有清空浏览器缓存 解决方法: 然后重新打开浏览器,重新部署项目 2.没有加载css,js等样式 解决方法: 在web.xml中加入以下代码块 <servlet-mapping> <...
  • 在启动Web项目时,容器(如Tomcat)读web.xml配置文件中的两个节点和 。接着容器创建一个ServletContext(上下文),应用范围内即整个WEB项目都能够使用这个上下文。接着容器对转化为键值对,并且交给...
  • Tomcat项目运行时加载web项目的顺序

    千次阅读 2017-12-19 11:44:44
    tomcat的加载运行机制与Java虚拟机的父类委托机制稍有不同。 一个普通的JAVAWEB项目的运行顺序如下:  1、首先加载Tomcat_HOME/lib目录下的...3、最后加载的是Tomcat_HOME/webapps/项目名/WEB-INF/classes下的文件
  • 首先要想在项目启动的的时候就加载properties文件,就必需在web.xml中配置一个加载properties文件的监听器(listener);&lt;!-- Properties文件的监听器 --&gt; &lt;listener&gt; &lt;descri...
  • idea新建maven项目加载缓慢问题处理_archetypeCatalog idea创建maven的java项目  一下的创建方式使用原型自动形成包目录,而且pom.xml原型创建多一部分的插件和依赖(你可能并不需要,比如ma...
  • =-= 但是出现了问题,我擦,启动web的时候spring创建上下文的时候居然找不到,我去,检查了一下jar包,spring.jar spring-web.jar 都有啊,怎么找不到呢,我的jar包是放在web-inf/lib 下的...
  • eclipse启动tomcat时不能加载web项目

    千次阅读 2018-09-20 01:31:20
    eclipse启动tomcat时,不能加载web项目,但是把war包丢进tomcat的webapps下是能正常运行的 解决方式: 右键项目——打开Properties——找到Deployment Assembly——将WebContent修改成你的项目webapp路径 ...
  • Java Web项目启动加载顺序

    千次阅读 2015-09-20 17:44:17
    启动WEB项目的时候,容器(如:Tomcat)去读它的配置文件web.xml.读两个节点: &lt;listener&gt;&lt;/listener&gt; 和 &lt;context-param&gt;&lt;/context-param&gt;2.紧接着,容器创建...
  • web项目,在本地跑起来是没有问题的,放到服务器,启动tomcat提示java.lang.ClassNotFoundException: Could not load requested class : cn.rongcloud.crm.domain.CustDeploymentDocument
  • 1.基于springBoot搭建web项目 2.实现.html文件访问 3.实现.js.css…等html中静态资源加载 因为要搭建web项目,web项目少不了对jsp文件或者对html文件的解析,SpringBoot提供了大量的模板引擎来支持对这些和用户交互...
  • 废话不多说,直接上代码 <link :href="url" /> PS:(url为指定url超链接),是不是很简单
  • 文章目录请看事故现场:方法一:(虽然有效,但你肯定不愿意去用)方法二:(我感觉这个很好用) ...idea默认就是在main/webapp 下的文件路径,要在WEB-INF同级的resource文件下放置,JSP中${pageCon
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     用JAVA开发的一个小型的目录监视系统,系统每5秒自动扫描一需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • 在linux系统下 安装tomcat 加载项目 项目可以访问 但是样式没有出现 坐等大牛给解决方式
  • web项目的启动时文件加载顺序

    千次阅读 2017-05-27 14:25:18
    web项目的启动时文件加载顺序 转自:http://www.cnblogs.com/yw-ah/p/5751509.html 一、 1、启动一个WEB项目,WEB容器先去读取它的配置文件web.xml,读取和两个节点。 2、接着,容器创建一个ServletContext...
  • 简单记录一下,作为备忘录。在配置项目的Artifacts选择exploded的war包即可
  • 控制台报错,原因是未加载servlet-api.jar 在Libraries项中配置需要的库。因为项目需要用到jsp和servlet,而项目的lib中没有相关jar包,所以在此引入tomcat_home/lib目录下的js-api.jar、servlet-api.jar。 ...
  • 问题描述 ...基本上Web容器(如Tomcat)先加载ContextLoaderListener,然后生成一个IoC容器。 然后再实例化DispatchServlet时候会加载对应的配置文件,再次生成Controller相关的IoC容器。 关于上面两个...
  • web.xml配置和spring加载机制

    千次阅读 2018-05-19 22:43:22
    web.xml文件是用来初始化web应用的配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。这是网上面...
  • 《一:使用相对路径方式加载》1.相对于classpath的根...通过当前对象得到类加载器 ClassLoader loader = 当前对象.class.getClassLoader(); //2.通过当前线程的到类加载器 ClassLoader loader = Thread.currentTh

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 384,955
精华内容 153,982
关键字:

web项目类会被加载几次