SpringMVC分解.docx
- 文档编号:14864578
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:18
- 大小:63.65KB
SpringMVC分解.docx
《SpringMVC分解.docx》由会员分享,可在线阅读,更多相关《SpringMVC分解.docx(18页珍藏版)》请在冰点文库上搜索。
SpringMVC分解
SpringMVC
1.1.1.SpringMVC介绍
1.1.2.Spring3MVCVSStruts2
●官方的下载网址是:
http:
//www.springsource.org/download
●SpringMVC会比Struts快,在Struts中默认配置了很多缺省的拦截器,在给开发者提供便利的同时,失去了灵活性和开发效率.
●Springmvc是基于方法的设计,而Sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,可控制更强
●设计思想上:
Struts更加符合oop的编程思想,Spring是在在Servlet上扩展
●提供强大的约定大于配置的契约式编程支持
●支持JSR303验证规范,实现了基于注解方式的可验证的JavaBean
1.1.第一个MVC案例
1.1.1.配置前端过滤器
DispatcherServlet实际上是一个Servlet(它继承了HttpServlet)。
与其它Servlet一样,DispatcherServlet定义在web应用的web.xml文件中。
DispatcherServlet处理的请求必须在同一个web.xml文件里使用url-mapping定义映射
--修改路径默认加载路径-->
springMVC.xml
1.1.2.创建控制器
控制器的概念是MVC设计模式的一部分(确切地说,是MVC中的C)。
应用程序的行为通常被定义为服务接口,而控制器使得用户可以访问应用所提供的服务。
控制器解析用户输入,并将其转换成合理的模型数据,从而可以进一步由视图展示给用户。
Spring以一种抽象的方式实现了控制器概念,这样可以支持不同类型的控制器。
Spring本身包含表单控制器、命令控制器、向导型控制器等多种多样的控制器。
Spring控制器架构的基础是org.springframework.mvc.Controller接口其代码如下
/**
*演示了SpringmvcZ中的c,它负责处理请求并返回合适的模型和视图
*SpringMVC实现的基础就是这三个概念:
Mdel、View(ModelAndView)以及Controller
*/
publicclassFirstControllerimplementsController{
//构造方法,在启动的时候就创建Action,而且常驻内容,注意与StrutsAction生命周期不同
publicFirstController(){
System.out.println("---FirstController()---");
}
/*
*必须实现接口定义的方法,类似Servlet中的request,response
**/
publicModelAndViewhandleRequest(HttpServletRequestrequest,
HttpServletResponseresponse)throwsException{
System.out.println("-----handleRequest-----");
request.setAttribute("pass","admin***");
//与Struts不同,这里返回的是称为ModelView由Model与View组成,
//呈现的数据可以存储到Model中,Mode作用域的范围默认为request对象
Map
model.put("name","admin");
returnnewModelAndView("first",model);
}
}
可以发现Controller接口仅仅声明了一个方法,它负责处理请求并返回合适的模型和视图。
SpringMVC实现的基础就是这三个概念:
Mdel、View(ModelAndView)以及Controller。
虽然Controller接口是完全抽象的,但Spring也提供了许多你可能会用到的控制器。
Controller接口仅仅定义了每个控制器都必须提供的基本功能:
处理请求并返回一个模型和一个视图
1.1.3.配置相关Bean文件
--配置controller,由Spring来管理controller,前台通过name指定的值来访问相应的controller因为ID不支持/,后面actin要和servlet中配置的后置相同-->
class="cn.it.mvc.controller.FirstController"name="/first.action"/> --配置框架提供的视图解析器,通过配置前缀和后缀规则来解析ModelAndView--> --用来配置前缀规则--> --用来配置后缀规则-->
1.1.4.案例1总结
●org.springframework.web.servlet.DispatcherServlet:
用来加载配置文件(DispatcherServlet.properties)的前端控制器,此类在项目启动的时候初始化,约定大于配置的契约式编程支持的保证,
●org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping:
处理URL映射的核心类,根据Bean的name请求一个Bean,此URL处理器是默认配置.
●org.springframework.web.servlet.view.InternalResourceView:
处理视图资源的核心类,觉定字符串返回哪一个视图资源
●SpringMVC执行流程如下:
1.2.处理器映射
通过处理器映射,可以将web请求映射到正确的处理器(handler)上.Spring内置了很多处理器映射策略,例如:
SimpleUrlHandlerMapping或者BeanNameUrlHandlerMapping
1.2.1.BeanNameUrlHandlerMapping(缺省)
BeanNameUrlHandlerMapping是一个简单但很强大的处理器映射,它将收到的HTTP请求映射到bean的名称(这些bean需要在web应用上下文中定义),
--配置处理器映射类型,默认请求会映射到bean的name属性中-->
要使用BeanNameUrlHandlerMapping,无须(如上所示)在web应用上下文中定义它。
缺省情况下,如果在上下文中没有找到处理器映射,DispatcherServlet会为你创建一个BeanNameUrlHandlerMapping
1.2.2.SimpleUrlHandlerMapping
另一个更加强大的处理器映射是SimpleUrlHandlerMapping。
它在应用上下文中可以进行配置,通过与Action的ID捆绑
--简单URL处理器映射,多个名称可以到相同的Action中让访问的名称与具体的ID捆绑-->
--通过源码可以看出希望接受的是properties类型-->
--firscontroller为ControllerID-->
1.3.视图解析器(ViewResolver)
1.3.1.UrlBasedViewResolver
SpringWeb框架的所有控制器都返回一个ModelAndView实例.Sprnig中的视图以名字为标识,视图解析器通过名字来解析视图。
Spring提供了多种视图解析器,当使用JSP作为视图层技术时,就可以使用UrlBasedViewResolver。
这个视图解析器会将视图名解析成URL,并将请求传递给RequestDispatcher来显示视图
ViewResolver和View是Spring的视图处理方式中特别重要的两个接口。
ViewResolver提供了从视图名称到实际视图的映射。
View处理请求的准备工作,并将该请求提交给某种具体的视图技术
--解析视图的映射策略,ViewClass:
是用来指定解析视图的工具类-->
--viewClass不同的配置,可以解析不同的资源-->
name="viewClass"value="org.springframework.web.servlet.view.JstlView"/> 1.3.2.InternalResourceViewResolver 作为UrlBasedViewResolver的子类,它支持InternalResourceView(对Servlet和JSP的包装),以及其子类JstlView和TilesView。 通过setViewClass方法,可以指定用于该解析器生成视图使用的视图类 --视图解析器,用来解析model中的view部分--> 当返回的视图名为test时,这个视图解析器将请求传递给RequestDispatcher,RequestDispatcher再将请求传递给/WEB-INF/jsp/test.jsp。 1.3.3.Redirect: 前缀 尽管使用RedirectView帮我们达到了目的,但是如果控制器生成RedirectView的话,控制器不可避免地要知道某个请求的结果是让用户重定向到另一个页面。 这不是最佳的实现,因为这使得系统不同模块之间结合得过于紧密。 其实控制器不应该过问返回结果是如何生成的,通常情况下,它应该只关心注入给它的视图名称 解决上述问题的方法是依靠redirect: 前缀。 如果返回的视图名包含redirect: 前缀,UrlBasedViewResolver(以及它的子类)会知道系统要生成一个HTTPredirect。 视图名其余的部分会被当作重定向URL 这样做的最终结果跟控制器返回RedirectView是一样的,但现在控制器只需要和逻辑上的视图名打交道 returnnewModelAndView("redirect: /index.jsp"); 1.3.4.Forward: 前缀 我们也可以使用包含有forward: 前缀的视图名。 这些视图名会被UrlBasedViewResolver和它的子类正确解析.解析的内部实现是生成一个InternalResourceView,这个视图最终会调用RequestDispatcher.forward()方法,将forward视图名的其余部分作为URL returnnewModelAndView("forward: /index.jsp"); 1.4.控制器介绍 1.4.1.Controller接口介绍 控制器的概念是MVC设计模式的一部分,确切地说,是MVC中的C应用程序的行为通常被定义为服务接口,而控制器使得用户可以访问应用所提供的服务。 控制器解析用户输入,并将其转换成合理的模型数据,从而可以进一步由视图展示给用户。 Spring以一种抽象的方式实现了控制器概念,这样可以支持不同类型的控制器。 Spring本身包含表单控制器、命令控制器、向导型控制器等多种多样的控制器。 Spring控制器架构的基础是org.springframework.mvc.Controller接口,其代码如下 publicinterfaceController{ /** *@paramrequestcurrentHTTPrequest *@paramresponsecurrentHTTPresponse *@returnaModelAndViewtorender,or *@throwsExceptionincaseoferrors */ ModelAndViewhandleRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsException; } 虽然Controller接口是完全抽象的,但Spring也提供了许多你可能会用到的控制器。 Controller接口仅仅定义了每个控制器都必须提供的基本功能: 处理请求并返回一个模型和一个视图 1.4.2.AbstractCommandController AbstractCommandController可以使用该抽象命令控制器来创建自己的命令控制器,它能够将请求参数绑定到指定的命令对象。 这个类并不提供任何表单功能,但是它提供验证功能,并且让你在控制器中去实现如何处理由请求参数值产生的命令对象 /** *它能够将请求参数绑定到指定的命令对象 */ @SuppressWarnings("deprecation") publicclassCommandControllerextendsAbstractCommandController{ publicCommandController(){ //指定要绑定的类型 this.setCommandClass(Student.class); } @Override protectedModelAndViewhandle(HttpServletRequestrequest, HttpServletResponseresponse,Objectcommand,BindExceptionerrors) throwsException{ //输入的数据为,必须转化为指定的类型 Studentstudent=(Student)command; System.out.println("id="+student.getId()); System.out.println("name="+student.getName()); //Spring提供了ModelMap类型,用来存储参数,默认的范围是Request ModelMapmodelMap=newModelMap(); //把数据存储到modelMap中 modelMap.addAttribute("student",student); //页面可以通过${requestScope.student.id}获取数据 returnnewModelAndView("result",modelMap); } } 也可以通过配置文件注入类型(推荐使用) class="cn.it.controller.CommandController"name="/command.action"> AbstractCommandController,已经是过时的类了,在它的源码中有如下的描述 @deprecatedasofSpring3.0,infavorofannotatedcontrollers 1.5.基于注解MVC实现 只有对应的HandlerMapping(为了实现类型级别的注解)和/或HandlerAdapter(为了实现方法级别的注解)出现在dispatcher中时,@RequestMapping才会被处理,所以要修改默认的HandlerMapping,修改为如下配置: 1.5.1.AnnotationHandler 1.5.2.@RequestMapping /** *基于注解的控制器实现(此方式推荐) */ @RequestMapping(value="/annotion") publicclassAnnotationControll{ publicAnnotationControll(){ System.out.println("----AnnotationControll----"); } /* *可以通过三种方式接收: 属性对应,与对象的属性对应,直接通过request对象获取 *如果属性的值与前面的不同可以采用@RequestParam注解来匹配 **/ @RequestMapping(value="/demo") publicStringdemo01(@RequestParam(value="id")intsid,Stringname,Studentstudent,HttpServletRequestrequest){ System.out.println("id="+sid+",name="+name); System.out.println("id="+student.getId()+",name="+student.getName()); System.out.println("id="+request.getParameter("id")+",name="+request.getParameter("name")); return"forward: /WEB-INF/jsp/result.jsp";//等同于returnresult; } } 1.5.3.mvc: annotation-driven 注意: 在Spring3.0可以采用注解的方式取代 DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter annotation-driven/> 1.6.优化部分 1.6.1.@SessionAttributes Spring2.0定义了一个org.springframework.ui.ModelMap类,它作为通用的模型数据承载对象,传递数据供视图所用。 我们可以在请求处理方法中声明一个ModelMap类型的入参,Spring会将本次请求模型对象引用通过该入参传递进来,这样就可以在请求处理方法内部访问模型对象了在默认情况下,ModelMap中的属性作用域是request级别是,也就是说,当本次请求结束后,ModelMap中的属性将销毁 如果请求是会话属性,即在处理类定义处标注了@SessionAttributes("xxx"),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。 如果在会话中找不到对应的属性,则抛出HttpSessionRequiredException异常 org.springframework.web.HttpSessionRequiredException: Sessionattribute'user'required-notfoundinsession... @SessionAttributes(value={"student"})和 @SessionAttributes(type={Student.class})出现此异常,都可以通过如下方式解决: @ModelAttribute("student")//sessionScope.student来显示 publicStudentgetUser(){ Studentstudent=newStudent(); returnstudent; } 1.6.null
ifhandleddirectly
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SpringMVC 分解