一、springmvc简单使用
学习springmvc首先接触到的是DispatcherServlet前端控制器,该控制器本质为一个servlet,在web.xml中配置,用来拦截所有的url请求。
还有三个概念:处理映射器、处理适配器、视图解析器。
在WebApplicationContext初始化结束后,会调用DispatcherServlet的initStrategies(初始化策略)方法,这里用来加载自定义组件,如果没有找到指定的名称的组件,则会加载默认组件(在DispatcherServlet.properties)配置文件中。
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
其中,initHandlerMappings(context);为初始化处理器映射器
initHandlerAdapters(context);初始化处理器适配器。
initViewResolvers(context);初始化视图解析器
springmvc的处理流程如下图所示:
遗留问题:这些适配器,以及工厂类的源码实现,还需要进一步了解!
二.Spring 常用注解
1.@Controller
使用该注解表明该类是一个控制器,可以支持多个请求动作,为了保证springmvc能够找到控制器,需要在springmvc的配置文件中启动包扫描功能:
<context:component-scan base-package="org.ldy.springmvc.controller"/>
2.@RequestMapping
用来指定哪个类或者是方法来处理制定的请求。
用于类的注解表示:所有的方法请求都需要加上该类的请求路径
使用方法:
@Controller
public class AnnotationController {
private static final Log logger = LogFactory.getLog(HelloController.class);
@RequestMapping(value="/helloAnno")
public ModelAndView helloAnnotation()
{
logger.info("helloAnnotation is 被调用");
ModelAndView mv = new ModelAndView();
mv.addObject("message", "helloAnnotation!!!");
mv.setViewName("/WEB-INF/views/first.jsp");
return mv;
}
}
只有一个属性的情况下默认为value属性。
还包括,
method属性:用来指定该方法仅仅用来处理那些请求
eg:@RequestMapping(value=”/hello”, method=RequestMethod.POST)
consume属性:用来指定请求的提交内容
eg:@RequestMapping(value=”/hello”, consume=“application/json”)
produces属性:用来指定返回的内容类型,且必须是request请求头(access)中所包含的类型。
eg:@RequestMapping(value=”/hello”, produces=“application/json”)
params属性:指定请求中必须包含某些参数时,才让该函数处理。
eg:@RequestMapping(value=”/hello”, params=“myparam=myvalue”)
headers属性:指定必须包含某些header时才处理
eg:@RequestMapping(value=”/hello”, headers=“Referer=xxx”)
3.处理request body部分的注解:
@RequestParam:将指定的请求参数赋值给方法的形参
eg:public ModelAndView login(@RequestPara(“loginName”) String loginname){……}
会把请求参数中的loginName的值赋值给loginname参数。
@RequestBody 用来处理前台请求类型为“applicatino/json”“applicatin/xml”,可以方便的接受json、xml类型的数据。
eg:public void setJson(@RequestBody Book book){……}
4.处理request uri部分的注解:
@PathVariable:用来获取请求url中的动态参数
eg:@RequestMapping(value=”/pathVariableTeset/{userID}”)
public String pathVariableTest(@PathVariable int userID, Model model)
5.处理request header部分的注解:
@RequestHeader:用于获取请求头中的信息
@CookieValue:用于将请求的Cookie信息映射到处理方法的参数上。
6.处理attribute部分的注解:
@SessionAttributes:用于指定将model中的那些属性映射到HttpSessin对象中,只能用来注释类。mode和HttpSession为不同的域,方便跨域传递数据。
@ModelAttribute:用于将函数的参数和对象绑定到model对象,且被@ModelAttribute注释的函数会优先于控制器的每个方法执行前被执行,即在执行处理逻辑之前被调用。有三种使用方式。
a.被注解的函数返回值为String,这样返回值和@ModelAttribute(value=”modelName”)组成键值对,绑定到model中。
b.被注解的函数返回值为void,可通过model.addAttribute来进行绑定。
c.被注解的函数返回值为具体类,返回对象为类名的小写,绑定到model
三.Json和xml数据转换
后续补充……