- 浏览: 21436222 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2405433
-
Spring杂谈
浏览量:2998014
-
跟开涛学SpringMVC...
浏览量:5631694
-
Servlet3.1规范翻...
浏览量:257621
-
springmvc杂谈
浏览量:1593291
-
hibernate杂谈
浏览量:249005
-
跟我学Shiro
浏览量:5847845
-
跟我学Nginx+Lua开...
浏览量:698248
-
亿级流量网站架构核心技术
浏览量:780591
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
4.5、ServletForwardingController
将接收到的请求转发到一个命名的servlet,具体示例如下:
package cn.javass.chapter4.web.servlet; public class ForwardingServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("Controller forward to Servlet"); } }
<servlet> <servlet-name>forwarding</servlet-name> <servlet-class>cn.javass.chapter4.web.servlet.ForwardingServlet</servlet-class> </servlet>
<!— 在chapter4-servlet.xml配置处理器 --> <bean name="/forwardToServlet" class="org.springframework.web.servlet.mvc.ServletForwardingController"> <property name="servletName" value="forwarding"></property> </bean>
当我们请求/forwardToServlet时,会被转发到名字为“forwarding”的servlet处理,该sevlet的servlet-mapping标签配置是可选的。
4.6、BaseCommandController
命令控制器通用基类,提供了以下功能支持:
1、数据绑定:请求参数绑定到一个command object(命令对象,非GoF里的命令设计模式),这里的命令对象是指绑定请求参数的任何POJO对象;
commandClass:表示命令对象实现类,如UserModel;
commandName:表示放入请求的命令对象名字(默认command),request.setAttribute(commandName, commandObject);
2、验证功能:提供Validator注册功能,注册的验证器会验证命令对象属性数据是否合法;
validators:通过该属性注入验证器,验证器用来验证命令对象属性是否合法;
该抽象类没有没有提供流程功能,只是提供了一些公共的功能,实际使用时需要使用它的子类。
4.7、AbstractCommandController
命令控制器之一,可以实现该控制器来创建命令控制器,该控制器能把自动封装请求参数到一个命令对象,而且提供了验证功能。
1、创建命令类(就是普通的JavaBean类/POJO)
package cn.javass.chapter4.model; public class UserModel { private String username; private String password; //省略setter/getter }
2、实现控制器
package cn.javass.chapter4.web.controller; //省略import public class MyAbstractCommandController extends AbstractCommandController { public MyAbstractCommandController() { //设置命令对象实现类 setCommandClass(UserModel.class); } @Override protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception { //将命令对象转换为实际类型 UserModel user = (UserModel) command; ModelAndView mv = new ModelAndView(); mv.setViewName("abstractCommand"); mv.addObject("user", user); return mv; } }
<!— 在chapter4-servlet.xml配置处理器 --> <bean name="/abstractCommand" class="cn.javass.chapter4.web.controller.MyAbstractCommandController"> <!-- 也可以通过依赖注入 注入命令实现类 --> <!-- property name="commandClass" value="cn.javass.chapter4.model.UserModel"/--> </bean>
<!— WEB-INF/jsp/abstractCommand.jsp视图下的主要内容 --> ${user.username }-${user.password }
当我们在浏览器中输入“http://localhost:9080/springmvc-chapter4/abstractCommand?username=123&password=123”,会自动将请求参数username和password绑定到命令对象;绑定时按照JavaBean命名规范绑定;
4.8、AbstractFormController
用于支持带步骤的表单提交的命令控制器基类,使用该控制器可以完成:
1、定义表单处理(表单的渲染),并从控制器获取命令对象构建表单;
2、提交表单处理,当用户提交表单内容后,AbstractFormController可以将用户请求的数据绑定到命令对象,并可以验证表单内容、对命令对象进行处理。
@Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { //1、是否是表单提交? 该方法实现为("POST".equals(request.getMethod())),即POST表示表单提交 if (isFormSubmission(request)) { try { Object command = getCommand(request); ServletRequestDataBinder binder = bindAndValidate(request, command); BindException errors = new BindException(binder.getBindingResult()); //表单提交应该放到该方法实现 return processFormSubmission(request, response, command, errors); } catch (HttpSessionRequiredException ex) { //省略部分代码 return handleInvalidSubmit(request, response); } } else { //2、表示是表单展示,该方法又转调showForm方法,因此我们需要覆盖showForm来完成表单展示 return showNewForm(request, response); } }
bindOnNewForm:是否在进行表单展示时绑定请求参数到表单对象,默认false,不绑定;
sessionForm:session表单模式,如果开启(true)则会将表单对象放置到session中,从而可以跨越多次请求保证数据不丢失(多步骤表单常使用该方式,详解AbstractWizardFormController),默认false;
Object formBackingObject(HttpServletRequest request) :提供给表单展示时使用的表单对象(form object表单要展示的默认数据),默认通过commandName暴露到请求给展示表单;
Map referenceData(HttpServletRequest request, Object command, Errors errors):展示表单时需要的一些引用数据(比如用户注册,可能需要选择工作地点,这些数据可以通过该方法提供),如:
protected Map referenceData(HttpServletRequest request) throws Exception { Map model = new HashMap(); model.put("cityList", cityList); return model; }
这样就可以在表单展示页面获取cityList数据。
SimpleFormController继承该类,而且提供了更简单的表单流程控制。
4.9、SimpleFormController
提供了更好的两步表单支持:
1、准备要展示的数据,并到表单展示页面;
2、提交数据数据进行处理。
第一步,展示:
第二步,提交表单:
接下来咱们写一个用户注册的例子学习一下:
(1、控制器
package cn.javass.chapter4.web.controller; //省略import public class RegisterSimpleFormController extends SimpleFormController { public RegisterSimpleFormController() { setCommandClass(UserModel.class); //设置命令对象实现类 setCommandName("user");//设置命令对象的名字 } //form object 表单对象,提供展示表单时的表单数据(使用commandName放入请求) protected Object formBackingObject(HttpServletRequest request) throws Exception { UserModel user = new UserModel(); user.setUsername("请输入用户名"); return user; } //提供展示表单时需要的一些其他数据 protected Map referenceData(HttpServletRequest request) throws Exception { Map map = new HashMap(); map.put("cityList", Arrays.asList("山东", "北京", "上海")); return map; } protected void doSubmitAction(Object command) throws Exception { UserModel user = (UserModel) command; //TODO 调用业务对象处理 System.out.println(user); } }
setCommandClass和setCommandName:分别设置了命令对象的实现类和名字;
formBackingObject和referenceData:提供了表单展示需要的视图;
doSubmitAction:用于执行表单提交动作,由onSubmit方法调用,如果不需要请求/响应对象或进行数据验证,可以直接使用doSubmitAction方法进行功能处理。
(2、spring配置(chapter4-servlet.xml)
<bean name="/simpleForm" class="cn.javass.chapter4.web.controller.RegisterSimpleFormController"> <property name="formView" value="register"/> <property name="successView" value="redirect:/success"/> </bean> <bean name="/success" class="cn.javass.chapter4.web.controller.SuccessController"/>
formView:表示展示表单时显示的页面;
successView:表示处理成功时显示的页面;“redirect:/success”表示成功处理后重定向到/success控制器;防止表单重复提交;
“/success” bean的作用是显示成功页面,此处就不列举了。
(3、视图页面
<!-- register.jsp 注册展示页面--> <form method="post"> username:<input type="text" name="username" value="${user.username}"><br/> password:<input type="password" name="username"><br/> city:<select> <c:forEach items="${cityList }" var="city"> <option>${city}</option> </c:forEach> </select><br/> <input type="submit" value="注册"/> </form>
此处可以使用${user.username}获取到formBackingObject设置的表单对象、使用${cityList}获取referenceData设置的表单支持数据;
到此一个简单的两步表单到此结束,但这个表单有重复提交表单的问题,而且表单对象到页面的绑定是通过手工绑定的,后边我们会学习spring标签库(提供自动绑定表单对象到页面)。
4.10、CancellableFormController
一个可取消的表单控制器,继承SimpleFormController,额外提供取消表单功能。
1、表单展示:和SimpleFormController一样;
2、表单取消:和SimpleFormController一样;
3、表单成功提交:取消功能处理方法为:onCancel(Object command),而且默认返回cancelView属性指定的逻辑视图名。
那如何判断是取消呢?如果请求中有参数名为“_cancel”的参数,则表示表单取消。也可以通过cancelParamKey来修改参数名(如“_cancel.x”等)。
示例:
(1、控制器
复制RegisterSimpleFormController一份命名为CanCancelRegisterSimpleFormController,添加取消功能处理方法实现:
@Override protected ModelAndView onCancel(Object command) throws Exception { UserModel user = (UserModel) command; //TODO 调用业务对象处理 System.out.println(user); return super.onCancel(command); }
onCancel:在该功能方法内实现取消逻辑,父类的onCancel方法默认返回cancelView属性指定的逻辑视图名。
(2、spring配置(chapter4-servlet.xml)
<bean name="/canCancelForm" class="cn.javass.chapter4.web.controller.CanCancelRegisterSimpleFormController"> <property name="formView" value="register"/> <property name="successView" value="redirect:/success"/> <property name="cancelView" value="redirect:/cancel"/> </bean> <bean name="/cancel" class="cn.javass.chapter4.web.controller.CancelController"/>
cancelParamKey:用于判断是否是取消的请求参数名,默认是_cancel,即如果请求参数数据中含有名字_cancel则表示是取消,将调用onCancel功能处理方法;
cancelView:表示取消时时显示的页面;“redirect:/cancel”表示成功处理后重定向到/cancel控制器;防止表单重复提交;
“/cancel” bean的作用是显示取消页面,此处就不列举了(详见代码)。
(3、视图页面(修改register.jsp)
<input type="submit" name="_cancel" value="取消"/>
该提交按钮的作用是取消,因为name="_cancel",即请求后会有一个名字为_cancel的参数,因此会执行onCancel功能处理方法。
(4、测试:
在浏览器输入“http://localhost:9080/springmvc-chapter4/canCancelForm”,则首先到展示视图页面,点击“取消按钮”将重定向到“http://localhost:9080/springmvc-chapter4/cancel”,说明取消成功了。
实际项目可能会出现比如一些网站的完善个人资料都是多个页面(即多步),那应该怎么实现呢?接下来让我们看一下spring Web MVC提供的对多步表单的支持类AbstractWizardFormController。
私塾在线学习网原创内容(http://sishuok.com)
原创内容,转载请注明私塾在线【http://sishuok.com/forum/blogPost/list/5254.html】
评论
开涛讲的这些类,在spring4.0基本都是显示过期了,所以JAR包里面都没有了。
可以啊
应该是继承 CancellableFormController 重写 onCancel方法吧。
我自己写的例子继承SimpleFormController 也是不能重写 onCancel 方法。
警告: No mapping found for HTTP request with URI [/springmvc-chapter4/simpleForm] in DispatcherServlet with name 'chapter4'
上网查过提示说可能web.xml里servlet醒置可能出现问题,但是改过很多方式都不行,不知道为什么?我的web.xml的醒置如下:
<servlet>
<servlet-name>chapter4</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/chapter4-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>chapter4</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
把代码站内信我 看下吧
警告: No mapping found for HTTP request with URI [/springmvc-chapter4/simpleForm] in DispatcherServlet with name 'chapter4'
上网查过提示说可能web.xml里servlet醒置可能出现问题,但是改过很多方式都不行,不知道为什么?我的web.xml的醒置如下:
<servlet>
<servlet-name>chapter4</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/chapter4-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>chapter4</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
可以啊
http://jinnianshilongnian.iteye.com/blog/1423971
非常感谢,对了,我真的好奇怪,我把你的项目导入,都有一个红色的x在项目名那里,但是下面就是没有提示哪出错。在tomcat也跑不起来。
都有一个红色的x在项目名那里 这个是eclipse验证如jsp等的问题,可以再validate下看看; 还可能是Java Build Path设置的问题
2、在tomcat也跑不起来 上异常
http://jinnianshilongnian.iteye.com/blog/1423971
非常感谢,对了,我真的好奇怪,我把你的项目导入,都有一个红色的x在项目名那里,但是下面就是没有提示哪出错。在tomcat也跑不起来。
http://jinnianshilongnian.iteye.com/blog/1423971
直接看注解部分
提供了什么新的操作方式啊?能简单说明下,或者有相关文章链接发下么?
注解方式 你到第六章看看
提供了什么新的操作方式啊?能简单说明下,或者有相关文章链接发下么?
发表评论
-
跟我学SpringMVC目录汇总贴、PDF下载、源码下载
2012-12-22 08:05 619332扫一扫,关注我的公众号 购买地址 ... -
源代码下载——第七章 注解式控制器的数据验证、类型转换及格式化
2012-12-01 07:12 33365源代码请到附件中下载。 其他下载: ... -
SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-23 07:47 2382647.4、数据验证 7.4.1 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 19:18 887547.3、数据格式化 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 16:41 46支持一下博主:------------------ ... -
SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-12 20:08 1230007.1、简介 在编写可 ... -
扩展SpringMVC以支持绑定JSON格式的请求参数
2012-11-08 07:43 125883上一篇:《扩展SpringMVC以支持更精准的数据绑 ... -
扩展SpringMVC以支持更精准的数据绑定1
2012-11-06 07:38 76514最新版请点击查看FormM ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-26 07:57 1525856.6.2、@RequestParam绑定单个请求参 ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-23 14:45 15---------------------------- ... -
SpringMVC强大的数据绑定(1)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-16 07:48 120839到目前为止,请求已经能交给我们的处理器进行处理了,接下来 ... -
Spring MVC 3.1新特性 生产者、消费者请求限定 —— 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-10 14:16 483586.6.5、生产者、消费者限定 6.6.5.1、基 ... -
SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 15:29 104627声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:50 946.5.1.1、普通URL路径映射 @Request ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:48 536.5.2、请求方法映射 ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 10:47 216.5.2、请求方法映射限定 一般我们熟悉的表单 ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 07:05 1636.5.1.1、普通URL路径映射 @Reques ... -
源代码下载 第六章 注解式控制器详解
2012-09-22 07:11 41846源代码请到附件中下载。 其他下载: 跟着 ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 17:47 67232声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 15:54 96.1、注解式控制器简介 一、Spring2. ...
相关推荐
NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1679570
跟着开涛学SpringMVC,很好的MVC教程,简单易懂,PDF高清版本
PDF,源代码 开涛学SpringMVC 第一章源...第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化
跟开涛学springmvc pdf电子文档版 适合学习springmvc 非常好的教程
第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第...
跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC
第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 ...
第四章 Controller接口控制器详解(2).pdf 第四章 Controller接口控制器详解(3).pdf 第四章 Controller接口控制器详解 (4).pdf 第四章 Controller接口控制器详解 (5).pdf 第四章 Controller接口控制器详解 ...
跟开涛学SpringMVC-高清版,找了好久的,分享给大家。
Spring MVC学习(四)-------Controller接口控制器详解1
跟开涛学SpringMVC(4.6)Controller接口控制器详解(6)Java开发Java经验技巧共10页.pdf.zip
跟开涛学SpringMVC源代码汇总
跟开涛学SpringMVC 高清 带书签 pdf 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以...
跟开涛学SpringMVC(4.3)Controller接口控制器详解(3)Java开发Java经验技巧共9页.pdf.zip
开涛写的中文springmvc开发文档 , 初学者可以下载学习,或者当做字典用。
跟开涛学习springmvc spring 3 pdf ,非常好的资料。我将原文档的spring合并为一份,查看更方便一些。
跟开涛学SpringMVC(5)处理器拦截器详解Java开发Java经验技巧共13页.pdf.zip
SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行...应用控制器其实拆为处理器映射器(HandlerMapping)进行处理器管理和视图解析器(ViewResolv