- 浏览: 618185 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (228)
- io (15)
- cluster (16)
- linux (7)
- js (23)
- bizarrerie (46)
- groovy (1)
- thread (1)
- jsp (8)
- static (4)
- cache (3)
- protocol (2)
- ruby (11)
- hibernate (6)
- svn (1)
- python (8)
- spring (19)
- gma (1)
- architecture (4)
- search (15)
- db (3)
- ibatis (1)
- html5 (1)
- iptables (1)
- server (5)
- nginx (4)
- scala (1)
- DNS (1)
- jPlayer (1)
- Subversion 版本控制 (1)
- velocity (1)
- html (1)
- ppt poi (1)
- java (1)
- bizarrerie spring security (1)
最新评论
-
koreajapan03:
楼主啊,好人啊,帮我解决了问题,谢谢
自定义过滤器时,不能再使用<sec:authorize url="">问题 -
snailprince:
请问有同一页面,多个上传实例的例子吗
webuploader用java实现上传 -
wutao8818:
姚小呵 写道如何接收server返回的参数呢?例如你返回的是“ ...
webuploader用java实现上传 -
姚小呵:
如何接收server返回的参数呢?例如你返回的是“1”,上传的 ...
webuploader用java实现上传 -
zycjf2009:
你好,我想用jplayer做一个简单的播放器,但是因为对js不 ...
jplayer 实战
重头开始学 Spring JPetStore 4 里面的Controller似乎太简单了一些。
让我们看一个更复杂一些的请求
看看注册页面
这里有一个表单需要提交。沿着这个请求 /shop/newAccount.do 找到对应的bean
我们可以看到这个控制器变成了AccountFormController。继续SimpleFormController 看看文档我们发现这个控制器就是一个为表单而生的。另外注入了一个petStore ,看看代码,我们就知道这是一个真实的业务层处理的类。还有一个验证器 :accountValidator
但是这个验证在哪?在另一个文件 applicationContext.xml 里。
以及 successView 一个view页面指向。
看看这个控制器最主要的方法吧。
protected ModelAndView onSubmit(
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception {
AccountForm accountForm = (AccountForm) command;
try {
if (accountForm.isNewAccount()) {
this.petStore.insertAccount(accountForm.getAccount());
}
else {
this.petStore.updateAccount(accountForm.getAccount());
}
}
catch (DataIntegrityViolationException ex) {
errors.rejectValue("account.username", "USER_ID_ALREADY_EXISTS",
"User ID already exists: choose a different ID.");
return showForm(request, response, errors);
}
UserSession userSession = new UserSession(this.petStore.getAccount(accountForm.getAccount().getUsername()));
PagedListHolder myList = new PagedListHolder(
this.petStore.getProductListByCategory(accountForm.getAccount().getFavouriteCategoryId()));
myList.setPageSize(4);
userSession.setMyList(myList);
request.getSession().setAttribute("userSession", userSession);
return super.onSubmit(request, response, command, errors);
}
有一点让人愉快的是这里的AccountForm似乎不需要像在struts中一样特别麻烦的配置一次。只要一句话就可以了,省力了。
AccountForm accountForm = (AccountForm) command;
保存的业务逻辑被petStore包起来了,所以直接调用就结束了。关键是异常处理
这里处理了一个重复用户名的异常。errors. rejectValue方法带了好几个参数。应该是国际化资源文件里的key,以及默认提示信息等内容,然后呢,然后调用了
这个方法应该是一个父类的方法。自动回填了表单的提交的数据?自己试试提交一个重复的用户名,页面是不是回填了?我试验了一下是这样的,完成的还算不错。
看看它是怎么实现这个工作的呢?这个页面到底在哪?让我们看看。
其中有一个 setFormView("EditAccountForm"); 知道了吧。就是EditAccountForm.jsp了。
找到它,看看。
页面开始就是这么一段。似乎是所有的accountForm的属性都被绑定到status这个变量了现在我还不确定。先留下这个问号?接下去再看看。起码我们通过el标签可以看出来status有个属性 errorMessages 。这个集合保存了所有的错误。JSTL c:forEach标签遍历了显示了所有的错误。
<!-- Support for Spring errors object -->
<spring:bind path="accountForm.*">
<c:forEach var="error" items="${status.errorMessages}">
<B><FONT color=RED> <BR> <c:out value="${error}" /> </FONT>
</B>
</c:forEach>
</spring:bind>
随便看一个input
<tr bgcolor="#FFFF88">
<td>
New password:
</td>
<td>
<spring:bind path="accountForm.account.password">
<input type="password"
name="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" />
</spring:bind>
</td>
</tr>
总是被一个<spring:bind 标签包裹着。name属性也被${status.expression}动态生成了。这样做似乎于前面提到的一个方便有关。 不需要像在struts中一样特别麻烦的配置一次AccountForm。只要一句话就可以了 猜得不错的话,应该是与这个很大的关系。
看到这个页面不怎么好。满页面的<spring:bind ,每个input都要。还真是烦。
这个控制器里面有一个方法 referenceData
Create a reference data map for the given request.
在AbstractFormController里面可以找到这个方法如何被调用的。合并到一个MAP里面了。
接下来干嘛了?
UserSession userSession = new UserSession(this.petStore.getAccount(accountForm.getAccount().getUsername()));
PagedListHolder myList = new PagedListHolder(
this.petStore.getProductListByCategory(accountForm.getAccount().getFavouriteCategoryId()));
myList.setPageSize(4);
userSession.setMyList(myList);
request.getSession().setAttribute("userSession", userSession);
return super.onSubmit(request, response, command, errors);
经过这个请求的跟踪,我发现spring mvc真的太灵活。以至于我都不知道什么地方该写哪些?没人告诉我必须实现
public AccountFormController() {
setSessionForm(true);
setValidateOnBinding(false);
setCommandName("accountForm");
setFormView("EditAccountForm");
}
里面的4个方法。如果我没写setFormView("EditAccountForm");应该不行。但是没有一个机制让我知道哪些是必须的。在这样的系统上写代码是不是有点走钢丝的感觉?
从代码的角度来看,它这样的实现无可厚非,但似乎对使用者不够友好 。
让我们看一个更复杂一些的请求
看看注册页面
引用
http://localhost:8080/jpetstore/shop/newAccount.do
这里有一个表单需要提交。沿着这个请求 /shop/newAccount.do 找到对应的bean
引用
<bean name="/shop/newAccount.do" class="org.springframework.samples.jpetstore.web.spring.AccountFormController">
<property name="petStore" ref="petStore"/>
<property name="validator" ref="accountValidator"/>
<property name="successView" value="index"/>
</bean>
<property name="petStore" ref="petStore"/>
<property name="validator" ref="accountValidator"/>
<property name="successView" value="index"/>
</bean>
我们可以看到这个控制器变成了AccountFormController。继续SimpleFormController 看看文档我们发现这个控制器就是一个为表单而生的。另外注入了一个petStore ,看看代码,我们就知道这是一个真实的业务层处理的类。还有一个验证器 :accountValidator
但是这个验证在哪?在另一个文件 applicationContext.xml 里。
引用
<!-- Generic validator for Account objects, to be used for example by the Spring web tier -->
<bean id="accountValidator" class="org.springframework.samples.jpetstore.domain.logic.AccountValidator"/>
<bean id="accountValidator" class="org.springframework.samples.jpetstore.domain.logic.AccountValidator"/>
以及 successView 一个view页面指向。
看看这个控制器最主要的方法吧。
引用
protected ModelAndView onSubmit(
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception {
AccountForm accountForm = (AccountForm) command;
try {
if (accountForm.isNewAccount()) {
this.petStore.insertAccount(accountForm.getAccount());
}
else {
this.petStore.updateAccount(accountForm.getAccount());
}
}
catch (DataIntegrityViolationException ex) {
errors.rejectValue("account.username", "USER_ID_ALREADY_EXISTS",
"User ID already exists: choose a different ID.");
return showForm(request, response, errors);
}
UserSession userSession = new UserSession(this.petStore.getAccount(accountForm.getAccount().getUsername()));
PagedListHolder myList = new PagedListHolder(
this.petStore.getProductListByCategory(accountForm.getAccount().getFavouriteCategoryId()));
myList.setPageSize(4);
userSession.setMyList(myList);
request.getSession().setAttribute("userSession", userSession);
return super.onSubmit(request, response, command, errors);
}
有一点让人愉快的是这里的AccountForm似乎不需要像在struts中一样特别麻烦的配置一次。只要一句话就可以了,省力了。
引用
AccountForm accountForm = (AccountForm) command;
引用
if (accountForm.isNewAccount()) {
this.petStore.insertAccount(accountForm.getAccount());
}
else {
this.petStore.updateAccount(accountForm.getAccount());
}
this.petStore.insertAccount(accountForm.getAccount());
}
else {
this.petStore.updateAccount(accountForm.getAccount());
}
保存的业务逻辑被petStore包起来了,所以直接调用就结束了。关键是异常处理
引用
catch (DataIntegrityViolationException ex) {
errors.rejectValue("account.username", "USER_ID_ALREADY_EXISTS",
"User ID already exists: choose a different ID.");
return showForm(request, response, errors);
}
errors.rejectValue("account.username", "USER_ID_ALREADY_EXISTS",
"User ID already exists: choose a different ID.");
return showForm(request, response, errors);
}
这里处理了一个重复用户名的异常。errors. rejectValue方法带了好几个参数。应该是国际化资源文件里的key,以及默认提示信息等内容,然后呢,然后调用了
引用
showForm(request, response, errors);
这个方法应该是一个父类的方法。自动回填了表单的提交的数据?自己试试提交一个重复的用户名,页面是不是回填了?我试验了一下是这样的,完成的还算不错。
看看它是怎么实现这个工作的呢?这个页面到底在哪?让我们看看。
引用
public AccountFormController() {
setSessionForm(true);
setValidateOnBinding(false);
setCommandName("accountForm");
setFormView("EditAccountForm");
}
setSessionForm(true);
setValidateOnBinding(false);
setCommandName("accountForm");
setFormView("EditAccountForm");
}
其中有一个 setFormView("EditAccountForm"); 知道了吧。就是EditAccountForm.jsp了。
找到它,看看。
页面开始就是这么一段。似乎是所有的accountForm的属性都被绑定到status这个变量了现在我还不确定。先留下这个问号?接下去再看看。起码我们通过el标签可以看出来status有个属性 errorMessages 。这个集合保存了所有的错误。JSTL c:forEach标签遍历了显示了所有的错误。
引用
<!-- Support for Spring errors object -->
<spring:bind path="accountForm.*">
<c:forEach var="error" items="${status.errorMessages}">
<B><FONT color=RED> <BR> <c:out value="${error}" /> </FONT>
</B>
</c:forEach>
</spring:bind>
随便看一个input
引用
<tr bgcolor="#FFFF88">
<td>
New password:
</td>
<td>
<spring:bind path="accountForm.account.password">
<input type="password"
name="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" />
</spring:bind>
</td>
</tr>
总是被一个<spring:bind 标签包裹着。name属性也被${status.expression}动态生成了。这样做似乎于前面提到的一个方便有关。 不需要像在struts中一样特别麻烦的配置一次AccountForm。只要一句话就可以了 猜得不错的话,应该是与这个很大的关系。
看到这个页面不怎么好。满页面的<spring:bind ,每个input都要。还真是烦。
这个控制器里面有一个方法 referenceData
Create a reference data map for the given request.
在AbstractFormController里面可以找到这个方法如何被调用的。合并到一个MAP里面了。
接下来干嘛了?
引用
UserSession userSession = new UserSession(this.petStore.getAccount(accountForm.getAccount().getUsername()));
PagedListHolder myList = new PagedListHolder(
this.petStore.getProductListByCategory(accountForm.getAccount().getFavouriteCategoryId()));
myList.setPageSize(4);
userSession.setMyList(myList);
request.getSession().setAttribute("userSession", userSession);
return super.onSubmit(request, response, command, errors);
引用
PagedListHolder
似乎是一个分页的类。没看到这个list在index.jsp页面有调用。他在哪里?不知道。
经过这个请求的跟踪,我发现spring mvc真的太灵活。以至于我都不知道什么地方该写哪些?没人告诉我必须实现
引用
public AccountFormController() {
setSessionForm(true);
setValidateOnBinding(false);
setCommandName("accountForm");
setFormView("EditAccountForm");
}
里面的4个方法。如果我没写setFormView("EditAccountForm");应该不行。但是没有一个机制让我知道哪些是必须的。在这样的系统上写代码是不是有点走钢丝的感觉?
从代码的角度来看,它这样的实现无可厚非,但似乎对使用者不够友好 。
发表评论
-
webuploader用java实现上传
2014-10-17 23:55 40784<div id="uploader&q ... -
springmvc,Servlet3异步,websocket
2014-10-17 22:58 1460spring4.0以后加入了对websocket技术的支持 ... -
SpringMVC中的文件上传【转发】
2014-09-19 21:54 1061http://blog.csdn.net/jadyer/art ... -
{转}spring security 3 自定义认证授权示例
2011-11-10 16:46 2326转:http://www.4ucode.com/Study/T ... -
用spring resource 接口获取 web应用的ROOT目录
2010-12-09 19:44 3185Resource r = new ClassPathResou ... -
springmvc 表单 @RequestMapping 上传文件
2010-06-04 18:08 6547@RequestMapping(method = Req ... -
ControllerClassNameHandlerMapping @Controller
2009-06-27 01:25 4449这里也提到这个问题 http://forum.springs ... -
spring MessageSource
2009-06-12 13:06 1317http://www.blogjava.net/xzclog/ ... -
PagedListHolder
2009-03-26 23:32 1697org.springframework.beans.suppo ... -
HOWTO: Use Freemarker, SiteMesh, and Spring MVC(2)
2009-03-19 23:52 2039Here's an example of the Freema ... -
HOWTO: Use Freemarker, SiteMesh, and Spring MVC(1)
2009-03-19 23:50 4806<object classid="c ... -
spring mvc & freemarker 版ROR
2008-06-19 01:27 3573实现COC原则无配置自动映射 引用http://localho ... -
spring mvc 也能实现 ror 类似的URL路由
2008-06-18 18:54 3588看过ror的朋友一定知道它所体现的一个核心思想就是惯例优先原则 ... -
重头开始学 Spring JPetStore 4
2008-06-18 15:42 2475跟踪一个 .do 请求吧 就它了。 Enter the S ... -
重头开始学 Spring JPetStore 3
2008-06-18 14:21 2317按 重头开始学 Spring JPetStore 2 中的提示 ... -
重头开始学 Spring JPetStore 2
2008-06-17 11:50 17772. BUILD AND DEPLOYMENT 编译和发布 ... -
重头开始学 Spring JPetStore 1
2008-06-17 11:35 1662先看看它的readme.txt 引用@author Juer ... -
一个关于Spring的好消息及Spring Batch概述
2008-05-26 00:45 56923年前,即将大学毕业,遇到了spring,还以SSH框架为题做 ...
相关推荐
《Spring框架学习:以JpetStore为例》 Spring框架是Java企业级应用开发中的核心框架,它为开发者提供了丰富的功能,简化了开发流程,提高了代码的可测试性和可维护性。JpetStore作为Spring的经典示例项目,是学习...
5. **Spring Boot**:现代Spring开发的首选方式,它简化了Spring应用的初始设置和配置,内置了Tomcat服务器,支持自动配置。 6. **Spring Data JPA**:Spring的数据访问抽象层,用于简化JPA(Java Persistence API...
《Spring JPetStore:Spring框架的经典示例》 Spring框架是Java开发中广泛使用的轻量级框架,以其灵活、高效和模块化的特性深受开发者喜爱。其中,JPetStore项目是Spring官方提供的一个经典示例,它展示了Spring的...
《Spring JPetStore 2.5:MyEclipse下的实战指南》 在IT行业中,Spring框架作为Java企业级应用开发的主流选择,以其强大的功能和灵活性赢得了广大开发者喜爱。而JPetStore作为Spring官方提供的一个示例应用,是学习...
**Spring jpetstore** 是一个基于Spring框架的开源示例应用,它展示了如何使用Spring MVC、Spring JDBC以及Spring的其他核心特性来构建一个完整的Web应用。这个项目是Spring官方提供的,旨在帮助开发者学习和理解...
《基于Spring、Struts和iBatis的jpetstore4.0详解》 jpetstore4.0是一款经典的电子商务示例应用,它采用Spring、Struts和iBatis这三个核心框架构建,展示了如何在Java环境下实现一个完整的MVC(Model-View-...
《基于jpetstore的Spring、iBatis与Struts整合实战》 jpetstore项目是Spring框架的一个经典示例,它全面展示了如何将Spring、iBatis和Struts这三个核心的Java Web技术进行集成,构建出一个完整的MVC(Model-View-...
《MyEclipse中加载Spring的JPetStore详解》 在软件开发领域,Spring框架以其强大的功能和灵活性,已经成为Java企业级应用开发的事实标准。而MyEclipse作为一款强大的Java集成开发环境,为开发者提供了便捷的Spring...
《Spring之JPetStore:深度解析与实践指南》 在Java世界中,Spring框架以其强大的功能和灵活性,已经成为企业级应用开发的首选。而JPetStore作为Spring框架的经典示例项目,是学习和理解Spring核心特性的绝佳起点。...
《Spring的JPetStore工程与MyEclipse集成详解》 Spring框架是Java开发中的核心组件,它提供了丰富的功能,如依赖注入(DI)、面向切面编程(AOP)、数据访问和事务管理等。JPetStore作为Spring官方提供的一个示例...
最新spring带的JPetStore的MyEclipse项目,包括了数据库,可用hsqldb直接运行,可以直接导入MyEclipse中并部署运行。 在Myeclipse里新建一个web项目,导入shopping项目即可,数据库在db文件夹里
5. `WEB-INF/spring`:存放Spring的配置文件,如`applicationContext.xml`定义了bean的实例化、依赖关系等。 五、Spring核心概念实践 1. 依赖注入:通过XML配置或注解方式实现,例如在`applicationContext.xml`中...
spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包
**JPetStore5:一个基于J2EE的开源电子商务示例** **简介** JPetStore5是基于Java 2 Enterprise Edition (J2EE) 平台的一个经典示例应用,它是一个在线宠物商店,用于展示如何实现电子商务功能。这个项目在原有的...
**标题解析:** "JPetStore (Struts + Spring + Hibernate)版" 是一个基于Java技术的开源电子商务示例应用,它集成了Struts、Spring和Hibernate三个关键的开源框架。这个版本相较于之前的JPetStore5.0,进行了重要的...
在 jpetstore 中,Spring 作为整个应用的“胶水”,管理各个组件的生命周期和依赖关系。它可能通过XML配置或注解驱动的方式来定义bean,这些bean可以是DAO(数据访问对象)、Service、Controller等。Spring还提供了...
总的来说,JPetStore-5.0不仅是一个电商应用实例,也是一个学习和研究Java Web开发、iBatis、Spring和MVC模式的宝贵资源。通过对这个项目的深入研究,开发者可以提升自己的技术能力,更好地理解和运用相关技术栈。
5. **JNDI(Java Naming and Directory Interface)**:JNDI是Java的命名和目录接口,允许应用程序查找和使用服务,如数据库连接池。在jpetstore中,可能利用JNDI查找和管理EJB或者数据源。 6. **JTA(Java ...
该jpetstore经典案例为最新SPRING开发包里面的完全案例,并集成到eclipse里面了,在eclipse里面可以直接运行并调试,在工作目录里面直接建立jpetstore目录,自动导入该目录下文件,修改jdbc.properties配置文件,连接...