SpringMVC学习笔记.docx
《SpringMVC学习笔记.docx》由会员分享,可在线阅读,更多相关《SpringMVC学习笔记.docx(56页珍藏版)》请在冰豆网上搜索。
![SpringMVC学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/27/8644025b-4cf2-46c1-ba60-6c5f7f47eca4/8644025b-4cf2-46c1-ba60-6c5f7f47eca41.gif)
SpringMVC学习笔记
SpringMVC学习笔记
作者:
胡晟源。
QQ:
1312837781
配置spring提示:
1SpringToolSuit(STS)
2HibernateTools
对于JUNO版本的Eclipse可以在help->EclipseMarketplace 输入插件的名字在列表中选择插件安装就可以了。
SpringMvc原理图解:
导入jar包
一:
springmvc工作流程。
1.servlet容器初始化一个request请求
2.DispatcherServlet分发器负责发送请求到映射器.
3.despatcherServlet把请求交给处理器映射Mapping,mapping来寻找需要执行的control
4.处理器映射把请求分发给控制器Controler。
5.Controler执行完毕后返回ModelAndView(视图解析器)
6.把ModelAndView返回给dispatcherServlet核心分发器
7.由于DespatcherServlet不参与具体的处理,所以把modelAndView交给视图解析器。
8.视图解析器解析成一个真正的视图,再发给view然后response。
ØParameterizableViewController(参数控制器)
①.在springmvc-servlet.xml里面加上配置
②.通过参数控制器访问页面流程
解析:
也可以直接在参数控制器里定义name属性,直接通过name属性地址来访问。
如下:
但要注意的是:
配置文件里必须有BeanNameUrlHandlerMapping;如果配置了其他映射的情况下,默认映射将会被覆盖;以name属性;来访问将会失败。
Ø命令控制器
①.创建自定义命令控制器接收url传递过来的参数并封装到javabean。
publicclassMyCommandControllerextendsAbstractCommandController{
protectedModelAndViewhandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objectcommand,BindExceptionerrors)
throwsException{
Useru=(User)command;System.out.println(u.getUserName()+"||"+u.getPassword());
returnnewModelAndView("index","user",u);
}
}
②.创建javabean类
publicclassUser{
privateIntegerid;
privateStringuserName;
privateStringpassword;
privateIntegerage;
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicIntegergetAge(){
returnage;
}
publicvoidsetAge(Integerage){
this.age=age;
}
}
③.在springmvc里面有如下配置。
④.使用简单url进行访问,参数被封装进javabean。
http:
//localhost:
8080/mysm/comm.do?
id=1&userName=zhangsan&password=123&age=13
Ø命令控制器
①.
首先:
springMVC有三个映射器,如果不定义映射Mapping,那么就会使默认:
●
也就是说:
上面这个定义和不定义都是一样的。
不定义:
直接使用:
hello.do来访问。
--简单的url映射处理器-->
●
testController
testController
那么上面的这个映射配置:
表示多个*.do文件可以访问多个Controller或者一个Controller。
前提是:
都必须依赖:
--/WEB-INF/jsp/index.jsp-->
●第三个Mapping:
这个Mapping一配置:
我们就可以使用Contrller的[类名.do]来访问这个Controller.
访问形式如下:
http:
//localhost:
8080/myspringmvc/testController.do
或者
http:
//localhost:
8080/myspringmvc/testController
这样的形式都可访问到index页面。
也可以在前台传入参数:
http:
//localhost:
8080/myspringmvc/testController1.do?
name=hhhh
在后台接收如下:
Stringname=req.getParameter("name");
System.out.println("这里是springmvc!
");
returnnewModelAndView("index","name",name);
在页面使用EL表达式获取值。
1.SpringMvc的三个控制器。
●命令控制器CommandController(命令控制器)
publicclassMyCommandControllerextendsAbstractCommandController{
publicMyCommandController(){
this.setCommandClass(User.class);
this.setCommandName("user");
}
@Override
protectedModelAndViewhandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objectcommand,BindExceptionerrors)
throwsException{
//TODOAuto-generatedmethodstub
Useru=(User)command;
System.out.println(u.getName());
returnnewModelAndView("command","user",u);
}
}
--命令控制器-->
name="/command.do"class="cn.itcast.controller.MyCommandController">
页面就可以采用如下方式进行获取:
publicclassMyCommandControllerextendsAbstractCommandController{
publicMyCommandController(){
this.setCommandClass(User.class);
this.setCommandName("user");
}
@Override
protectedModelAndViewhandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objectcommand,BindExceptionerrors)
throwsException{
//TODOAuto-generatedmethodstub
Useru=(User)command;
System.out.println(u.getName());
returnnull;
}
}
配置文件:
说明:
在domain包里面定义User类:
并为User的name,sex,age属性生成setter,
Getter方法。
当我们使用:
command.do访问时,使用get请求:
?
name=oo&sex=man&age=17
后台继承AbstractCommandController这个类的命令控制器将会自动
获取并封装这个三个值。
并放入command。
●表单控制器FormController(表单控制器)
publicclassMyFormContrllerextendsSimpleFormController{
publicMyFormContrller(){
//TODOAuto-generatedconstructorstub
this.setCommandClass(User.class);
this.setCommandName("user");
}
@Override
protectedvoiddoSubmitAction(Objectcommand)throwsException{
//TODOAuto-generatedmethodstub
Useru=(User)command;
System.out.println(u.getName()+"kkkooo");
super.doSubmitAction(command);
}
}
--表单控制器-->
⏹NomappingfoundforHTTPrequestwithURI[/ssm/WEB-INF/jsp/index.jsp]inDispatcherServletwithname'dispacherServlet'
解析:
这个错误是由于配置文件url-pattern出错,/*需要改为/就ok。
24.2.4 AbstractWizardFormController
(1)
在使用Eclipse或者Netbeans之类的IDE进行开发的时候,如果我们新建一个工程或者文件,这些IDE通常都会提供多步的向导帮助我们一步一步完成相应部件的创建。
在某些Web应用程序中,也存在类似的操作场景,比如,要注册某个网站的会员,注册过程可能就包括多步,每一步会提示输入某一方面的信息,以帮助我们简化操作流程。
对于这种向导式的简单的多页面流程实现,我们可以求助于AbstractWizardFormController,它可以帮助我们简化类似场景的开发工作。
注意 实际上,AbstractWizardFormController也只是面向简单的多页面流程处理,它所管理的多个页面表单中的数据,最终都是绑定到一个Command对象上的。
只不过是每个页面绑定一部分而已。
如果要在Web应用程序中处理更复杂的页面流程交互,建议集成SpringWebFlow(http:
// www.springframework.org/Webflow),ExpertSpringMVCandWebFlow一书对SpringWebFlow进行了详尽的介绍。
1.AbstractWizardFormController浅析
说白了,AbstractWizardFormController实现类就是要处理组成向导流程的所有页面所发起的Web请求。
但与SimpleFormController处理单个表单页面不同,AbstractWizardFormController要管理多个表单页面的显示以及提交数据的处理工作。
图24-12对AbstractWizardFormController如何管理整个向导流程给出了一个概况,我们对AbstractWizardFormController的认识将在这个的基础上展开。
(点击查看大图)图24-12 AbstractWizardFormController的Web请求处理结构
Page1、Page2和Page3是组成向导流程的页面,这些页面提交的Web请求将统一由我们的AbstractWizardFormController接收并处理。
但AbstractWizardFormController如何知道当前该显示哪个页面?
它又是如何判断哪个页面提交的请求是最终的结束向导流程的Web请求呢?
AbstractWizardFormController将根据每个页面请求所包含的特定参数来决定如何对当前请求进行处理,这些特定的参数我们可以分为如下三类。
PARAM_TARGET参数。
PARAM_TARGET参数用于指定目标页面,它的形式为_target后缀页面索引,比如_target0、_target1等。
当AbstractWizardFormController实现类接收到这种类型的参数的时候,它只是将当前请求中的相应参数绑定到Command对象上,然后根据PARAM_TARGET参数后缀的目标页面索引显示相应的页面。
PARAM_FINISH参数。
PARAM_FINISH参数的表示形式为_finish。
如果AbstractWizard-FormController实现类接收到该参数,则表示整个向导流程结束,可以调用process-Finish(..)方法处理最终的表单数据,并将页面转向任何一个想要转到的页面。
PARAM_CANCEL参数。
PARAM_CANCEL参数的表示形式为_cancel。
当接收到该参数的时候,表示用户要取消当前的向导流程。
默认情况下,AbstractWizardFormController不支持该参数的处理,但我们可以通过覆写processCancel(..)方法来改变这种默认行为。
唯一要做的,可能只是返回一个ModelAndView实例,其中只包含了一个逻辑视图名。
实际上,AbstractWizardFormController实现类本质上依然是像SimpleFormController那样,分两个阶段来管理表单页面的处理,只不过是从逻辑上将单个表单页面划分为了多个表单页面,而最终绑定数据的Command对象却只有一个。
AbstractWizardFormController将根据_targetX参数决定显示表单页面的某一部分,对应到视图那就是显示哪个向导页面。
在该向导页面提交请求之后,AbstractWizardFormController会把它显示并提交的那部分数据绑定到唯一的那个Command对象上,只有在所有向导页面都提交之后,Command对象的数据才算绑定完成。
从这样的角度来说,AbstractWizardFormController只不过是将一部分信息划分为多步来显示和处理罢了。
我们在向导(Wizard)最终结束的画面提交_finish参数之后,AbstractWizardFormController将从Command对象获取到所有向导页面(WizardPage)搜集来的数据,然后它就可以调用process-Finish(..)方法开始"压轴戏"了。
实际上,在实现AbstractWizardFormController的时候,也只有processFinish(..)方法是需要我们必须去实现的。
我想,以上的分析内容已经足以说明AbstractWizardFormController的底细。
不过,如果你还意犹未尽的话,不妨再研读一下ExpertSpringMVCandWebFlow一书。
像如何提供数据验证,如何覆写某些方法以添加扩展逻辑之类的细节,该书都有提及。
相信我,因为我已经读过了。
2.AbstractWizardFormController实例
我搜刮了FX系统的前台和后台的所有场景,也没有找到一个需要向导的流程。
所以,为了演示AbstractWizardFormController的使用,我也不能免俗,创造了一个调查问卷的场景。
我们将分三步引导用户完成对购车意愿的问卷调查。
当然,整个问卷调查看起来有些简单了,但如果需要,我们也可以在这个基础上提供更加友好、更加全面的问卷调查向导。
为了分步显示调查的内容,我们提供了4个页面分别显示整体的某一部分内容,它们的关系如下所述。
welcome.jsp。
问卷调查向导的开始页面,提供简单的说明信息,如图24-13所示。
carManufacturers.jsp。
该页面将提供汽车厂商信息列表供用户选择,如图24-14所示。
(点击查看大图)图24-13 webcome.jsp页面
(点击查看大图)图24-14 carManufacturers.jsp页面
carPriceScope.jsp。
向导流程中最后一个问卷调查页面,显示意愿购车价格区间,点击"结束问卷"提交按钮即结束当前问卷调查,见图24-15。
(点击查看大图)图24-15 carPriceScope.jsp页面
surveyResult.jsp。
确切地讲,该页面不能算向导的一部分,它只是调查结束后的一个结果显示页面,对应的是图24-12中的successView。
当然,将具体数据转换为柱状图显示或许更讨人爱一些,该页面最终效果如图24-16所示。
现在让我们着手实现该向导流程。
Ø深入探讨SpringMvc参数封装原理
SpringMVC中Controller的方法参数可以是Integer,Double,自定义对象,ServletRequest,ServletResponse,ModelAndView等等,非常灵活。
本文将分析SpringMVC是如何对这些参数进行处理的,使读者能够处理自定义的一些参数。
/*现象
本文使用的demo基于maven。
我们先来看一看对应的现象。
∙@RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。
该注解常用来处理Content-Type:
不是application/x-www-form-urlencoded编码的内容,例如application/json,application/xml等;它是通过使用HandlerAdapter配置的HttpMessageConverters来解析postdatabody,然后绑定到相应的bean上的。
因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap里,这种情况在某些特殊需求下使用
∙@ResponseBody 将内容或对象作为HTTP响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。
∙HttpMessageConverter接口,需要开启annotation-drive