实践结果
用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配合的一系列机制
- 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>- 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>- 如此,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"; } }
一些知识点
- classpath:指的是
:用maven构建项目时候resources目录就是默认的classpath
而re打包后就放在了webapp的classes文件下
所以也就是编译后的classes文件夹 - servlet容器:请求转发到servlet,管理其运行,接收响应并发回
- Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost())
- Servlet容器在Servlet的生命周期内包容和管理Servlet
- 在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器
- Tomcat是web容器一哥
- jetty插件:是一个servlet容器,开源,灵活,简单
参见https://blog.csdn.net/m0_37797282/article/details/79212854 - jsp的运行:通过jsp容器(引擎)(之前介绍jsp的时候也说过):编译成servlet后调用,步骤:
- 翻译:编写好的jsp文件被web容器中的jsp引擎转换成java源码。
- 编译:翻译成java源码的jsp文件会被编译成可被计算机执行的字节码文件。
- 请求:当容器(服务器)接收了来自客户端(浏览器)的请求后,将执行编译好的字节码文件。处理请求完毕后,容器再把生成的页面反馈返回客户端页面显示。