1、/bean.通过参数控制器访问页面流程解析:也可以直接在参数控制器里定义name属性,直接通过name属性地址来访问。如下: name=/mmmm.do但要注意的是:配置文件里必须有BeanNameUrlHandlerMapping;如果配置了其他映射的情况下,默认映射将会被覆盖;以name属性;来访问将会失败。 命令控制器.创建自定义命令控制器接收url传递过来的参数并封装到javabean。public class MyCommandController extends AbstractCommandController protected ModelAndView handle(Http
2、ServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception User u = (User) command; System.out.println(u.getUserName()+|+u.getPassword(); return new ModelAndView(,user,u); .创建javabean类public class User private Integer id;private String userName;priva
3、te String password;private Integer age;public Integer getId() return id;public void setId(Integer id) this.id = id;public String getUserName() return userName;public void setUserName(String userName) this.userName = userName;public String getPassword() return password;public void setPassword(String
4、password) this.password = password;public Integer getAge() return age;public void setAge(Integer age) this.age = age;.在springmvc里面有如下配置。comm/comm.docn.itcast.controller.MyCommandController commandClasscn.itcast.domain.User.使用简单url进行访问,参数被封装进javabean。http:/localhost:8080/mysm/comm.do?id=1&userName=zh
5、angsan&password=123&age=13.首先:springMVC有三个映射器,如果不定义映射Mapping,那么就会使默认: org.springframework.web.servlet.handler.SimpleUrlHandlerMapping prop key=/hello1.dotestController/a.do/props org.springframework.web.servlet.view.InternalResourceViewResolverprefix/WEB-INF/jsp/suffix.jsp 第三个Mapping:org.springframe
6、work.web.servlet.mvc.support.ControllerClassNameHandlerMapping这个Mapping一配置:我们就可以使用Contrller的 类名.do来访问这个Controller.访问形式如下:8080/myspringmvc/testController.do或者8080/myspringmvc/testController这样的形式都可访问到index页面。 也可以在前台传入参数:8080/myspringmvc/testController1.do?name=hhhh在后台接收如下:String name = req.getParamete
7、r(name); System.out.println(这里是springmvc!,name);在页面使用EL表达式获取值。1. SpringMvc的三个控制器。 命令控制器CommandController(命令控制器)public class MyCommandController extends AbstractCommandController public MyCommandController() this.setCommandClass(User.class); this.setCommandName( Override / TODO Auto-generated method
8、stub System.out.println(u.getName();command- 命令控制器 -bean name=/command.do页面就可以采用如下方式进行获取: return null;配置文件:bean name=说明:在domain包里面定义User类:并为User的name,sex,age属性生成setter,Getter方法。当我们使用:command.do访问时,使用get请求:?name=oo&sex=man&age=17后台继承AbstractCommandController这个类的命令控制器将会自动获取并封装这个三个值。并放入command。 表单控制器Fo
9、rmController(表单控制器)public class MyFormContrller extends SimpleFormController public MyFormContrller() / TODO Auto-generated constructor stub protected void doSubmitAction(Object command) throws Exception System.out.println(u.getName()+kkkooo super.doSubmitAction(command);- 表单控制器 -/form.docn.itcast.c
10、ontroller.MyFormContrllersuccessViewsuccessformViewform24.2.4AbstractWizardFormController(1)在使用Eclipse或者Netbeans之类的IDE进行开发的时候,如果我们新建一个工程或者文件,这些IDE通常都会提供多步的向导帮助我们一步一步完成相应部件的创建。在某些Web应用程序中,也存在类似的操作场景,比如,要注册某个网站的会员,注册过程可能就包括多步,每一步会提示输入某一方面的信息,以帮助我们简化操作流程。对于这种向导式的简单的多页面流程实现,我们可以求助于AbstractWizardFormCont
11、roller,它可以帮助我们简化类似场景的开发工作。注意实际上,AbstractWizardFormController也只是面向简单的多页面流程处理,它所管理的多个页面表单中的数据,最终都是绑定到一个Command对象上的。只不过是每个页面绑定一部分而已。如果要在Web应用程序中处理更复杂的页面流程交互,建议集成Spring Web Flow(http:/www.springframework.org/Webflow),Expert Spring MVC and Web Flow一书对Spring Web Flow进行了详尽的介绍。1. AbstractWizardFormControlle
12、r浅析说白了,AbstractWizardFormController实现类就是要处理组成向导流程的所有页面所发起的Web请求。但与SimpleFormController处理单个表单页面不同,AbstractWizardFormController要管理多个表单页面的显示以及提交数据的处理工作。图24-12对AbstractWizardFormController如何管理整个向导流程给出了一个概况,我们对AbstractWizardFormController的认识将在这个的基础上展开。(点击查看大图)图24-12AbstractWizardFormController的Web请求处理结构P
13、age1、Page2和Page3是组成向导流程的页面,这些页面提交的Web请求将统一由我们的AbstractWizardFormController接收并处理。但AbstractWizardFormController如何知道当前该显示哪个页面?它又是如何判断哪个页面提交的请求是最终的结束向导流程的Web请求呢?AbstractWizardFormController将根据每个页面请求所包含的特定参数来决定如何对当前请求进行处理,这些特定的参数我们可以分为如下三类。PARAM_TARGET参数。PARAM_TARGET参数用于指定目标页面,它的形式为_target后缀页面索引,比如_targe
14、t0、_target1等。当AbstractWizardFormController实现类接收到这种类型的参数的时候,它只是将当前请求中的相应参数绑定到Command对象上,然后根据PARAM_TARGET参数后缀的目标页面索引显示相应的页面。PARAM_FINISH参数。PARAM_FINISH参数的表示形式为_finish。如果AbstractWizard- FormController实现类接收到该参数,则表示整个向导流程结束,可以调用process- Finish(.)方法处理最终的表单数据,并将页面转向任何一个想要转到的页面。PARAM_CANCEL参数。PARAM_CANCEL参数
15、的表示形式为_cancel。当接收到该参数的时候,表示用户要取消当前的向导流程。默认情况下,AbstractWizardFormController不支持该参数的处理,但我们可以通过覆写processCancel(.)方法来改变这种默认行为。唯一要做的,可能只是返回一个ModelAndView实例,其中只包含了一个逻辑视图名。实际上,AbstractWizardFormController实现类本质上依然是像SimpleFormController那样,分两个阶段来管理表单页面的处理,只不过是从逻辑上将单个表单页面划分为了多个表单页面,而最终绑定数据的Command对象却只有一个。Abstra
16、ctWizardFormController将根据_targetX参数决定显示表单页面的某一部分,对应到视图那就是显示哪个向导页面。在该向导页面提交请求之后,AbstractWizardFormController会把它显示并提交的那部分数据绑定到唯一的那个Command对象上,只有在所有向导页面都提交之后,Command对象的数据才算绑定完成。从这样的角度来说,AbstractWizardFormController只不过是将一部分信息划分为多步来显示和处理罢了。我们在向导(Wizard)最终结束的画面提交_finish参数之后,AbstractWizardFormController将从C
17、ommand对象获取到所有向导页面(Wizard Page)搜集来的数据,然后它就可以调用process- Finish(.)方法开始压轴戏了。实际上,在实现AbstractWizardFormController的时候,也只有processFinish(.)方法是需要我们必须去实现的。我想,以上的分析内容已经足以说明AbstractWizardFormController的底细。不过,如果你还意犹未尽的话,不妨再研读一下Expert Spring MVC and Web Flow一书。像如何提供数据验证,如何覆写某些方法以添加扩展逻辑之类的细节,该书都有提及。相信我,因为我已经读过了。2.
18、AbstractWizardFormController实例我搜刮了FX系统的前台和后台的所有场景,也没有找到一个需要向导的流程。所以,为了演示AbstractWizardFormController的使用,我也不能免俗,创造了一个调查问卷的场景。我们将分三步引导用户完成对购车意愿的问卷调查。当然,整个问卷调查看起来有些简单了,但如果需要,我们也可以在这个基础上提供更加友好、更加全面的问卷调查向导。为了分步显示调查的内容,我们提供了4个页面分别显示整体的某一部分内容,它们的关系如下所述。welcome.jsp。问卷调查向导的开始页面,提供简单的说明信息,如图24-13所示。carManufac
19、turers.jsp。该页面将提供汽车厂商信息列表供用户选择,如图24-14所示。(点击查看大图)图24-13webcome.jsp页面(点击查看大图)图24-14carManufacturers.jsp页面carPriceScope.jsp。向导流程中最后一个问卷调查页面,显示意愿购车价格区间,点击结束问卷提交按钮即结束当前问卷调查,见图24-15。(点击查看大图)图24-15carPriceScope.jsp页面surveyResult.jsp。确切地讲,该页面不能算向导的一部分,它只是调查结束后的一个结果显示页面,对应的是图24-12中的successView。当然,将具体数据转换为柱状
20、图显示或许更讨人爱一些,该页面最终效果如图24-16所示。现在让我们着手实现该向导流程。先来了解一下,几个重要的接口与类。现在不知道他们是干什么的没关系,先混个脸熟,为以后认识他们打个基础。DispatcherServlet - 前置控制器HandlerMapping接口 - 处理请求的映射HandlerMapping接口的实现类:SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到ControllerDefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上HandlerAdapter接口 - 处理请求的映
21、射AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上Controller接口 - 控制器由于我们使用了Controller注解,添加了Controller注解注解的类就可以担任控制器(Action)的职责,所以我们并没有用到这个接口。HandlerInterceptor 接口-拦截器无图,我们自己实现这个接口,来完成拦截的器的工作。ViewResolver接口的实现类UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理InternalResourceViewResolver类,比上
22、面的类,加入了JSTL的支持View接口JstlView类LocalResolver接口HandlerExceptionResolver接口 -异常处理SimpleMappingExceptionResolver实现类ModelAndView类无图。三、核心流程图四、DispatcherServlet说明使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。“某某规则”:是根据你使用了
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1