- 浏览: 520625 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (299)
- Oracle(pl/sql_Erp_Pro*C) (69)
- 设计模式 (4)
- spring (23)
- ext (17)
- apache开源项目应用 (4)
- jquery (16)
- 生活琐事 (8)
- 下载资源 (23)
- mysql (2)
- Eclipse使用积累 (5)
- 报表类(报表/图表) (13)
- php (4)
- Web多彩文本框 (3)
- json (4)
- jqgrid (2)
- ant (2)
- java算法积累 (8)
- EL表达式/JSTL (4)
- poi (3)
- gwt (2)
- 爬网第一步 (2)
- javascript (17)
- Javaweb (8)
- tomcat (1)
- flex (1)
- Java&DB (3)
- J2SE (7)
- linux (3)
- 数据结构 (1)
- dot net (5)
- struts (1)
- ibatis (1)
- log4j (1)
- 项目管理 (1)
- Java native interface(jni,jacob......) (5)
- applet (1)
- VB.net/C#.net/JNI (20)
- css (1)
- Sqlite (1)
- servlet (1)
- REST (1)
最新评论
-
wenhurena:
能不能给一下解压密码roki.work.2017@gmail. ...
Ebs解体新書と学習資料1 -
liutao1600:
楼主写的太好了,每天学习~~
Spring_MVC(6)测试 -
liutao1600:
太好了,每天学习你的文章~~~
Spring_MVC(3)表单页面处理 -
liutao1600:
学习了,太好了
Spring_MVC(2)控制层处理 -
liutao1600:
学习了~~~
Spring_MVC(1)构建简单web应用
这里将用到以下几个包:
aopalliance-1.0.jar
commons-collections.jar
commons-dbcp.jar
commons-logging-1.1.1.jar
commons-pool.jar
jstl.jar
log4j-1.2.15.jar
mysql-connector-java-5.1.6-bin.jar
spring-aop-2.5.6.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-context-support-2.5.6.jar
spring-core-2.5.6.jar
spring-jdbc-2.5.6.jar
spring-tx-2.5.6.jar
spring-web-2.5.6.jar
spring-webmvc-2.5.6.jar
standard.jar
主要增加了spring-aop-2.5.6.jar的AOP支持包!
之前我们在AccountService中加入了注解@Transactional标签,但是要想要真正发挥事务作用,还需要一些配置。
主要需要调整dao.xml文件
dao.xml-事务管理
- <bean
- id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
- p:dataSource-ref="dataSource" />
- <tx:annotation-driven
- transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" /> <tx:annotation-driven transaction-manager="transactionManager" />
细化一下AccountService接口方法
AccountService.java
- /**
- * 2010-1-23
- */
- package org.zlex.spring.service;
- import org.springframework.dao.DataAccessException;
- import org.springframework.transaction.annotation.Transactional;
- import org.zlex.spring.domain.Account;
- /**
- * 账户业务接口
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- public interface AccountService {
- /**
- * 获得账户
- *
- * @param username
- * @param password
- * @return
- */
- @Transactional(readOnly = true)
- Account read(String username, String password);
- /**
- * 获得账户
- *
- * @param id
- * @return
- */
- @Transactional(readOnly = true)
- Account read(int id);
- /**
- * 注册用户
- *
- * @param account
- * @return
- */
- @Transactional(readOnly = false, rollbackFor = DataAccessException.class)
- Account register(Account account);
- }
/** * 2010-1-23 */ package org.zlex.spring.service; import org.springframework.dao.DataAccessException; import org.springframework.transaction.annotation.Transactional; import org.zlex.spring.domain.Account; /** * 账户业务接口 * * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> * @version 1.0 * @since 1.0 */ public interface AccountService { /** * 获得账户 * * @param username * @param password * @return */ @Transactional(readOnly = true) Account read(String username, String password); /** * 获得账户 * * @param id * @return */ @Transactional(readOnly = true) Account read(int id); /** * 注册用户 * * @param account * @return */ @Transactional(readOnly = false, rollbackFor = DataAccessException.class) Account register(Account account); }
这里我把注解@Transactional调整到了具体的方法上,也就是说这样写的话,凡是加入注解的标注的方法都属于事务配置!
Account register(Account account);用做用户注册作用!
@Transactional(readOnly = true)只读属性
@Transactional(readOnly = false, rollbackFor = DataAccessException.class)只读关闭,遇到DataAccessException异常回滚!如果不对异常进行处理,该异常将一直向上层抛出,直至抛出到页面!
如果你的Eclipse集成了SpringIDE,你可以观察一下这时的xml配置文件和AccoutServiceImpl.java的变化!
这次,来个用户注册功能演示,故意在某个位置制造一个异常,看看是否正常回滚!
先看注册控制器
RegisterController.java
- /**
- * 2010-2-4
- */
- package org.zlex.spring.controller;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.propertyeditors.CustomDateEditor;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.ModelMap;
- import org.springframework.web.bind.WebDataBinder;
- import org.springframework.web.bind.annotation.InitBinder;
- import org.springframework.web.bind.annotation.ModelAttribute;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.zlex.spring.domain.Account;
- import org.zlex.spring.service.AccountService;
- /**
- * 用户注册控制器
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- @Controller
- @RequestMapping(value = "/register.do")
- public class RegisterController {
- @Autowired
- private AccountService accountService;
- @InitBinder
- public void initBinder(WebDataBinder binder) {
- DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
- binder.registerCustomEditor(Date.class, "birthday",
- new CustomDateEditor(format, true));
- }
- @RequestMapping(method = RequestMethod.GET)
- public String initForm(ModelMap model) {
- Account account = new Account();
- model.addAttribute("account", account);
- // 直接跳转到登录页面
- return "account/register";
- }
- @RequestMapping(method = RequestMethod.POST)
- protected String submit(@ModelAttribute("account") Account account) {
- int id = accountService.register(account).getId();
- // 跳转到用户信息页面
- return "redirect:profile.do?id=" + id;
- }
- }
/** * 2010-2-4 */ package org.zlex.spring.controller; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.zlex.spring.domain.Account; import org.zlex.spring.service.AccountService; /** * 用户注册控制器 * * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> * @version 1.0 * @since 1.0 */ @Controller @RequestMapping(value = "/register.do") public class RegisterController { @Autowired private AccountService accountService; @InitBinder public void initBinder(WebDataBinder binder) { DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, "birthday", new CustomDateEditor(format, true)); } @RequestMapping(method = RequestMethod.GET) public String initForm(ModelMap model) { Account account = new Account(); model.addAttribute("account", account); // 直接跳转到登录页面 return "account/register"; } @RequestMapping(method = RequestMethod.POST) protected String submit(@ModelAttribute("account") Account account) { int id = accountService.register(account).getId(); // 跳转到用户信息页面 return "redirect:profile.do?id=" + id; } }
@InitBinder用于表单自定义属性绑定。这里我们要求输入一个日期格式的生日。
@RequestMapping(method = RequestMethod.GET)用于初始化页面。
@RequestMapping(method = RequestMethod.POST)用于提交页面。
再看注册页面
register.jsp
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>注册</title>
- <link rel="stylesheet" type="text/css" href="css/style.css" />
- <script type="text/javascript" src="js/calendar.js"></script>
- </head>
- <body>
- <fieldset><legend>用户注册</legend><form:form
- commandName="account">
- <ul>
- <li><form:label path="username">用户名:</form:label><form:input
- path="username" /></li>
- <li><form:label path="password">密码:</form:label><form:password
- path="password" /></li>
- <li><form:label path="birthday">生日:</form:label><form:input
- path="birthday" onfocus="showDate(this);" /></li>
- <li><form:label path="email">Email:</form:label><form:input
- path="email" /></li>
- <li>
- <button type="submit">注册</button>
- <button type="reset">重置</button>
- </li>
- </ul>
- </form:form></fieldset>
- </body>
- </html>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册</title> <link rel="stylesheet" type="text/css" href="css/style.css" /> <script type="text/javascript" src="js/calendar.js"></script> </head> <body> <fieldset><legend>用户注册</legend><form:form commandName="account"> <ul> <li><form:label path="username">用户名:</form:label><form:input path="username" /></li> <li><form:label path="password">密码:</form:label><form:password path="password" /></li> <li><form:label path="birthday">生日:</form:label><form:input path="birthday" onfocus="showDate(this);" /></li> <li><form:label path="email">Email:</form:label><form:input path="email" /></li> <li> <button type="submit">注册</button> <button type="reset">重置</button> </li> </ul> </form:form></fieldset> </body> </html>
这里我用了一个JavaScript日期控制标签:
<script type="text/javascript" src="js/calendar.js"></script>
使用起来就像是这样:
非常好用!!! 当然,你完全可以使用JE上的那个JS控件!
接下来稍微调整一下AccountService接口及其实现AccountServiceImpl
AccountService.java
- public interface AccountService {
- // 省略
- /**
- * 注册用户
- *
- * @param account
- * @return
- */
- @Transactional(readOnly = false, rollbackFor = DataAccessException.class)
- Account register(Account account);
- // 省略
- }
public interface AccountService { // 省略 /** * 注册用户 * * @param account * @return */ @Transactional(readOnly = false, rollbackFor = DataAccessException.class) Account register(Account account); // 省略 }
- @Service
- public class AccountServiceImpl implements AccountService {
- @Autowired
- private AccountDao accountDao;
- // 省略
- @Override
- public Account register(Account account) {
- accountDao.create(account);
- return accountDao.read(account.getUsername());
- }
- }
@Service public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; // 省略 @Override public Account register(Account account) { accountDao.create(account); return accountDao.read(account.getUsername()); } }
为了在插入一条记录后获得当前用户的主键,我们还得这么玩! 的确有点雷人~
从架构考虑,这是符合业务要求的实现!如果用iBatis或者Hibernate,这个问题就有数据库一次IO处理完成了!
再看看AccountDao接口及其实现AccountDaoImpl
AccountDao.java
- public interface AccountDao {
- // 省略
- /**
- * 构建用户记录
- *
- * @param account
- * @return
- */
- void create(Account account);
- }
public interface AccountDao { // 省略 /** * 构建用户记录 * * @param account * @return */ void create(Account account); }
AccountDaoImpl.java
- @Repository
- public class AccountDaoImpl implements AccountDao {
- // 省略
- @Override
- public void create(Account account) {
- String sql = "INSERT INTO account(username, password, birthday, email) VALUES(?,?,?,?)";
- jdbcTemplate.update(sql, new Object[] { account.getUsername(),
- account.getPassword(), account.getBirthday(),
- account.getEmail() });
- }
- }
@Repository public class AccountDaoImpl implements AccountDao { // 省略 @Override public void create(Account account) { String sql = "INSERT INTO account(username, password, birthday, email) VALUES(?,?,?,?)"; jdbcTemplate.update(sql, new Object[] { account.getUsername(), account.getPassword(), account.getBirthday(), account.getEmail() }); } }
来个注册演示!
注册:
信息展示:
来制造一起事故!
先看看数据库目前的状况!
在AccountDaoImpl中来个破坏!
- @Override
- public void create(Account account) {
- String sql = "INSERT INTO account(username, password, birthday, email) VALUES(?,?,?,?)";
- jdbcTemplate.update(sql, new Object[] { account.getUsername(),
- account.getPassword(), account.getBirthday(),
- account.getEmail() });
- [color=red]throw new RecoverableDataAccessException("TEST");[/color]
- }
@Override public void create(Account account) { String sql = "INSERT INTO account(username, password, birthday, email) VALUES(?,?,?,?)"; jdbcTemplate.update(sql, new Object[] { account.getUsername(), account.getPassword(), account.getBirthday(), account.getEmail() }); [color=red]throw new RecoverableDataAccessException("TEST");[/color] }
我们强行在执行完Insert语句后抛出DataAccessException异常(RecoverableDataAccessException)!
来个注册试试!
点击提交看看返回的异常!
异常回滚生效!
数据库中当然是什么都没有,我就不废话了!
发表评论
-
cronExpression
2010-08-30 17:57 1194一个Cron-表达式是一个由六至七个字段组成由空格分隔的 ... -
spring任务调度(task)
2010-08-23 13:24 2857spring 任务调度总结参考资料http://www.ibm ... -
spring 任务配置
2010-08-23 10:45 1208xml 代码 <bean id="i ... -
spring3.0注解式声明
2010-08-19 17:39 4379从spring2.5开始,annotation结合BeanPo ... -
Spring Roo 自动化集成开发工具
2010-08-04 14:54 2256Roo是一种 Spring 开发的辅助工具,使用命令行操作来生 ... -
spring3.0学习
2010-08-03 16:24 861https://src.springframework.org ... -
Spring mvc 转发、重定向
2010-07-28 16:53 2413spring控制器最后返回一个ModelAndView( ... -
spring api download
2010-07-28 08:43 1190在网上找了好多,都下不下来,要不就是需要注册登录什么的,才能下 ... -
Spring uploadFile
2010-05-02 20:45 2239先让我们来看一段摘自《Spring 2.5 Referen ... -
Spring_MVC(6)测试
2010-04-24 18:48 3735这里将用到以下几个包: 引用 aopalliance-1 ... -
Spring_MVC(4)持久层处理
2010-04-24 18:45 1207这里将用到以下几个包: 引用 aopalliance-1 ... -
Spring_MVC(3)表单页面处理
2010-04-24 18:43 3046// 跳转到用户信息页面 ... -
Spring_MVC(2)控制层处理
2010-04-24 18:42 1700言归正传,研究一下注解下的控制层。 我习惯于使用JSTL展示页 ... -
Spring_MVC(1)构建简单web应用
2010-04-24 18:40 1445Java代码 /** * 2010 ... -
spring实现文件上传
2010-04-24 15:15 1623Spring由内置的multipart支持web应用中的文件上 ... -
Spring MVC:使用InternalResourceViewResolver视图解析器
2010-02-24 09:14 2055参考:Sping 2.0.8\docs\MVC-step-by ... -
ibatis+spring控制事务配置
2009-04-05 10:25 1929<bean id="dataSource&qu ... -
转:spring事务控制配置实例
2009-04-03 10:47 3365Spring声明式事务配置的几种方法 在Spring中进 ... -
spring+ibatis+struts事务控制配置
2009-04-03 10:38 1564<?xml version="1.0" ... -
spring+ibatis+struts配置问题
2009-04-01 14:48 1137以下web.xml配置 <?xml version=&q ...
相关推荐
Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建控制器层,实现模型-视图-控制器(MVC)的设计模式。这个“spring_mvc.zip”压缩包很可能是为了帮助初学者快速入门...
16. **模板引擎**:除了传统的JSP外,Spring MVC还可以配合Thymeleaf、FreeMarker等模板引擎,使视图层更加简洁和灵活。 通过以上这些组件和机制,Spring MVC 构建了一个强大且灵活的Web开发框架,使得开发者可以...
7. **服务层与数据访问**:学习如何整合Spring MVC与Service层,以及DAO层进行数据库操作,例如使用@Autowired进行依赖注入。 8. **异常处理**:配置和实现全局和局部异常处理器,确保优雅地处理错误和异常。 9. *...
2. **Model-View-Controller (MVC)**:设计模式,Spring MVC遵循这一模式,其中Model代表业务数据,View负责展示,Controller处理用户交互。 3. **Controller**:控制器接口(Controller或者ViewController)处理...
Spring MVC是Spring框架的一个重要组成部分,它提供了模型-视图-控制器(MVC)架构,使开发者能够将业务逻辑、数据处理和用户界面有效地分离,从而实现更高效、可维护的代码结构。 在Spring MVC中,核心概念包括...
10. **验证和异常处理**:Spring MVC支持JSR-303 Bean Validation进行数据验证,以及自定义异常处理器来优雅地处理错误和异常情况。 通过上述组件的协作,"Hotel_SPring_MVC"项目能够实现用户友好的交互,高效的...
2. **Model-View-Controller**(MVC)架构模式:Spring MVC遵循这一模式,将应用程序逻辑分为模型(Model)、视图(View)和控制器(Controller)三部分,实现业务逻辑与展示层的分离。 3. **控制器(Controller)*...
业务逻辑通常在Service层处理,DAO层则负责与数据库交互。Service层可以注入DAO,通过调用DAO方法完成数据操作。 6. **视图解析器**: Spring MVC提供多种视图解析器,如InternalResourceViewResolver,用于将...
Spring MVC提供了一种模块化的方式来组织和处理HTTP请求,通过Controller、Service、DAO等层分离业务逻辑和数据访问。它还支持依赖注入,使得代码更易于测试和维护。在Spring MVC 3.0版本中,引入了更多改进,如支持...
Spring MVC 是一个基于Java的轻量级Web应用框架,它实现了模型-视图-控制器(MVC)设计模式,使得开发者能够将业务逻辑、数据处理和用户界面分离,从而更高效地构建可维护的Web应用。这个“spring_mvc框架搭建demo”...
4. **Spring MVC与MyBatis整合**:如何将两者结合,实现数据访问层(DAO)和业务服务层(Service)的设计。 5. **实战案例**:通过实际项目展示Spring MVC和MyBatis的综合运用,可能涉及用户登录注册、商品管理、...
3. **MVC控制器**:项目中的Controller类(如UserController.java)实现了MVC模式中的Controller层,处理HTTP请求,并调用Service层的方法来执行业务逻辑。这些Controller通常使用Spring的@RequestMapping注解来映射...
- Spring MVC可与Spring Security(安全)、Spring Data(数据访问)、MyBatis(持久层)等技术无缝集成。 在"spring_mvc_test"项目中,包含了基础的Spring MVC实践,以及英文和中文文档,可以帮助开发者快速理解...
5. 双亲上下文的说明:Spring MVC可以和Spring IoC容器一起使用,允许Spring MVC控制器依赖注入服务或持久层对象。这种情况下,DispatcherServlet上下文是作为Spring父上下文的子上下文存在。 6. mvc.xml配置文件:...
标题 "the-mvc-spring-and-web-study.rar" 暗示了这是一个关于Spring MVC与Web开发相结合的学习资源,特别是针对Java平台。Spring MVC是Spring框架的一个重要组件,用于构建可伸缩、高性能的Web应用程序。它采用了...
在Spring MVC的应用实例中,例如银行应用程序,可以学习如何配置框架的视图层,包括使用JSTL标记库来显示数据和使用JavaServer Pages(JSP)技术。配置视图层时,开发者需要定义视图解析器,以便DispatcherServlet...
4. **数据类型转换**:了解Spring Web MVC如何自动处理数据类型转换。 5. **数据格式化**:学习如何对数据进行格式化处理。 6. **数据验证**:理解声明式数据验证的工作原理。 7. **视图解析器**:掌握各种视图解析...
另外,Spring MVC与Spring框架的其他组件无缝集成,如Spring AOP(面向切面编程)用于实现日志、事务管理等功能,Spring JDBC和MyBatis等持久层框架用于数据库操作,以及Spring Data JPA、Hibernate等ORM工具,使得...
Spring MVC提供了一种优雅的方式,通过模型-视图-控制器(MVC)架构来分离关注点,使开发者可以更专注于业务逻辑而不是基础设施。在本项目"基于注解方式的spring_mvc_jdbcTemplate"中,我们将深入探讨如何利用注解...
5. 创建Controller类,定义处理HTTP请求的方法,并利用Spring MVC的注解进行路由配置。 6. 设计并创建视图模板,通常使用Thymeleaf或JSP等技术。 7. 运行项目,测试各种功能,确保所有组件协同工作。 通过这个模板...