本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.代码结构

2.代码

 package com.jason.strut2.curd;

 public class EmployeeBean {

     private Integer employeeId;
private String firstNmame;
private String lastName;
private String email; public Integer getEmployeeId() {
return employeeId;
} public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
} public String getFirstNmame() {
return firstNmame;
} public void setFirstNmame(String firstNmame) {
this.firstNmame = firstNmame;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public EmployeeBean(Integer employeeId, String firstNmame, String lastName,
String email) {
super();
this.employeeId = employeeId;
this.firstNmame = firstNmame;
this.lastName = lastName;
this.email = email;
} public EmployeeBean() {
super();
} }

EmployeeBean

 package com.jason.strut2.curd;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Dao { private static Map<Integer, EmployeeBean> employees = new HashMap<Integer, EmployeeBean>(); static{ employees.put(1001, new EmployeeBean(1001,"AA","aa","AA@163.com"));
employees.put(1002, new EmployeeBean(1002,"BB","bb","BB@163.com"));
employees.put(1003, new EmployeeBean(1003,"CC","cc","CC@163.com"));
employees.put(1004, new EmployeeBean(1004,"DD","dd","DD@163.com"));
employees.put(1005, new EmployeeBean(1005,"EE","ee","EE@163.com")); } //查看
public List<EmployeeBean> getEmployees(){
return new ArrayList<>(employees.values());
} //删除
public void delete(Integer id){
employees.remove(id);
} //保存
public void save(EmployeeBean employeeBean){
long time = System.currentTimeMillis();
employeeBean.setEmployeeId((int) time);
employees.put(employeeBean.getEmployeeId(), employeeBean); } //获取
public EmployeeBean get(Integer employeeId){ return employees.get(employeeId);
} //更新
public void update(EmployeeBean employeeBean){
employees.put(employeeBean.getEmployeeId(), employeeBean);
} }

Dao

 package com.jason.strut2.curd;

 import java.util.Map;

 import org.apache.struts2.interceptor.RequestAware;

 public class EmployeeAction implements RequestAware {

     private Dao dao = new Dao();
private Map<String, Object> requestMap; // 需要在当前的 EmployeeAction 中定义employeeId 属性,以接收页面请求参数:删除操作
private Integer employeeId; public String list() { requestMap.put("emps", dao.getEmployees());
return "list";
} public String delete() { dao.delete(employeeId);
// 返回结果的类型应为 :redirectAction,也可以是chain:实际chain 是没有必要
// 还有,若使用chain 则到达目标页面后,地址栏显示的依然是 删除 的那个连接,刷新时 会有重复提交
return "delete";
} @Override
public void setRequest(Map<String, Object> requestMap) {
this.requestMap = requestMap;
} public Integer getEmployeeId() {
return employeeId;
} public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
} }

EmployeeAction

 <%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <a href="emp-list">List All Employees</a> </body>
</html>

web.xml

  

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.action.extension" value="action,do,"></constant>
<package name="default" namespace="/" extends="struts-default"> <action name="emp-*" class="com.jason.strut2.curd.EmployeeAction" method="{1}">
<result name="{1}">/emp-{1}.jsp</result>
<result name="delete" type="redirectAction">emp-list</result>
</action> </package>
</struts>

struts.xml

 <%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <a href="emp-list">List All Employees</a> </body>
</html>

index.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <table cellpadding="10" cellspacing="0" border="1">
<thead>
<tr>
<td>ID</td>
<td>FirstName</td>
<td>LastName</td>
<td>Email</td>
<td>Edit</td>
<td>Delete</td>
</tr>
</thead>
<tbody>
<s:iterator value="#request.emps">
<tr>
<td>${employeeId}</td>
<td>${firstName}</td>
<td>${lastName}</td>
<td>${email}</td>
<td><a href="">Eidt</a></td>
<td><a href="emp-delete?employeeId=${employeeId }">Delete</a></td>
</tr>
</s:iterator>
</tbody> </table> </body>
</html>

emp-list.jsp

3.Struts2 运行流程图-1

  

4.Params 拦截器:

Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

5.ModelDriven拦截器

  1)当用户触发 add 请求时, ModelDriven 拦截器将调用 EmployeeAction 对象的 getModel() 方法, 并把返回的模型(Employee实例)压入到 ValueStack 栈.

  2)接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Employee)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

  Action 实现ModelDriven 接口后的运行流程

 

 @Override
public String intercept(ActionInvocation invocation) throws Exception { //获取Action 对象:EmployeeAction对象,此时该Action 已经实现了ModelDriven 接口
//public class EmployeeAction implements RequestAware ,ModelDriven<EmployeeBean>
Object action = invocation.getAction();
//判断:action是否是ModelDriven 的实例
if (action instanceof ModelDriven) {
//强制转换 ModelDriven 类型
ModelDriven modelDriven = (ModelDriven) action;
//获取值栈
ValueStack stack = invocation.getStack();
//调用 ModelDriven 接口的getModel()方法
//即 调用 EmployeeAction 的 getModel()方法
/*
* @Override
public EmployeeBean getModel() {
employeeBean = new EmployeeBean();
return employeeBean;
} */ Object model = modelDriven.getModel();
if (model != null) {
//把getModel 的返回值压入到值栈的栈顶:实际压入的是employeeAction 的成员变量,employeeBean
stack.push(model);
}
if (refreshModelBeforeResult) {
invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
}
}
return invocation.invoke();
} //执行:PramaterInterception 的intercept() 方法:把请求的参数的值赋给栈顶对象,对应的属性,
//若栈顶对象没有对应的属性,则查询值栈中的下一个对象,直到找到此属性,赋值。 注意:getModel()方法不能如下实现
  因为 可以将此对象压入值栈的栈顶;但是当前的Action 成员变量是 null;
  public EmployeeBean getModel() {
  return new Employee();
}
 

  

实现modelDriven 接口

 package com.jason.strut2.curd;

 import java.util.Map;

 import org.apache.struts2.interceptor.RequestAware;

 import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack; public class EmployeeAction implements RequestAware ,ModelDriven<EmployeeBean>{ private Dao dao = new Dao();
private Map<String, Object> requestMap;
private EmployeeBean employeeBean; // 需要在当前的 EmployeeAction 中定义employeeId 属性,以接收页面请求参数:删除操作 public String list() { requestMap.put("emps", dao.getEmployees());
return "list";
} //删除
public String delete() { dao.delete(employeeBean.getEmployeeId());
// 返回结果的类型应为 :redirectAction,也可以是chain:实际chain 是没有必要
// 还有,若使用chain 则到达目标页面后,地址栏显示的依然是 删除 的那个连接,刷新时 会有重复提交
return "success";
} public String save(){ //1.获取请求参数:通过定义属性的方式
//2.调用DAO的 svae 方法 dao.save(employeeBean);
//3.通过redirectAction 的方式响应结果给 emp-list
return "success";
} @Override
public void setRequest(Map<String, Object> requestMap) {
this.requestMap = requestMap;
} @Override
public EmployeeBean getModel() {
employeeBean = new EmployeeBean();
return employeeBean;
} }

public class EmployeeAction implements RequestAware ,ModelDriven

图示说明:

  

[原创]java WEB学习笔记65:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) ModelDriven拦截器 paramter 拦截器的更多相关文章

  1. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. MyBatis-Plus学习笔记(1):环境搭建以及基本的CRUD操作

    MyBatis-Plus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,使用MyBatis-Plus时,不会影响原来Mybatis方式的使用. SpringBoot+M ...

  3. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. Java后台处理框架之struts2学习总结

    Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...

  6. 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用

    目录 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用 24.1 expect实现无交互登录 24.1.1 安装和使用expect 24.2 正则表达式的使用 24 ...

  7. 学习笔记:CentOS7学习之二十:shell脚本的基础

    目录 学习笔记:CentOS7学习之二十:shell脚本的基础 20.1 shell 基本语法 20.1.1 什么是shell? 20.1.2 编程语言分类 20.1.3 什么是shell脚本 20. ...

  8. 学习笔记:CentOS7学习之十九:Linux网络管理技术

    目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...

  9. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用

    目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...

随机推荐

  1. Git相关的项目

    1.posh-git Git的PowerShell扩展 项目地址: https://github.com/dahlbyk/posh-git 可以用psget快速安装扩展模块,psget下载安装地址 h ...

  2. java BufferedWriter and BufferedReader

    //Listing 5-2. Demonstrating the BufferedWriter and BufferedReader Classes import java.io.BufferedRe ...

  3. QOS

    QoS控制原理 · 基于设备的QoS保障技术——CAC· 基于优先级设置的QoS保障技术· 基于减小抖动的QoS保障-Jitter BufferIP传输在时延.抖动.丢包率方面的性能不及TDM传输,而 ...

  4. VirtualBox 使用技巧

    一.VirtualBox 的快捷键 VirtualBox 默认的 Host 键是 Right Ctrl Host 键可以点击 Oracle VM VirtualBox 管理器的左上角 “管理”-> ...

  5. C/C++链表操作(面试)

    1.为了反转这个单链表,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3 ...

  6. window平台安装MongoDB

    官网:www.mongodb.org 安装-->设置环境变量-->启动 1.下载: 根据系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按提示安装即可, 2.设置安装目 ...

  7. linux pipe

    1. 函数说明 pipe(建立管道): 1) 头文件 #include<unistd.h> 2) 定义函数: int pipe(int filedes[2]); 3) 函数说明: pipe ...

  8. (leetcode)Reverse Linked List 脑子已经僵住

    Reverse a singly linked list. 参考http://www.2cto.com/kf/201110/106607.html 方法1: 讲每个节点的指针指向前面就可以. /** ...

  9. block iOS 块

    block 是个很陌生的东西啊.以前没有学会,现在再看它,还是觉得很稀奇古怪. 无奈,之后硬着头皮学了.. //有参返回值 格式: 返回值类型 (^变量名)(参数类型及个数) = ^(形参列表){ 代 ...

  10. asp.net中iframe页面用jQuery向父页面传值

    在asp.net页面有时一个页面会通过iframe嵌套另一个页面,下面的例子讲述的是被嵌套的iframe页面向父页传值的一种方式,用jQuery即可. iframe页面代码: <!DOCTYPE ...