package net.reumann.demo.action;
import net.reumann.demo.Constants;
import net.reumann.demo.form.EmployeeForm;
import net.reumann.demo.service.DepartmentService;
import net.reumann.demo.service.EmployeeService;
import net.reumann.demo.service.DepartmentDaoService;
import net.reumann.demo.service.EmployeeDaoService;
import net.reumann.demo.vo.Employee;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.*;
import org.apache.struts.actions.DispatchAction;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public class EmployeeAction extends DispatchAction {
private Log logger = LogFactory.getLog(this.getClass());
private static EmployeeService empService = new EmployeeDaoService();
private static DepartmentService deptService = new DepartmentDaoService();
public ActionForward getEmployees(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.debug("getEmployees");
populateEmployees(request);
return mapping.findForward(Constants.SUCCESS);
}
public ActionForward setUpForInsertOrUpdate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.debug("setUpForInsertOrUpdate");
EmployeeForm employeeForm = (EmployeeForm)form;
if (isUpdate(request, employeeForm)) {
Integer id = Integer.valueOf(employeeForm.getEmployeeId());
Employee employee = empService.getEmployee(id);
BeanUtils.copyProperties(employeeForm, employee);
}
prep(request);
return mapping.findForward(Constants.SUCCESS);
}
public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.debug("delete");
EmployeeForm employeeForm = (EmployeeForm)form;
Integer id = Integer.valueOf(employeeForm.getEmployeeId());
empService.deleteEmployee(id);
populateEmployees(request);
return mapping.findForward(Constants.SUCCESS);
}
public ActionForward insertOrUpdate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.debug("insertOrUpdate");
EmployeeForm employeeForm = (EmployeeForm)form;
if (validationSuccessful(request, employeeForm)) {
Employee employee = new Employee();
BeanUtils.copyProperties(employee, employeeForm);
if (isUpdate(request, employeeForm)) {
logger.debug("update");
empService.updateEmployee(employee);
} else {
logger.debug("insert" );
empService.insertEmployee(employee);
}
populateEmployees(request);
return mapping.findForward(Constants.SUCCESS);
} else {
prep(request);
return mapping.findForward(Constants.FAILURE);
}
}
private void populateEmployees(HttpServletRequest request) {
List employees = empService.getAllEmployees();
request.setAttribute(Constants.EMPLOYEES, employees);
prep(request);
}
private void prep(HttpServletRequest request) {
request.setAttribute(Constants.DEPARTMENTS, deptService.getAllDepartments());
}
private boolean isUpdate(HttpServletRequest request, EmployeeForm empForm) {
boolean updateFlag = true;
//if ID is null or 0 we know we are doing an insert. You could check other
//things to decide, like a dispatch param
//It's annoying that BeanUtils will convert nulls to 0 so have to do 0 check also,
//or you could register a converter, which is the preferred way to handle it, but goes
//beyond this demo
String id = empForm.getEmployeeId();
if (id == null || id.trim().length() == 0 || Integer.parseInt(id) == 0) {
updateFlag = false;
}
request.setAttribute("updateFlag", Boolean.valueOf(updateFlag));
return updateFlag;
}
private boolean validationSuccessful(HttpServletRequest request, EmployeeForm form) {
//if you really like using the validation framework stuff, you can just
//call ActionErrors errors = form.validate( mapping, request ); in this method
//and check for errors being empty, if not save them and you're done.
//I end up finding the validation framework a bit annoying to work with, so I do it
//old-Skool way. Inevitably in a more complex app you end up having to perform
//more complex validation than the validation framework provides, so I just assume
//keep it all here in one place, versus having some handled by xml configuration and
//some hardcoded.
boolean isOk = true;
ActionMessages errors = new ActionMessages();
if (form.getAge() == null || form.getAge().trim().length() == 0) {
errors.add("age", new ActionMessage("errors.required", "Age"));
} else {
try {
Integer.parseInt(form.getAge());
} catch (NumberFormatException e) {
errors.add("age", new ActionMessage("errors.number", "Age"));
}
}
if (form.getFirstName() == null || form.getFirstName().trim().length() == 0) {
errors.add("firstName", new ActionMessage("errors.required", "First Name"));
}
if (form.getLastName() == null || form.getLastName().trim().length() == 0) {
errors.add("lastName", new ActionMessage("errors.required", "Last Name"));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
isOk = false;
}
return isOk;
}
}
struts_crud源码
需积分: 0 147 浏览量
更新于2008-09-10
收藏 1.96MB ZIP 举报
Struts CRUD 源码分析
Struts 是一个开源的Java Web框架,它为构建基于MVC(模型-视图-控制器)模式的应用程序提供了一种结构化的方法。CRUD,即创建(Create)、读取(Read)、更新(Update)和删除(Delete),是数据库操作的基本动作,也是许多应用程序的核心功能。本源码分析将深入探讨如何在Struts框架中实现这些基本操作。
1. **Struts框架基础**
- **ActionServlet**:作为Struts的核心,它是Servlet的子类,处理HTTP请求并分派到相应的Action。
- **ActionMapping**:定义了Action与请求URL之间的映射关系。
- **ActionForm**:用于封装用户输入的数据,与请求参数进行绑定。
- **Action**:实现了业务逻辑,处理ActionForm中的数据并调用Service层方法。
- **Result**:定义了Action执行后的跳转页面或资源。
2. **CRUD操作实现**
- **创建(Create)**:通常涉及ActionForm收集用户输入,然后由Action处理数据并调用DAO(数据访问对象)进行持久化操作。
- **读取(Read)**:通过ActionServlet接收到查询请求,Action根据条件查询数据库并填充ActionForm,最后返回对应的JSP页面显示结果。
- **更新(Update)**:用户修改数据后提交,ActionForm会携带更新后的数据,Action更新数据库记录,并可能返回确认或错误信息。
- **删除(Delete)**:Action接收删除请求,验证权限,然后通过DAO删除指定的数据库记录。
3. **Struts配置文件**
- `struts-config.xml`:这是Struts的核心配置文件,定义了Action、ActionMapping、ActionForm以及ActionForward等元素,描述了请求处理的流程。
4. **DAO层**
- 数据库连接管理:通常使用JDBC或ORM框架如Hibernate、MyBatis来实现对数据库的操作。
- CRUD方法:每个实体类对应一组DAO方法,如`create()`, `read()`, `update()`, `delete()`。
5. **模型(Model)**
- 实体类:代表数据库中的表,包含属性和getter/setter方法,用于封装和传递数据。
- Service层:负责业务逻辑,调用DAO进行数据操作,是Action和DAO之间的桥梁。
6. **视图(View)**
- JSP页面:展示数据,处理用户交互,通常使用Struts的标签库(例如struts-bean, struts-html, struts-logic等)简化页面编程。
7. **异常处理**
- Struts提供了全局的异常处理机制,可以自定义ActionError和ActionMessages,用于处理和显示业务错误。
8. **国际化与本地化**
- 使用ResourceBundle和struts.properties文件实现应用的多语言支持。
9. **测试**
- 单元测试:针对Action、Service和DAO编写单元测试,确保每个组件的功能正确。
- 集成测试:模拟用户操作,测试整个流程的正确性。
通过深入分析"rr-struts-crud"这个项目,我们可以学习到Struts框架如何处理CRUD操作,了解其背后的架构设计,这对于理解和开发Java Web应用程序大有裨益。同时,这个源码也展示了如何在实际项目中整合其他技术,如数据库操作、异常处理和国际化,从而提升我们的编程技能。
guobo530
- 粉丝: 0
- 资源: 3
最新资源
- 西电微机原理实验-西安电子科技大学微机原理课程实验概述与指导
- 智慧校园(校园AI 产品) 校园安全 智慧校园 教育数字化 AI校园
- 西电微机原理实验四:8255可编程并行接口的应用
- 基于 Go+Echo 开发的多房间实时通讯系统。详细文档+优秀项目+全部资料.zip
- 基于 Go + Vue 的现代化博客系统详细文档+优秀项目+全部资料.zip
- 基于 go + grpc + consul 的微服务系统详细文档+优秀项目+全部资料.zip
- 基于 golang goframe + vue3 的、前后端分离的后台管理系统快捷使用模板,支持按钮级别的 RBAC。详细文档+优秀项目+全部资料.zip
- 基于 goframe2 和vue3 开发的全栈前后端分离的后台管理系统,详细文档+优秀项目+全部资料.zip
- 基于 Golang 的 容器管理系统 API详细文档+优秀项目+全部资料.zip
- 基于 React 实现的电商后台管理系统的前端项目详细文档+优秀项目+全部资料.zip
- 基于 Golang开发的微服务网关,能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展详细文档+优秀项目+全部资料.zip
- 基于 Vue + Go 实现客户关系管理系统,,主要功能有仪表盘、客户管理、合同管理、产品管理、配置、订阅等功能详细文档+优秀项目+全部资料.zip
- 基于beego v2.0.1框架和AdminLte前端框架,开发的go语言通用后台系统,详细文档+优秀项目+全部资料.zip
- 基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统详细文档+优秀项目+全部资料.zip
- 基于beego的简易blog系统详细文档+优秀项目+全部资料.zip
- 基于Beego开发的可切换模板的 BBS 社交博客系统、它安装简单便捷,页面简介优美。前端是HTML+JS+CSS,不需要掌握一些前端技术栈也能轻松自定义页面。详细文档+优秀项目+全部资料.zip