首先按照 SpringMVC框架原理 需要先配置前端控制器
前端控制器配置 DispatcherServlet
前端控制器DispatcherServlet
在web.xml里面配置前端控制器 DispatcherServlet
<!--配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--为前端控制器指定各种handler映射器,handler适配器,视图解析器,语言环境解析器,异常解析器 -->
<!--如果不配置ContextConfigLocation 默认加载的是WEB-INF/servlet名称-servlet.xml (springmvc-servlet.xml) -->
<init-param>
<param-name>ContextConfigLocation</param-name>
<!--此配置文件内部配置handler映射器,handler适配器,视图解析器,语言环境解析器,异常解析器的bean,交由IOC容器管理 -->
<param-value>classpath:resources/springMVC/SpringMVCBeans.xml</param-value>
</init-param>
</servlet>
<!--配置url和DispatcherServlet之间的映射规则 -->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--url-pattern:第一种: *.action 表示 所有以.action结尾的请求由DispatcherServlet进行解析 -->
<!--第二种: / 表示所有地址都由DispatcherServlet进行解析,这种方法可以实现RESTful风格的url -->
<!--第三种: /* 这种配置存在问题,使用这种配置,在转发到jsp页面时,DispatcherServlet会jsp地址,不能根据jsp页面找到handler -->
<url-pattern>/</url-pattern>
</servlet-mapping>
补充 :前端控制器的执行流程
1.接收用户请求,执行doDispatch方法
doDispatch(HttpServletRequest request, HttpServletResponse response)
2.通过HandlerMapping对象为当前请求指定Handler(Controller)
mappedHandler = getHandler(processedRequest);
3.找到url对应的Handler后,通过该Handler找到适合当前Handler的HandlerAdapter对象
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
4.经过一系列验证之后,通过HandlerAdapter对象执行当前的Handler(Controller)并且返回一个ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler())
5.拿着上一步返回的ModelAndView进行视图的解析(1),返回View,然后视图渲染(2)将Model中的数据填充到request域
1.解析视图,返回View
1.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)
2.render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)
3.view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
2.视图渲染,将Model中的数据填充到request域
1.view.render(mv.getModelInternal(), request, response);
2.renderMergedOutputModel(mergedModel, request, response);
3.exposeModelAsRequestAttributes(model, requestToExpose);
配置处理器映射器HandlerMapping
处理器适配器和处理器映射器(注解)
处理器映射器
Spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping作为(注解)处理器映射器HandlerMapping
Spring3.1之后使用org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping作为(注解)处理器映射器HandlerMapping
<!--注解的 处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
处理器适配器配置 HandlerAdapter
处理器适配器
Spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter最为(注解)处理器适配器HandlerAdapter
Spring3.1之后使用org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter作为(注解) 处理器适配器 HandlerAdapter
<!--注解的 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
快速标签(一键代替(注解)处理器映射器和(注解)处理器适配器)
快速标签(一键代替(注解)处理器映射器和(注解)处理器适配器)
<!--mvc注解驱动配置(一键代替(注解)处理器映射器和(注解)处理器适配器) -->
<!--在实际开发中使用,因为该标签默认绑定了许多参数绑定方法,比如json转换解析器....-->
<mvc:annotation-driven></mvc:annotation-driven>
编写Handler(Controller)
@Controller
//注解方式配置MVC时必须用Controller,使用@Component无法进行Url映射
public class CelebrityController{
@Autowired
//对于有多个实现类的接口可以采用@Qualifier("InterfaceName")注解注入
private CelebrityService celebrityService;
/* (non-Javadoc)
* @see com.ncs.controller.ICelebrityController#saveAndView()
*/
@RequestMapping("/saveAndView")
public ModelAndView saveAndView() throws Exception {
Celebrity celebrity = new Celebrity();
celebrity.setID(30);
celebrity.setName("Tim");
ModelAndView modelAndView = new ModelAndView();
try {
Map<String, Object> result = celebrityService.saveAndView(celebrity, celebrity.getID());
Iterator iterator = result.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Entry) iterator.next();
// 指定model
modelAndView.addObject("celebrity", celebrity);
// 指定视图
modelAndView.setViewName("/WEB-INF/jsp/show.jsp");
}
}catch(Exception e){
// 指定model
modelAndView.addObject("error", e);
// 指定视图
modelAndView.setViewName("/WEB-INF/jsp/error.jsp");
}
return modelAndView;
}
}
视图编写
编写视图 jsp,pdf、、、
配置视图解析器ViewResolver
在SpringMVCBeans.xml配置视图解析器ViewResolver (将处理器适配器交由SpringMVC容器管理)
<!--配置jsp视图解析器 "javax.servlet.jsp.jstl.core.Config"默认支持jstl -->
<bean id="ViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置视图页面的前缀和后缀,方便开发 -->
<!-- <property name="prefix" value="/WEB-INF/jsp/"/> -->
<!-- <property name="suffix" value=".jsp"/> -->
</bean>