springmvc学习笔记

abc2516941

贡献于2016-10-09

字数:7116 关键词: Spring MVC Web框架

SpringMVC学习笔记 1、SpringMVC使用步骤: 1) 加入jar包 2) 在web.xml中配置DispatcherServlet 3) 加入Spring MVC的配置文件 4) 编写处理请求的处理器,并标识为处理器 5) 编写视图 2、配置的DispatcherServlet会默认加载/WEB-INF/.xml下的Spring配置文件来启动WEB层的Spring容器。也可以通过为web.xml中的servlet元素配置contextConfigLocation初始化参数自定义配置文件的位置和名称。如下图: 注:DispatcherServlet截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法。 补充: web.xml配置详解之context-param 格式定义: contextConfigLocation contextConfigLocationValue> 作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。 param-name 设定上下文的参数名称。必须是唯一名称 param-value 设定的参数名称的值 初始化过程: (1)、在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点。 (2)、接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。 (3)、接着容器会将读取到转化为键值对,并交给ServletContext。 (4)、容器创建中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。 (5)、在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。 (6)、得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。 由上面的初始化过程可知容器对于web.xml的加载过程是context-param >> listener >> fileter >> servlet 3、编写SpringMVC配置文件: 1) 配置自动扫描的包(让请求进入控制器和处理器) 2) 配置视图解析器,将视图逻辑名解析为:/WEB-INF/pages/.jsp 4、 创建控制器和处理器 5、 Spring MVC工作流程描述 (1)用户向服务器发送请求,请求被Spring前端控器DispatcherServlet捕获; (2)DispatcherServlet对URL请求进行解析,得到请求资源标识符(URI),然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回; (3)DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法); (4)提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中 (5) Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象; (6) 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ; (7) ViewResolver 结合Model和View,来渲染视图 (8) 将渲染结果返回给客户端。 6、 @RequestMapping注解 作用:Spring MVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求 使用位置: 在控制器(controller)的类定义及方法定义处都可标注@RequestMapping 1)类定义处:提供初步的请求映射信息。相对于WEB应用的根目录 2)方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未标注 @RequestMapping,则方法处标记的URL相对于WEB应用的根目录 使用方法: 1)@RequestMapping除了可以使用请求URL映射请求外,还可以使用请求方法、请求 参数、请求头映射请求。value、method、params及heads等参数分别表示请求URL、 请求方法、请求参数、请求头的映射条件。 params和headers用法: param1: 表示请求必须包含名为param1的请求参数; !param1: 表示请求不能包含名为param1的请求参数; param1 != value1: 表示请求包含名为param1的请求参数,但其值不能为value1; {“param1=value1”,“param2”}: 请求必须包含名为param1和param2的两个请求参 数,且param1参数的值必须为value1; 2) RequestMapping映射请求支持Ant风格的URL: Ant风格的资源地址3种匹配符: ?:匹配文件名中的一个字符 *:匹配文件名中的任意字符 **:** 匹配多层路径 @RequestMapping支持Ant风格的URL: /user/*/createUser: 匹配/user/aaa/createUser、/user/bbb/createUser等URL; /user/**/createUser: 匹配/user/createUser、/user/aaa/bbb/createUser等URL; /user/createUser??: 匹配/user/createUseraa、/user/createUserbb等URL; 7、 @PathVariable注解 作用:通过@PathVariable注解可以将URL中占位符参数绑定到控制器处理方法的入参中:URL中的{xxx}占位符可以通过@PathVariable("xxx")绑定到操作方法的入参中 使用方法: 8、 HiddenHttpMethodFilter作用 浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,Spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。 补充:REST风格的URL 以CRUD为例: 新增:/order POST 修改:/order/1 PUT update?id=1 获取:/order/1 GET get?id=1 删除:/order/1 DELETE delete?id=1 客户端如何发送PUT和DELETE请求呢? 1、需要在web.xml中配置HiddenHttpMethodFilter 2、需要发送POST请求 3、需要在发送POST请求时携带一个name="_method"的隐藏域,值为DELETE或PUT 在SpringMVC中的目标方法中如何得到id呢?是使用@PathVariable注解 9、 @RequestParam注解(映射请求参数) 作用:在处理方法入参处使用@RequestParam可以把请求参数传递给请求方法 参数: value:参数名 required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常 使用方法: 10、 @RequestHeader和@CookieValue使用方法和@RequestParamore类似 11、 使用POJO对象绑定请求参数值 作用:Spring MVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值。 支持级联属性,如:dept.deptId、dept.address.tel等。 使用方法: 12、 SpringMVC的Handler方法可以接受哪些ServletAPI类型的参数? HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、 Locale、InputStream、OutputStream、Reader、Writer 13、 处理模型数据 Spring MVC提供了以下几种途径输出模型数据: (1) ModelAndView: 处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据; 控制器处理方法的返回值如果为ModelAndView,则其既包含视图信息,也包含模型数据信息。 添加模型数据方法: MoelAndView addObject(String attributeName, ObjectattributeValue) ModelAndView addAllObject(Map modelMap ) 设置视图方法: void setView(View view) void setViewName(String viewName) 总结:目标方法的返回值可以使ModelAndView类型,其中可以包含视图和模型信息; SpringMVC会把ModelAndView的model中数据放入到request域对象中; (2) Map及Model: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map中的数据会自动添加到模型中; Spring MVC在内部使用了一个org.springframework.ui.Model接口存储模型数据 具体步骤: Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。如果方法的入参为Map或Model类型,Spring MVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。 (3) @SessionAttributes: 将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性; 若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,Spring MVC将在模型中对应的属性暂存到HttpSession中。 @SessionAttributes除了可以通过属性名指定需要放到会话中的属性外(使用的是value属性),还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(使用的是type属性) @SessionAttributes(types=User.class) 会将隐含模型中所有类型为User.class的属性添加到会话中 @SessionAttributes(value={“user1”, “user2”}) @SessionAttributes(types={User.class, Dept.class}) @SessionAttributes(value={“user1”, “user2”},types={Dept.class}) 注:该注解只能修饰类,而不能修饰方法 (4) @ModelAttribute: 方法入参标注该注解后,入参的对象就会放到数据模型中; 1) 、在方法定义上使用@ModelAttribute注解:Spring MVC在调用目标处理方法前,会 先逐个调用在方法上标注了@ModelAttribute的方法; 运行过程: a)、执行@ModelAttribute注解修饰的方法:从数据库中取出对象,把对象放入到了Map 中,键为user b)、SpringMVC从Map中取出User对象,并把表单的请求参数赋给该User对象的对应 属性 c)、SpringMVC把上述对象传入目标方法的参数 注意:在@ModelAttribute修饰的方法中,放入到Map时的键需要和目标方法入参类型 的第一个字母小写的字符串一致! 2) 、在方法的入参前使用@ModelAttribute注解:可以从隐含对象中获取隐含的模型数 据中获取对象,再将请求参数绑定到对象中,再传入入参将方法入参对象添加到模型中; 14、 视图和视图解析器 (1)请求处理方法执行完成后,最终返回一个ModelAndView对象。对于那些返回String,View或ModeMap等类型的处理方法,Spring MVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图; (2)Spring MVC借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP,也可能是Excel、JFreeChart等各种表现形式的视图; (3)对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现MVC的充分解耦。 (4)若希望直接响应通过 SpringMVC 渲染的页面,可以使用 mvc:view-controller 标签实现 15、 视图 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet 包中定义了一个高度抽象的View接口: 16、 视图解析器 SpringMVC为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。 视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。 所有的视图解析器都必须实现 ViewResolver 接口: 17、 关于重定向 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,如果返回 的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理,将 forward: 和redirect: 当成指示符,其后的字符串作为 URL 来处理。 redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作 forward:success.jsp:会完成一个到 success.jsp 的转发操作 17、处理静态资源 (1)优雅的 REST 风格的资源URL 不希望带 .html 或 .do 等后缀 (2)若将DispatcherServlet请求映射配置为 /,则Spring MVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将它们当成一个普通请求处理,因找不到对应处理器将导致错误。 (3)可以在SpringMVC的配置文件中配置的方式解决静态资源的问题: a)、将在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler,它会对进入DispatcherServlet的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由WEB应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。 b)、一般WEB应用服务器默认的Servlet的名称都是default。若所使用的WEB服务器的默认Servlet名称不是default,则需要通过default-servlet-name属性显式指定。 18、问题: (1)  请求如何给前端控制器? (2)  前端控制器如何根据请求信息选择页面控制器进行功能处理? (3)  如何支持多种页面控制器呢? (4)  页面控制器如何使用业务对象? (5)  页面控制器如何返回模型数据? (6)  前端控制器如何根据页面控制器返回的逻辑视图名选择具体的视图进行渲染? (7)  不同的视图技术如何使用相应的模型数据?

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档