0426-web:spring-mvc--servlet容器/jsp运行/jetty/maven库

实践结果

用maven原型(第二个web)创建,会生成src-main-webapp目录
自己又加了一下,最后目录结构为
(下面这种目录表示生成要用到tree命令,mac下直接brew install就好
src
└── main
├── java
│ ├── WebAppServlet.java
│ └── com.task
│ ├── controller
│ │ └── HomeController.java
│ ├── dao
│ ├── pojo
│ └── service
├── resources
│ ├── log4j.properties
│ └── spring
│ └── spring-mvc.xml
└── webapp
├── WEB-INF
│ ├── statics
│ │ ├── css
│ │ ├── image
│ │ └── js
│ ├── views
│ │ └── index.jsp
│ └── web.xml
└── index1.html

最后生成的文件:
webhello
├── WEB-INF
│ ├── classes
│ │ ├── WebAppServlet.class
│ │ ├── com.task.controller
│ │ │ └── HomeController.class
│ │ ├── log4j.properties
│ │ └── spring
│ │ └── spring-mvc.xml
│ ├── lib
│ ├── views
│ │ └── index.jsp
│ └── web.xml
└── index1.html

分析总结

有两个java文件(servlet):WebAppServlet.java和HomeController.java
区别在于是否用到spring MVC:

  • WebAppServlet没有,直接在web.xml文件中声明+映射就可以用
    <web-app>
    <display-name>Archetype Created Web Application</display-name>
    //声明
     <servlet>
         <servlet-name>WebApp</servlet-name>
         <servlet-class>com.cnblogs.kmpp.WebAppServlet</servlet-class>
     </servlet>
    //映射
     <servlet-mapping>
         <servlet-name>WebApp</servlet-name>
         <url-pattern>/simple-servlet</url-pattern>
     </servlet-mapping>
    </web-app>
    
  • HomeController则经过了web和spring-mvc配合的一系列机制
    1. web.xml中声明总servlet(并address需加载的spring-mvc配置文件
    <servlet>
      <servlet-name>springMVC</servlet-name>
      <!--servlet类全路径-->
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
        <!--Sources标注的文件夹下需要新建一个spring文件夹-->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-mvc.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
      <!--servlet名称-->
      <servlet-name>springMVC</servlet-name>
      <!--映射路径-->
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    1. spring-mvc.xml配置了controller目录,静态资源目录,view资源解析等
    <beans xmlns="http://www.springframework.org/schema/beans"...>
      <!--启用spring的一些annotation -->
      <context:annotation-config/>
        <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
        <context:component-scan base-package="com.task.controller">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
      <!--HandlerMapping 无需配置,springmvc可以默认启动-->
    
      <!--静态资源映射-->
        <!--本项目把静态资源放在了WEB-INF的statics目录下,资源映射如下-->
        <mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>
        <mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>
        <mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>
    
      <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
       <mvc:annotation-driven/>
    
      <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
      <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
      <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/><!--设置JSP文件的目录位置-->
        <property name="suffix" value=".jsp"/>
      </bean>
    
      <!-- springmvc文件上传需要配置的节点-->
      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="20971500"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="resolveLazily" value="true"/>
      </bean>
    </beans>
    
    1. 如此,url中的/home/index,就会通过web交给SpringMVC(servlet),然后在controller目录中查找到HomeController,再找到其中的index方法,完成响应
      ——HomeController.java内容如下:
      // 注解标注此类为springmvc的controller,url映射为"/home"
      @Controller
      @RequestMapping("/home")
      public class HomeController {
          //添加一个日志器
          private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
          //映射一个action
          @RequestMapping("/index")
          public  String index(){
      //输出日志文件
              logger.info("the first jsp pages");
      //返回一个index.jsp这个视图
              return "index";
          }
      }
      

一些知识点

  1. classpath:指的是
    :用maven构建项目时候resources目录就是默认的classpath
    而re打包后就放在了webapp的classes文件下
    所以也就是编译后的classes文件夹
  2. servlet容器:请求转发到servlet,管理其运行,接收响应并发回
  • Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost())
  • Servlet容器在Servlet的生命周期内包容和管理Servlet
  • 在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器
  • Tomcat是web容器一哥
  1. jetty插件:是一个servlet容器,开源,灵活,简单
    参见https://blog.csdn.net/m0_37797282/article/details/79212854
  2. jsp的运行:通过jsp容器(引擎)(之前介绍jsp的时候也说过):编译成servlet后调用,步骤:
  • 翻译:编写好的jsp文件被web容器中的jsp引擎转换成java源码。
  • 编译:翻译成java源码的jsp文件会被编译成可被计算机执行的字节码文件。
  • 请求:当容器(服务器)接收了来自客户端(浏览器)的请求后,将执行编译好的字节码文件。处理请求完毕后,容器再把生成的页面反馈返回客户端页面显示。
  1. maven原型加载很慢:https://blog.csdn.net/qq_40147863/article/details/90453744
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容