一.教程和视图
导入后的运行结果是正常的,但是要注意运行地址后面是没有.jsp这个后缀
http://localhost:8088/springmvc/index |
因为这个以往的MVC不太相同,这与配置的底层运行逻辑有关
首先梳理一下Spring mvc的运行框架,有六个基本的组件
-
DispatcherServlet:前置控制器,接收所有的请求并将其分发给相应的处理程序。
-
HandlerMapping:根据请求的URL映射到相应的处理程序。
-
Controller:处理请求并生成响应。
-
ModelAndView:包含模型数据和视图名称的对象,用于将处理程序的输出传递给视图。
-
ViewResolver:将视图名称解析为实际的视图对象。
-
View:将模型数据渲染为响应的视图。
在整个响应流程中,DispatcherServlet充当了前置控制器的角色,负责接收所有的请求并将其分发给相应的处理程序。HandlerMapping和ViewResolver则负责将请求映射到相应的处理程序和将视图名称解析为实际的视图对象。Controller和View则分别处理请求并生成响应数据以及将响应数据渲染为实际的视图
- 在springmvc-servlet.xml中:包含了HandlerMapping和ViewResolver的配置
<beans> <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> |
<prop key="/index"> 这个地方就决定了地址栏不能有后缀出现,表示将URL模式为"/index"的请求映射到名为"indexController"的Controller处理器上,
其次, <property name="prefix" value="/WEB-INF/page/" />和
<property name="suffix" value=".jsp" />分别制定了JSP页面的前缀和后缀,这样在Controller中返回的视图名称就可以省略前缀和后缀,从方法上对应相关的视图
- web.xml: 配置DispatcherServlet, 当用户发送请求时,Web容器会将请求转发给名为"springmvc"的Servlet,由DispatcherServlet进行处理。同时,DispatcherServlet会根据请求的URL找到对应的Controller进行处理,并将处理结果返回给用户
<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> |
- 运行:
对比三个运行地址可以看到,
第一个有后缀的没有成功,说明视图解析器起了作用
第二个地址没有成功是因为,运行的JSP页面,默认的是JSP的绝对地址,而不是从用户角度发出请求处的相对地址
最后总结一下,基于上述运行框架,配置视图定位时需要做的两个步骤也就不难理解了
首先配置视图解析器的属性,定义jsp页面的前后缀
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/page/" /> <property name="suffix" value=".jsp" /> </bean> |
配置完后,控制器中ModelAndView mav = new ModelAndView("index.jsp");的jsp后缀也就可以去掉了,运行地址之后,前端控制器会自动把前后缀拼接起来,生成最后的视图名
二.注解
这个方式就相对好理解了,在完成视图定位的基础上,改两个地方
其一,控制器,@Controller
public class IndexController {
@RequestMapping("/index")
@Controller表示该控制类会接受并处理来自客户端的请求,通俗解释="我能行"
@RequestMapping("/index") 表示当用户访问"/index" 路径时,该控制类将来负责处理
通俗解释='我哪里能行'
其二,核心配置文件中.去掉相关的映射配置,
增加
<context:component-scan base-
package
=
"controller"
>等配置代码
最后还是运行原来的地址也是没有问题的