SpringMVC:有哪些核心组件?
基础的四个组件。
一、DisapatcherServlet
前端控制器,接受所有的请求。(配置为/ 则为所有不包括jsp的请求。/*则为所有请求)
配置:
在web.xml中配置一个前端控制器。
<!--前端控制器--> <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:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--接收所有除了jsp的请求--> <url-pattern>/</url-pattern> </servlet-mapping>
静态资源:
因为在 DisapatcherServlet 我们配置了它接受所有除了jsp的请求,所以在请求静态资源的时候,会出现错误,于是我们需要在配置文件中声明哪些访问是对静态文件的访问。
配置:
<!--静态资源:为了避免DisapatcherServlet拦截下对静态资源的请求,我们需要配置静态资源访问映射 mapping:请求路径 location:项目路径--> <mvc:resources mapping="/js/**" location="/js/"></mvc:resources> <mvc:resources mapping="/css/**" location="/css/"></mvc:resources> <mvc:resources mapping="/images/**" location="/images/"></mvc:resources>
二、HandlerMapping
解析请求格式,判断需要执行的具体方法。
xml配置:
在springmvc配置文件中配置
<!--准备好控制器--> <bean class="com.lurenjia.controller.DemoController" id="demoController"></bean> <!--配置一个解析器--> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <!--配置一个控制器的逻辑名为demo--> <entry key="demo" value-ref="demoController"></entry> </map> </property> </bean>
注解配置:
使用RequestMapping配置该方法对应的访问逻辑名。
@Controller public class LoginController { @RequestMapping("demo")//配置方法映射的逻辑名 public String demo(){ return "main.jsp"; } }
三、HandlerAdapter
责调用具体的方法
xml配置:
在springmvc配置文件中配置。(可使用默认值,无需配置)
<!--配置一个适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
注解配置:
<!--注解驱动,配置了Mapping和Adapter--> <mvc:annotation-driven></mvc:annotation-driven>
四、ViewResovler
视图解析器,解析结果,准备跳转到具体的物理视图。
配置:
在springmvc配置文件中配置。(可使用默认值,无需配置)
<!--配置一个视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <!--配置前缀--> <property name="prefix" value="/"></property> <!--配置后缀--> <property name="suffix" value=".jsp"></property> </bean>
五、MultipartResolver
用于文件上传,它依赖于commons-fileupload组件。
配置:
<!--文件解析器--> <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"> <!--上传文件的最大字节数--> <property name="maxUploadSize" value="1024"></property> </bean>
六、ExceptionResolver
用于在程序发生异常时,指定跳转的页面。
配置:
<!--异常解析器--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver"> <property name="exceptionMappings"> <props> <!--key为异常类型,内容为跳转的位置--> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">/error.jsp</prop> </props> </property> </bean>
使用MVC
(一)、不使用注解
示例代码:
程序运行后,客户端发出请求,DisapatcherServlet接收到demo请求,通过HandlerMapping配置的逻辑名映射找到DemoController类,调用其实现的接口方法ModelAndView,经过视图解析器添加前缀 / ,后缀 .jsp ,最终达到页码跳转到main.jsp文件效果。
public class DemoController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { System.out.println("执行了springmvc的控制器!"); //创建一个ModelAndView ModelAndView modelAndView = new ModelAndView("main"); //进行跳转 return modelAndView; } }
(二)、使用注解
实例代码:
通过 Controller 注解把控制器对象交给spring管理,然后通过 RequestMapping 注解实现逻辑名与具体方法的绑定,此时客服端访问demo则执行此方法。
@Controller public class LoginController { @RequestMapping("demo")//配置方法映射的逻辑名 public String demo(){ return "main.jsp"; } }