详解原生的基于XML配置的SpringMVC
一、搭建建一个SpringMVC项目
二、详解web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--1、配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--2、配置SpringMVC配置文件的路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--3、保证前端控制器的加载的级别是最高的-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--4、指定请求的匹配-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
1、SpringMVC的前端控制器,最核心的,实际上也是一个servlet,没有它,SpringMVC工作不了。 DispatcherServlet继承自FrameworkServlet,如图:
2、name名称写为contextConfigLocation是固定写法,因为它是FrameworkServlet这个类中的一个属性,若是书写错误,将会出问题:
3、若容器中有多个servlet,为了保证最核心的前端控制器首先被加载,需要配置一个优先级标签。
4、这里请求的路径可以有好多种配置形式,比如:*.do, *.action, / 等等,这里配置的“ .do”的形式,意思是说只要是发送过来的是以“.do”结尾的这种请求,就都会拦截,交给 DispatcherServlet处理。若是这里配置的是“/”,则意思是发送过来的所有请求都拦截,但是这样会有问题,那就是你的静态资源也会拦截到,稍后再说。接上,请求交给DispatcherServlet后,它将会在SpringMVC的配置文件中去读取,配置文件中配置了一个bean,它的id是“/hello.do”,而我们配置的请求路径也是“ *.do”,因此,前端控制器 会将这个请求交给当前的这个controller “HelloSpringMVC”来处理。之后,请求执行到了“HelloSpringMVC”,最终跳转到“/WEB-INF/jsp/show.jsp”这个页面。请求执行如下:
若是请求路径配置为“/”,请求 执行如下:
三、详解springmvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1、配置一个Handler-->
<bean id="/hello.do" class="com.controller.HelloSpringMVC"></bean>
</beans>
这里id="/hello.do" 相当于注解配置中的 @RequestMapping("/hello")。
四、创建一个controller
1、相当于在SpringMVC配置文件中注册了一个controller
public class HelloSpringMVC implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("name","yunzhongmangbu");
//添加逻辑视图
modelAndView.setViewName("/WEB-INF/jsp/show.jsp");
return modelAndView;
}
}
五、详解视图解析器
假设现在有10个controller,那么我们需要在里面配置返回视图的路径都将是如下的形式,代码冗余:
若是此时需要更改jsp文件的存放路径,那势必会牵一发而动全身,所有文件中的路径都要修改,极为不便,所有我们使用SpringMVC给我们提供的视图解析器来配置,优化代码。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:视图的存放路径-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀:视图的扩展名-->
<property name="suffix" value=".jsp" />
</bean>
<!--配置一个Handler-->
<bean id="/hello" class="com.controller.HelloSpringMVC"></bean>
</beans>
此时的controller中的视图的配置就简洁多了,以后要是修改路径,只需要在SpringMVC的配置文件中修改视图解析器中的前缀后缀就可以了,方便了许多:
补充一下:
web项目开发下WEB-INF目录是被保护起来的,其下的jsp页面不能直接运行,一般我们把页面、css、js、img等文件放置在webapp目录下
六、配置一个index.jsp
我们可以在web.xml中配置一个index.jsp首页,当我们直接访问工程的路径时,将会跳转至此页面:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--设置工程首页-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
index.jsp要放置在工程的根目录webapp下面: