- 浏览: 679073 次
- 性别:
- 来自: 安徽
-
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
SSH中Struts可谓是比较常用的框架了。通过对Struts官方文档的阅读了解到Struts主要包含:原理和配置文件(所有框架都会涉及的)、拦截器(Interceptors)、Actions、Results、数据验证、国际化、OGNL和数据类型转换、标签以及Struts与其他框架如DWR、Spring、Hibernate等框架的结合使用。 今天主要先整体说明一下Struts,然后写一个CRUD Demo,让自己对Struts有个整体上的认识。细节性问题在以后的博文中再详细说明。
Struts 内核采用了AOP ,所以进行了解耦和,我们对照上面这张图熟悉一个请求在Struts2 中的处理大概分为一下几个步骤:
1、 客户端初始化一个指向Servlet 容器(例如Tomcat )的请求;
2、 这个请求经过一系列的过滤器(Filter ),接着FilterDispatcher (在web.xml 中进行配置)被调用,FilterDispatcher 询问ActionMapper 来决定这个请求是否需要调用某个Action ;
3、 如果ActionMapper 决定需要调用某个Action ,那么FilterDispatcher 会把请求的处理交给ActionProxy ;
4、 ActionProxy 通过Configuration Manager 询问框架的配置文件,找到需要调用的Action 类;
5、 ActionProxy 创建一个ActionInvocation 的实例(Action 调度器,实现拦截器与Action 的cross-cut (横切));
6、 ActionInvocation 实例使用命名模式来调用,在调用Action 的过程前后,涉及到相关拦截器(Intercepter )的调用;
7、 一旦Action 执行完毕,ActionInvocation 负责根据struts.xml 中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action 链)一个需要被表示的JSP 或者FreeMarker 的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper ;
这里需要对 ActionProxy 进行一点说明的是,ActionProxy 不仅可以实现Action 的功能,还可以在不发生耦合的情况下在Action 之前之后插入一些拦截器。
上面理论上了解了一下Struts2 的处理流程,下面我们来一个CRUD Demo 来实践一下,在列出代码之前,先说明一下,Struts 的开发步骤:
1、 将struts2 的包添加到lib 下
Jar 包 |
说明 |
struts2-core-2.1.8.1.jar |
Struts2 的核心包 |
xwork-core-2.1.6.jar |
Command 模式框架,WebWork 和Struts2 都基于xwork |
commons-logging-1.0.4.jar |
Java 日志工具类包 |
freemarker-2.3.15.jar |
模板引擎,一个基于模板生成文本输出的通用工具 |
ognl-2.7.3.jar |
Object-Graph Navigation Language ,表达式语言,用来获取和设置Java 对象属 |
如果想要实现上传还要再多加commons-fileupload-1.2.1.jar 和commons-io-1.3.2.jar 。
2 、实现相应的Action 及jsp 页面
3 、在web.xml 中配置MVC 控制器(Struts 核心过滤器)
4 、生成struts.xml(src 下) 的配置文件及映射Action 和jsp 页面
为了方便,我直接将数据以集合的形式存储,而没用存在数据库中去了。Ok ,废话说了很多,直接上代码:
首先配置文件 :
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Struts2CRUD</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- struts核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
struts.xml(src目录下):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="guest" /> <!-- Configuration for the default package. --> <package name="default" extends="struts-default" namespace="/"> <!-- setup the default-stack exception mapping interceptor so that any exceptions not caught by this application will be logged and then handled by the global exception mapping --> <interceptors> <interceptor-stack name="appDefault"> <interceptor-ref name="defaultStack"> <param name="exception.logEnabled">true</param> <param name="exception.logLevel">ERROR</param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="appDefault" /> <global-results> <result name="error">/page/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> <action name="index" class="com.iflytek.action.ListEmployeeAction"> <result name="success">/page/employeeList.jsp</result> </action> <action name="addEmployee" class="com.iflytek.action.EmployeeAction" method="input"> <result name="input">/page/employeeEdit.jsp</result> </action> <action name="saveEmployee" class="com.iflytek.action.EmployeeAction" method="save"> <result name="success" type="redirectAction"> <param name="actionName">index</param> </result> <result name="input">/page/employeeEdit.jsp</result> </action> <action name="editEmployee" class="com.iflytek.action.EmployeeAction" method="input"> <result name="input">/page/employeeEdit.jsp</result> </action> <action name="deleteEmployee" class="com.iflytek.action.EmployeeDeleteAction" method="delete"> <result name="success" type="redirectAction"> <param name="actionName">index</param> </result> <result name="input">/page/employeeEdit.jsp</result> </action> </package> </struts>
View
index.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <title>Redirecting</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.action"> </head> <body> </body> </html>
employeeList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <head> <link href="<s:url value='/css/main.css'/>" rel="stylesheet" type="text/css" /> <title><s:text name="label.employees" /></title> <style type="text/css"> th { text-align: center; } </style> </head> <body> <div class="titleDiv"> <s:text name="application.title" /> </div> <h1> <s:text name="label.employees" /> </h1> <s:url var="url" action="addEmployee" /> <a href="<s:property value="#url"/>">添加员工</a> <br /> <br /> <table class="borderAll"> <tr> <th><s:text name="label.firstName" /></th> <th><s:text name="label.lastName" /></th> <th><s:text name="label.age" /></th> <th><s:text name="label.department" /></th> <th><s:text name="label.salary" /></th> <th><s:text name="label.oper" /></th> </tr> <s:iterator value="employees" status="status"> <tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>"> <td class="nowrap"><s:property value="firstName" /></td> <td class="nowrap"><s:property value="lastName" /></td> <td class="nowrap"><s:property value="age" /></td> <td class="nowrap"><s:property value="department.name" /></td> <td class="nowrap"><s:property value="salary" /></td> <td class="nowrap"><s:url action="editEmployee" var="url"> <s:param name="employee.employeeId" value="employeeId" /> </s:url> <a href="<s:property value="#url"/>">编辑</a> <s:url action="deleteEmployee" var="url"> <s:param name="employee.employeeId" value="employeeId" /> </s:url> <a href="<s:property value="#url"/>">删除</a></td> </tr> </s:iterator> </table> </body> </html>
employeeEdit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags"%> <s:if test="employee==null || employee.employeeId == null"> <s:set name="title" value="%{'添加员工'}" /> </s:if> <s:else> <s:set name="title" value="%{'编辑员工'}" /> </s:else> <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <head> <link href="<s:url value='/css/main.css'/>" rel="stylesheet" type="text/css" /> <style> td { white-space: nowrap; } </style> <title><s:property value="#title" /></title> <s:head /> </head> <body> <div class="titleDiv"> <s:text name="application.title" /> </div> <h1> <s:property value="#title" /> </h1> <s:actionerror /> <s:actionmessage /> <s:form action="saveEmployee" method="post"> <s:textfield key="employee.firstName" size="40" /> <s:textfield key="employee.lastName" size="40" /> <s:textfield key="employee.age" size="20" /> <s:select key="employee.department.departmentId" list="departments" listKey="departmentId" listValue="name" /> <s:textfield key="employee.salary" size="20" /> <s:hidden name="employee.employeeId" /> <s:submit key="submit" /> </s:form> </body> </html>
error.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <head> <title>Error</title> </head> <body> <h4>The application has malfunctioned.</h4> <p>Please contact technical support with the following information:</p> <!-- the exception and exceptionStack bean properties were created by Struts2's Exception Intercepter --> <h4> Exception Name: <s:property value="exception" /> </h4> <h4> Exception Details: <s:property value="exceptionStack" /> </h4> <p> <a href="index.action">Return to the home page.</a> </p> </body> </html>
页面中用到的提示信息
guest.properties(src目录下)
#labels application.title=Struts2 CRUD Demo label.employees=\u5458\u5DE5\u4FE1\u606F label.delete=\u5220\u9664 label.edit=\u7F16\u8F91 label.employee.edit=\u7F16\u8F91\u5458\u5DE5 label.employee.add=\u6DFB\u52A0\u5458\u5DE5 label.firstName=\u540D\u5B57 label.lastName=\u59D3 label.department=\u6240\u5C5E\u90E8\u95E8 label.age=\u5E74\u9F84 label.salary=\u85AA\u6C34 label.oper=\u64CD\u4F5C employee.firstName=\u540D\u5B57 employee.lastName=\u59D3 employee.department.departmentId=\u6240\u5C5E\u90E8\u95E8 employee.age=\u5E74\u9F84 employee.salary=\u85AA\u6C34 submit=\u63D0\u4EA4 ##-- errors errors.prefix=<span style="color:red;font-weight:bold;"> errors.suffix=</span> errors.general=\u51FA\u73B0\u9519\u8BEF errors.required.firstname=\u540D\u5B57\u5FC5\u586B\uFF01 errors.required.lastname=\u59D3\u5FC5\u586B\uFF01 errors.required.age=\u5E74\u9F84\u5FC5\u586B\uFF01 errors.required.age.limit=\u5E74\u9F84\u5728 ${min} \u5230 ${max}\u4E4B\u95F4\uFF01 errors.required.department=\u90E8\u95E8\u5FC5\u586B\uFF01
Action
ListEmployeeAction.java
package com.iflytek.action; import java.util.List; import org.apache.log4j.Logger; import com.iflytek.model.Employee; import com.iflytek.service.IEmployeeService; import com.iflytek.serviceImpl.EmployeeServiceImpl; import com.opensymphony.xwork2.ActionSupport; /** * * @author xdwang * * @date 2012-6-6 下午8:48:08 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * * 员工列表 * */ public class ListEmployeeAction extends ActionSupport { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") private static Logger logger = Logger.getLogger(ListEmployeeAction.class .getName()); private static IEmployeeService empService = new EmployeeServiceImpl(); private List<Employee> employees; /** * Create collection of Employee objects. * * @return success */ public String execute() throws Exception { setEmployees(empService.getAllEmployees()); return SUCCESS; } public List<Employee> getEmployees() { return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } }
EmployeeAction.java
package com.iflytek.action; import java.util.List; import org.apache.log4j.Logger; import com.iflytek.model.Department; import com.iflytek.model.Employee; import com.iflytek.service.IDepartmentService; import com.iflytek.service.IEmployeeService; import com.iflytek.serviceImpl.DepartmentServiceImpl; import com.iflytek.serviceImpl.EmployeeServiceImpl; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.Preparable; /** * * @author xdwang * * @date 2012-6-6 下午5:03:17 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * * 员工的Action * */ public class EmployeeAction extends ActionSupport implements Preparable { private static final long serialVersionUID = 1L; private static Logger logger = Logger.getLogger(EmployeeAction.class .getName()); private static IEmployeeService empService = new EmployeeServiceImpl(); private static IDepartmentService deptService = new DepartmentServiceImpl(); private Employee employee; private List<Department> departments; /** * Ensures that the collection of Department objects is always available to * the view. */ public void prepare() throws Exception { departments = deptService.getAllDepartments(); logger.debug("in method prepare"); } /** * Saves a new employee if the employee object's employeeId is null * otherwise updates existing employee. * * @return success */ public String save() { logger.debug("in method save"); if (employee.getEmployeeId() == null) { empService.insertEmployee(employee); } else { empService.updateEmployee(employee); } return SUCCESS; } /** * Gets a specific Employee objects so it can be displayed in the view. * * @return input */ public String input() { logger.debug("in method input"); if (employee != null && employee.getEmployeeId() != null) { logger.debug("Employee ID is " + employee.getEmployeeId()); employee = empService.getEmployee(employee.getEmployeeId()); } return INPUT; } public Employee getEmployee() { return employee; } public void setEmployee(Employee employee) { this.employee = employee; } public List<Department> getDepartments() { return departments; } }
EmployeeDeleteAction.java
package com.iflytek.action; import org.apache.log4j.Logger; import com.iflytek.model.Employee; import com.iflytek.service.IEmployeeService; import com.iflytek.serviceImpl.EmployeeServiceImpl; import com.opensymphony.xwork2.ActionSupport; /** * * @author xdwang * * @date 2012-6-6 下午8:38:14 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public class EmployeeDeleteAction extends ActionSupport { private static final long serialVersionUID = 1L; private static Logger logger = Logger.getLogger(EmployeeDeleteAction.class .getName()); private static IEmployeeService empService = new EmployeeServiceImpl(); private Employee employee; /** * Delete the Employee object based on the value of the employeeId field * from the data repository. * * @return success */ public String delete() { logger.debug("in method delete"); if (employee != null && employee.getEmployeeId() != null) { logger.debug("Employee ID is " + employee.getEmployeeId()); } empService.deleteEmployee(employee.getEmployeeId()); return SUCCESS; } public Employee getEmployee() { return employee; } public void setEmployee(Employee employee) { this.employee = employee; } }
同目录下的验证.xml
EmployeeAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="employee.firstName"> <field-validator type="requiredstring"> <message key="errors.required.firstname"/> </field-validator> </field> <field name="employee.lastName"> <field-validator type="requiredstring"> <message key="errors.required.lastname"/> </field-validator> </field> <field name="employee.age"> <field-validator type="required" short-circuit="true"> <message key="errors.required.age"/> </field-validator> <field-validator type="int"> <param name="min">18</param> <param name="max">65</param> <message key="errors.required.age.limit"/> </field-validator> </field> </validators>
service接口
IDepartmentService.java
package com.iflytek.service; import java.util.List; import com.iflytek.model.Department; /** * * @author xdwang * * @date 2012-6-6 下午9:11:15 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public interface IDepartmentService { public List<Department> getAllDepartments(); }
IEmployeeService.java
package com.iflytek.service; import java.util.List; import com.iflytek.model.Employee; /** * * @author xdwang * * @date 2012-6-6 下午9:14:20 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public interface IEmployeeService { public List<Employee> getAllEmployees(); public void updateEmployee(Employee emp); public void deleteEmployee(Integer id); public Employee getEmployee(Integer id); public void insertEmployee(Employee emp); }
service实现
DepartmentServiceImpl.java
package com.iflytek.serviceImpl; import java.util.List; import com.iflytek.dao.IDepartmentDao; import com.iflytek.daoImpl.DepartmentDaoImpl; import com.iflytek.model.Department; import com.iflytek.service.IDepartmentService; /** * * @author xdwang * * @date 2012-6-6 下午9:16:11 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public class DepartmentServiceImpl implements IDepartmentService { private IDepartmentDao dao; public DepartmentServiceImpl() { this.dao = new DepartmentDaoImpl(); } public List<Department> getAllDepartments() { return dao.getAllDepartments(); } }
EmployeeServiceImpl.java
package com.iflytek.serviceImpl; import java.util.List; import com.iflytek.dao.IEmployeeDao; import com.iflytek.daoImpl.EmployeeDaoImpl; import com.iflytek.model.Employee; import com.iflytek.service.IEmployeeService; /** * * @author xdwang * * @date 2012-6-6 下午9:21:42 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public class EmployeeServiceImpl implements IEmployeeService { private IEmployeeDao dao; public EmployeeServiceImpl() { this.dao = new EmployeeDaoImpl(); } public List<Employee> getAllEmployees() { return dao.getAllEmployees(); } public void updateEmployee(Employee emp) { dao.update(emp); } public void deleteEmployee(Integer id) { dao.deleteById(id); } public Employee getEmployee(Integer id) { return dao.getEmployeeById(id); } public void insertEmployee(Employee emp) { dao.insert(emp); } }
DAO接口
IDepartmentDao.java
package com.iflytek.dao; import java.util.List; import java.util.Map; import com.iflytek.model.Department; /** * * @author xdwang * * @date 2012-6-6 下午8:52:17 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public interface IDepartmentDao { /** * 获取所有部门信息 */ public List<Department> getAllDepartments(); public Map<Integer, Department> getDepartmentsMap(); }
IEmployeeDao.java
package com.iflytek.dao; import java.util.List; import com.iflytek.model.Employee; /** * * @author xdwang * * @date 2012-6-6 下午8:52:31 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public interface IEmployeeDao { /** * 获取所有员工信息 * @return 员工信息集合 */ public List<Employee> getAllEmployees(); /** * 根据id获取员工信息 * @param id 员工id * @return 员工实体信息 */ public Employee getEmployeeById(Integer id); /** * 更新员工信息 * @param employee 员工实体信息 */ public void update(Employee employee); /** * 插入员工信息 * @param employee 员工实体信息 */ public void insert(Employee employee); /** * 根据员工id删除员工信息 * @param id 员工id */ public void deleteById(Integer id); }
DAO实现
DepartmentDaoImpl.java
package com.iflytek.daoImpl; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.iflytek.dao.IDepartmentDao; import com.iflytek.model.Department; /** * * @author xdwang * * @date 2012-6-6 下午8:58:55 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public class DepartmentDaoImpl implements IDepartmentDao { private static List<Department> departments; private static Map<Integer, Department> departmentsMap; static { departments = new ArrayList<Department>(); departments.add(new Department(new Integer(100), "研发部")); departments.add(new Department(new Integer(200), "人事部")); departments.add(new Department(new Integer(300), "销售部")); departmentsMap = new HashMap<Integer, Department>(); Iterator<Department> iter = departments.iterator(); while (iter.hasNext()) { Department dept = (Department) iter.next(); departmentsMap.put(dept.getDepartmentId(), dept); } } public List<Department> getAllDepartments() { return departments; } public Map<Integer, Department> getDepartmentsMap() { return departmentsMap; } }
EmployeeDaoImpl.java
package com.iflytek.daoImpl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import com.iflytek.dao.IDepartmentDao; import com.iflytek.dao.IEmployeeDao; import com.iflytek.model.Department; import com.iflytek.model.Employee; /** * * @author xdwang * * @date 2012-6-6 下午9:01:59 * * @email xdwangiflytek@gmail.com * * @blog xdwangiflytek.iteye.com * */ public class EmployeeDaoImpl implements IEmployeeDao { private static Map<Integer, Department> departmentsMap; private static ArrayList<Employee> employees; static { employees = new ArrayList<Employee>(); employees.add(new Employee(new Integer(1), "小明", "王", new Integer( 36), new Department(new Integer(100), "研发部"), "50000")); employees.add(new Employee(new Integer(2), "三丰", "张", new Integer( 25), new Department(new Integer(300), "销售部"), "35000")); IDepartmentDao deptDao = new DepartmentDaoImpl(); departmentsMap = deptDao.getDepartmentsMap(); } public List<Employee> getAllEmployees() { return employees; } public Employee getEmployeeById(Integer id) { Employee emp = null; Iterator<Employee> iter = employees.iterator(); while (iter.hasNext()) { emp = (Employee) iter.next(); if (emp.getEmployeeId().equals(id)) { break; } } return emp; } public void update(Employee employee) { Integer id = employee.getEmployeeId(); for (int i = 0; i < employees.size(); i++) { Employee tempEmp = (Employee) employees.get(i); if (tempEmp.getEmployeeId().equals(id)) { employee.setDepartment((Department) departmentsMap.get(employee .getDepartment().getDepartmentId())); employees.set(i, employee); break; } } } public void insert(Employee employee) { int lastId = 0; Iterator<Employee> iter = employees.iterator(); while (iter.hasNext()) { Employee temp = (Employee) iter.next(); if (temp.getEmployeeId().intValue() > lastId) { lastId = temp.getEmployeeId().intValue(); } } employee.setDepartment((Department) departmentsMap.get(employee .getDepartment().getDepartmentId())); employee.setEmployeeId(new Integer(lastId + 1)); employees.add(employee); } public void deleteById(Integer id) { for (int i = 0; i < employees.size(); i++) { Employee tempEmp = (Employee) employees.get(i); if (tempEmp.getEmployeeId().equals(id)) { employees.remove(i); break; } } } }
ok,搞定,最后的一个效果图如下所示:
通过开始的Struts图结合Demo,可以整体上对Struts2.2开发流程以及请求处理流程有了个认识。
发表评论
-
Struts2标签与JSTL标签混用
2012-07-16 00:07 3005项目中遇到JSTL标签(需要standard.jar和jstl ... -
Struts2.2 OGNL
2012-06-29 01:54 1864OGNL ,作为Struts2 一大亮点,感觉也是 ... -
NoClassDefFoundError: org/apache/commons/io/FileUtils
2012-06-27 00:58 4746在做Struts Demo中出现: Exception ... -
Struts2.2 Tags
2012-06-28 00:48 1862Struts2 标签,这玩意没什么可说的,直接把以前做的 ... -
Struts2.2 Type Conversion
2012-06-26 23:51 2144Struts2 的转换器: ... -
Struts2.2 Localization
2012-06-25 23:55 1726今天来说说Struts2 ... -
Struts2.2 Validation
2012-06-11 00:59 2834数据验证的方式: ... -
Struts2.2 Results Types
2012-06-10 01:11 1708视图返回类型详细的信息可以查看 struts2-c ... -
Struts2.2 Action
2012-06-09 00:13 1842在说 Struts2 中的 Actio ... -
Struts2.2 Interceptors
2012-06-08 01:52 1641AOP 中的 aspect ... -
Struts2.2 Configuration
2012-06-07 23:39 2015在前面的 Struts2.2 CURD Dem ...
相关推荐
##### 5.1 Struts2入门 - **MVC模式简介:** 了解MVC架构的基本概念。 - **Struts2框架:** 学习Struts2的配置与使用。 - **Action类:** 掌握如何定义Action类。 ##### 5.2 Hibernate入门 - **ORM概念:** 了解...
JESD79-2F DDR2 JESD79-3F DDR3 JESD79-4D DDR4 JESD79-5C DDR5 JESD209-2F LPDDR2 JESD209-3C LPDDR3 JESD209-4E LPDDR4 JESD209-4-1A LPDDR4X JESD209-5C LPDDR5(X)
COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,comsol二维光子晶体角态。 单胞能带,超胞能带,边界态以及角态计算。 ,comsol;二维光子晶体;角态;单胞能带;超胞能带;边界态计算,基于Comsol的二维光子晶体角态及能带边界计算研究
六自由度机械臂抓取动作仿真与代码解析:抓取动画、关节参数变化及轨迹图解详解,六自由度机械臂抓取动作仿真指南:掌握两套代码实现动画与轨迹图模拟学习攻略,六自由度机械臂抓取动作仿真-8 两套关于抓取动作的代码,包括抓取动画、关节角、角速度、角加速度的变化仿真、以及抓取轨迹图 简单易懂好上手~ ,六自由度机械臂;抓取动作仿真;抓取动画;关节角变化;角速度角加速度;抓取轨迹图;两套代码;简单易懂好上手,六自由度机械臂抓取动作仿真演示:代码与轨迹图解
ITC网络广播工具软件
Multisim四位密码锁电路仿真设计:设定、开锁与声光报警功能演示资料包,Multisim四位密码锁电路仿真设计:设定、输入、开锁与报警功能详解,附源文件、原理说明书与演示视频,multisim四位密码锁电路仿真设计 功能: 1.通过拨码开关1进行初始密码设定。 2.通过拨码开关2输入密码,实现开锁判断。 3.如果密码正确,LED绿灯亮,表示开锁。 4.如果密码不正确,LED红灯亮,蜂鸣器鸣叫,声光报警。 资料包含:仿真源文件+原理说明书+演示视频 ,四位密码锁电路、Multisim仿真设计、初始密码设定;拨码开关输入;开锁判断;LED灯显示;声光报警;仿真源文件;原理说明书;演示视频,Multisim四位密码锁电路仿真设计:初始密码设置与智能解锁功能的声光报警展示
俗话说,摸鱼摸的好,上班没烦恼,毕竟谁能拒绝带薪拉屎呢(手动狗头) 这是一个云开发职场打工人专属上班摸鱼划水微信小程序源码,没有后台 直接导入微信开发者工具即可运行,UI简约大气漂亮,只需登录微信公众平台配置完合法域名即可轻松上线。 用户进入摸鱼小程序,可以自由设置薪资,上班时间、下班时间、发薪日、 月工作天数以提醒自己摸鱼,全民打酱油,让自己成为摸鱼冠军,《商鞅摸鱼哲学》 摸鱼不是自我放纵,而是个人实力的积蓄,我们的小目标是晚睡晚起 小程序中的今日待办会提醒用户带薪拉屎和闲逛,下方展示的是距离休息日的天数,距离下一次发工资的天数和节日的天数。
【毕业设计】基于Java的开发的一个集合校园二手交易、拼车、失物招领等功能的app_pgj
个人记录:PICkit3离线烧录流程 使用软件:MPLAB X IDE v5.30 记录时间:20250215
基于Matlab代码的电力系统状态估计与实验仿真研究:扩展卡尔曼滤波和无迹卡尔曼滤波在电力系统动态状态估计中的应用及效果分析,Matlab仿真实验研究:基于扩展卡尔曼滤波器与无迹卡尔曼滤波器对电力系统状态估计的影响及验证,状态估计 电力系统状态估计 Matlab代码 实验仿真研究 电力系统由于测量值和传输误差,还有测量噪声的影响,会对状态估计产生影响。 因此,需要对嘈杂的测量进行滤波,以获得准确的电力系统运行动态。 本文使用扩展卡尔曼滤波器(EKF)和无迹卡尔曼滤波器(UKF)来估计电力系统的动态状态。 扩展卡尔曼滤波EKF、无迹卡尔曼滤波UKF 利用扩展的无迹卡尔曼滤波器估计了动力系统的动态状态。 对WECC 3机9总线系统和新英格兰10机39总线系统进行了案例研究。 结果表明EKF和UKF都能准确地估计电力系统的动态状态。 ,核心关键词:状态估计; 电力系统状态估计; Matlab代码; 实验仿真; 测量值误差; 测量噪声; 扩展卡尔曼滤波器(EKF); 无迹卡尔曼滤波器(UKF); 动力系统; 动态状态估计; WECC 3机9总线系统; 新英格兰10机39总线系统。,Matlab
springboot在线考试--
台达DVP EH3与MS300 PLC&变频器通讯程序的全面解决方案,台达DVP EH3与MS300通讯程序:稳定可靠的频率控制与启停管理系统,台达DVP EH3与台达MS300通讯程序(TDEH-9) 可直接用于实际的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等。 程序采用轮询,可靠稳定 器件:台达DVP EH3系列PLC,台达MS300系列变频器,昆仑通态7022Ni 功能:实现频率设定,启停控制,实际频率读取,加减速时间设定。 资料:带注释程序,触摸屏程序,接线和设置说明,后续有技术咨询。 ,核心关键词:台达DVP EH3; 台达MS300; 通讯程序(TDEH-9); 轮询; 稳定; 频率设定; 启停控制; 实际频率读取; 加减速时间设定; 触摸屏程序; 接线方式; 设置说明; 技术咨询。,台达PLC与变频器通讯程序(带注释、触摸屏控制)
项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 个人账户管理:支持用户注册、登录与个人信息编辑;提供密码找回及账号安全保护措施。 声纹采集:利用麦克风设备录制用户的声纹样本;支持多种录音格式和质量调整,确保采集到清晰、准确的声纹数据。 声纹模板库管理:建立和维护一个安全的声纹模板库;支持声纹模板的添加、删除、更新和查询操作。 声纹比对与识别:运用深度学习算法对输入的声纹数据进行特征提取和匹配;实现快速、准确的声纹身份验证。 多场景应用支持:适用于多种场景,如门禁系统、移动支付、远程登录等;可根据实际需求定制开发相应的应用场景。 实时监控与报警:实时监控系统运行状态,包括声纹识别成功率、处理速度等指标;当出现异常情况时,及时发出报警信息。 数据分析与报告生成:收集并分析声纹识别过程中的数据,如识别准确率、处理时间等;根据用户需求输出包含详细图表说明的专业级文档供下载打印保存。 社区互动交流:设立论坛版块鼓励用户分享心得体会讨论热点话题;定期邀请行业专家举办线上讲座传授实用技巧知识。 音乐筛选与推荐:集成音乐平台API,根据用户的浏览习惯和情绪状态推荐背景音乐,增强用户体验。 数据可视化:提供交互式的数据可视化面板,使非技术用户也能轻松理解复杂的数据集,从而做出更明智的决策。
三相与多相开绕组永磁同步电机仿真模型的先进控制策略探讨与实现,三相与多相开绕组永磁同步电机的Simulink仿真模型与先进控制策略研究,开绕组电机,开绕组永磁同步电机仿真模型、simulink仿真 共直流母线、独立直流母线,两相容错,三相容错控制,零序电流抑制,控制策略很多 三相开绕组永磁同步电机,六相开绕组永磁同步电机 五相开绕组永磁同步电机,五相开绕组电机 ,开绕组电机; 永磁同步电机仿真模型; simulink仿真; 共直流母线; 独立直流母线; 两相容错; 三相容错控制; 零序电流抑制; 控制策略; 六相开绕组永磁同步电机; 五相开绕组永磁同步电机,开绕组电机仿真研究:共直流母线与独立直流母线的容错控制策略
【毕业设计】基于Java的开发的网上汽车租赁管理系统_pgj
csv 模块是 Python 的标准库,无需额外安装。 运行结果如下图: ['姓名', '年龄', '城市'] ['张三', '25', '北京'] ['李四', '30', '上海'] ['王五', '22', '广州']
【毕业设计】基于Java+Springboot+Vue的宠物领养系统_pgj
让前端开发者学习“机器学习”!
【毕业设计】基于Java的实现的以宠物为主体的论坛式的APP