我们先来说一下什么事SpringMVC?有什么作用?
- springMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等)
springmvc和strus2的区别?
我们可以从两点看出区别,一个是入口一个是生命周期。
- SpringMVC的入口是servlet,而strus2则是filter
- 从什么周期来看:spring mvc Controller是单例的,所以不能使用成员变量获取参数,效率高。struts action则是多例的,可以使用成员变量获取参数,效率低。
spring mvc中常用注解
(本文章用到的@Controller,@RequestMapping)
- @Controller:标识这个类是一个控制器
- @RequestMapping:给控制器方法绑定一个uri
- @ResponseBody:将java对象转成json,并且发送给客户端
- @RequestBody:将客户端请求过来的json转成java对象
- @RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射
- @SessionAttribute:声明将什么模型数据存入session
- @CookieValue:获取cookie值
- @ModelAttribute:将方法返回值存入model中
- @HeaderValue:获取请求头中的值
了解SpringMVC的核心组件
- DispatcherServlet:前置控制器
- HandlerMaper:请求映射到Mapper
- handler:自定义完成具体业务逻辑,后端控制器
- HandlerInterceptor:处理器拦截器
- HandlerExcutionChain:处理器执行链
- HandlerAdapter:处理器适配器
- ModelAndView:装载模型数据和视图信息
- ViewResolver:视图解析器
SpringMVC的执行实现流程
- 客户端请求被DispatcherServlet接收。
- DispatcherServlet将请求映射到Handler。
- 生成Handler以及HandlerInterceptor
- 返回HandlerExecutionChain ( Handler+ HandlerInterceptor )
- DispatcherServlet通过HandlerAdapter执行Handler
- 返回一个Mod## 标题elAndView
- DispatcherServlet通过ViewResolver进行解析
- 返回填充了模型数据的View ,响应给客户端
不要看着SpringMVC组件太多,执行过程复杂,其实大部分组件由框架提供,我们只需要通过配置进行关联即可,只需手动编写Handler , View。
通过案例说明SpringMVC的注解 方式和XML方式
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>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
XML方式
springmvc.xml
<bean id="handlerMapper" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test">myfristHandler</prop>
</props>
</property>
</bean>
<bean id="myfristHandler" class="com.java.MyHandler"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean
MyHandler类我们需要继承Controller
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("name","hello SpringMVC");
modelAndView.setViewName("show");
return modelAndView;
}
}
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${name}
</body>
</html>
接下来配置Tomcat,启动,访问/test这个路径(springmvc.xml中配置)
启动成功显示Hello SpringMVC
注解方式
springmvc.xml
<context:component-scan base-package="com.java"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
MyHandler2类我们不需要继承Controller(@Controller,@RequestMapping)
@Controller
public class MyHandler2 {
@RequestMapping("/modelAndViewTest")
public ModelAndView modelAndView(Model model){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("name","hello SpringMVC");
modelAndView.setViewName("show");
return modelAndView;
}
}
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${name}
</body>
</html>
接下来配置Tomcat,启动,访问/test这个路径(springmvc.xml中配置)
启动成功显示Hello SpringMVC
当然我们传值的方式还有其他的方式:(调用的方式一模一样,可以用下面两种方式代替MyHandler2中的modelAndView方法)
- model传值
@RequestMapping("/modelTest")
public String ModelTest(Model model){
model.addAttribute("name","SpringTom2");
return "show";
}
- Map传值
@RequestMapping("/mapTest")
public String MapTest(Map<String,String>map){
map.put("name","MapTOM");
return "show";
}