1.什么是springmvc,它与spring有什么关系
springmvc属于spring框架的后续产品,用在基于MVC的表现层开发,类似于struts2框架。
2.初识springmvc工作流程
用户请求Action-->springmvc DispathcerServlet-->映射器-->适配器-->Action-->视图解析器-->springmvc DispathcerServlet-->jsp页面
3.springmvc快速入门(XML版本)
导入spring core、spring web、spring mvc包;
在web.xml中配置spring核心控制器
<servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通知dispatcherservlet去指定的目录下加载springmvc--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
创建控制器类HelloAction
public class HelloAction implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message","这是我的第一个springmvc程序"); //视图的真实路径 // modelAndView.setViewName("/jsp/success.jsp"); //视图的逻辑路径 modelAndView.setViewName("success"); return modelAndView; } }
创建转发到的success.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-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "> <!--注册action--> <bean name="/hello.action" class="springmvc.HelloAction"> </bean> <!--映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--如果action中书写的是视图逻辑名称,那么视图解析器必须配置--> <!--如果action中书写的是视图的真实名称,那么视图解析器可选--> <!--路径前缀--> <property name="prefix" value="/jsp/"></property> <!--路径后缀--> <property name="suffix" value=".jsp"></property> <!--前缀+逻辑名+后缀=真实路径--> </bean> </beans>
4..视图解析器【解析视图逻辑名对应的真实路径】【配置可省】InternalResourceViewResolver
如果需要配置jsp-jsp之间的转发控制器,需要如下配置(不要和本文件下的视图解析器同时存在,否则可能会加前缀和后缀):
<bean name="/index.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> <property name="viewName" value="/WEB-INF/index.jsp"></property> </bean>
5.映射器Mapping【什么样的请求交给Action】【配置可省】BeanNameUrlHandlerMapping
1) org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心)
将程序员定义的Action所对应的<bean>标签的name属性作为请求路径;
<bean name="/hello.action" class="springmvc.HelloAction"> </bean>
2) org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
/delete.action和/update.action和/find.action请求路径都交由<bean>标签为id的Action,即多个路径对应同一个Action
<bean id="userActionID" class="springmvc.UserAction"></bean> <!--映射器--> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/update.action">userActionID</prop> <prop key="/delete.action">userActionID</prop> <prop key="/find.action">userActionID</prop> </props> </property> </bean>
7.适配器Adapter【Action实现什么接口】【配置可省】SimpleControllerHandlerAdapter
8.控制器Controller【Action继承什么类】【配置必写】HelloAction
org.springframework.web.servlet.mvc.AbstractCommandController能够以实体的形式,收集客户端参数
public class EmpAction extends AbstractCommandController{ public EmpAction(){ this.setCommandClass(Emp.class); } @Override protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object obj, BindException error) throws Exception { Emp emp = (Emp) obj; System.out.print(emp); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message","封装成功"); modelAndView.setViewName("success"); return modelAndView; }
}
9.日期转换器和编码过滤器
配置编码过滤器(只能针对post方法的参数)
<!--注册spring针对post的乱码问题,仅适用于post--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
日期转换器
public class EmpAction extends AbstractCommandController{ public EmpAction(){ this.setCommandClass(Emp.class); } //自定义类型转换器,将string转换成date类型yyyy-mm-dd @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { //向springmvc中注册一个自定义的类型转换器 //参数一:将string转成什么类型的字节码 //参数二:自定义转换规则 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); } @Override protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object obj, BindException error) throws Exception { Emp emp = (Emp) obj; System.out.print(emp); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message","封装成功"); modelAndView.setViewName("success"); return modelAndView; } }
10.springmvc与struts2的区别
1)springmvc的入口是一个servlet,即前端控制器,例如:*.action
struts2入口是一个filter过虑器,即前端过滤器,例如:/*
2)springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例
struts2是基于类开发,传递参数是通过类的属性,只能设计为多例
3)springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面
struts采用值栈存储请求和响应的数据,通过OGNL存取数据