1. web.xml
配置springmvc的入口DispatcherServlet,把所有的请求都提交到该Servlet。
<?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/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<!-- DispatcherServlet -->
<servlet>
<servlet-name>springmvc</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>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
说明:
1:在web.xml里面导入前端控制器,通过< url-pattern >设置匹配规则,如上面设置的/,会匹配所有的url。
2:若url匹配成功,交给HandlerMapping处理映射器处理(具体的形式是业务代码中的Controller,通过RequestMapping进一步传递匹配)
3:HandlerAdapter处理器适配器,处理一些功能请求,返回一个ModelAndView对象(包括模型数据、逻辑视图名)
4:ViewResolver视图解析器,先根据ModelAndView中设置的View解析具体视图
5:然后再将Model模型中的数据渲染到View上。
6:若第2步的url未成功匹配,则相当于通过缺省匹配(有关匹配规则,下面会解释),直接由ViewResolver视图解析器负责映射资源文件。映射成功予以返回显示,否则则返回404错误。
原文:https://blog.csdn.net/windflybird/article/details/81054584
注:<servlet>
必须含有<servlet-name>
和<servlet-class>
,或者<servlet-name>
和<jsp-file>
<servlet-name>
用来定义servlet的名称,该名称在整个应用中必须是惟一的与<servlet-mapping>
标签中的<servlet-name>
名字相同。<servlet-class>
用来指定servlet的完全限定的名称。<load-start-up>
在servlet标签中写入该标签后,可以在服务器启动时自动创建该servlet,这个标签中还可以写入数字,来提供创建servlet的顺序。<servlet-mapping>
含有<servlet-name>
和<url-pattern>
<url-pattern>
表示浏览器访问的页面
<servlet-name>
名字与<servlet>
中的<servlet-name>
相同。
2.加载Servlet的过程
容器的Context对象对请求路径(URL)做出处理,去掉请求URL的上下文路径后,按路径映射规则和Servlet映射路径(<url- pattern>
)做匹配,如果匹配成功,则调用这个Servlet处理请求。
3.Serclet是如何匹配路径的
- 精确路径匹配**?例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 / ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
- 最长路径匹配**?*例子:servletA的url-pattern为/test/,而servletB的url-pattern为/test/a/,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
- 扩展匹配**?*如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action
- 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。
4.工程名-servlet.xml
- 默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml
- 可以通过配置修改MVC配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置。
我们在平台项目两个工程中分别使用了不同的配置方式,介绍如下:
我们在business-client工程中按照默认方式查找MVC的配置文件,配置文件目录为: /WEB-INF/business-servlet.xml。工程目录结构如下所示:
我们在public-base-server工程中,通过第2种方式进行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,则需要在配置DispatcherServlet时指定标签。具体代码如下:
<?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/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<!-- DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:controller/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
工程目录结构如下所示:
注意:用户可以配置多个DispatcherServlet来分别处理不同的url请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,他们都拥有相同的父Spring容器(业务层,持久(dao)bean所在的容器)。
classpath:在工程文件中有一个.classpath文件,打开后找到如下:
这里的path就是classpath的路径。打开这个文件路径可以看到不仅仅是java类会被编译成class存放在classes目录下,而且properties文件、xml文件也会放到这个目录下,但没有找到web.xml。
4.jsp页面的访问
先附上要访问的jsp页面:
这里要访问的是WEB-INF底下page文件夹中的index.jsp页面。
原工程名-servlet.xml的代码只能访问到WEB-INF中的jsp文件,而不能具体到其子目录中的文件
原:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--id实例化的名字,class实例化的类 -->
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index">indexController</prop>
</props>
</property>
</bean>
<bean id="indexController" class="controller.IndexController"></bean>
</beans>
更改后:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--id实例化的名字,class实例化的类 -->
<!-- 作用是把视图约定在 /WEB-INF/page/*.jsp 这个位置 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index">indexController</prop>
</props>
</property>
</bean>
<bean id="indexController" class="controller.IndexController"></bean>
</beans>
prefix:意思是前缀
suffix:意思是后缀
原先的访问路径为:http://localhost:8080/springmvc/index
现在的访问路径为:http://localhost:8080/springmvc/index
没有变化,改变的地方在IndexController类中,
原:为ModelAndView mav=new ModelAndView("index.jsp");
现在:为ModelAndView mav=new ModelAndView("index");
参考资料:
****https://blog.csdn.net/believejava/article/details/43229361