7、struts2 案例( 模型驱动、 防止表单重复提交--拦截器 、数据回显 、值栈 、 OGNL表达式综合运用)

struts2 案例

技术点:

模型驱动

防止表单重复提交–拦截器

数据回显

值栈

OGNL表达式

通配符、路径匹配原则、常量

数据处理的集中方式

请求数据自动封装以及类型转换

1、导包

c3p0-0.9.1.2.jar

commons-dbutils-1.6.jar

commons-fileupload-1.2.2.jar

commons-io-2.0.1.jar

commons-lang3-3.1.jar

freemarker-2.3.19.jar

javassist-3.11.0.GA.jar

mysql-connector-java-5.1.12-bin.jar

ognl-3.0.5.jar

struts2-core-2.3.4.1.jar

xwork-core-2.3.4.1.jar

2、配置web.xml 注册struts核心过滤器

<!-- Struts2的功能的初始化是通过过滤器引入 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3、配置struts.xml

<struts>
    <!-- 更改主题 -->
    <constant name="struts.ui.theme" value="simple"></constant>

    <package name="emp" extends="struts-default">

        <!-- 全局视图 -->
        <global-results>
            <result name="error">/error/error.jsp</result>
        </global-results>

        <action name="emp_*" class="cn.itcast.action.EmployeeAction" method="{1}">

            <!-- 防止表单重复提交,第二步: 配置" 防止表单重复提交拦截器" -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="token">
                <!-- 指定拦截哪些方法需要防止表单重复提交(save) -->
                <param name="includeMethods">save</param>
            </interceptor-ref>

            <!-- 防止表单重复提交,第三步: 如果用户重复提交了跳转到指定的错误页面  -->
            <result name="invalid.token" type="redirectAction">emp_list</result>

            <!-- 首页显示 -->
            <result name="list">/WEB-INF/list.jsp</result>

            <!-- 进入修改页面 -->
            <result name="update">/WEB-INF/update.jsp</result>

            <!--
            <result name="addsuccess" type="redirectAction">emp_list</result>
             -->
        </action>

    </package>
</struts>

4、开发Action

  /**
 * 员工管理Action
 *
 */
public class EmployeeAction extends ActionSupport implements ModelDriven<Employee>{

    /****封装数据****/
    private Employee employee = new Employee();
    public Employee getEmployee() {
        return employee;
    }
    public void setEmployee(Employee employee) {
        this.employee = employee;
    }
    // 重写模型驱动方法
    @Override
    public Employee getModel() {
        return employee;
    }

    /****调用的Service****/
    private IEmployeeService employeeService = new EmployeeService();

    /**
     * 1. 添加员工
     */
    public String save() {
        try {
            // 调用service保存
            employeeService.save(employee);
            // 添加成功,去到列表页面
            return list();
            //return "addsuccess";
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
    }

    /**
     * 2. 列表显示
     */
    public String list() {
        try {
            // 查询全部
            List<Employee> listEmp = employeeService.getAll();
            // 保存到request域
            ActionContext.getContext().getContextMap().put("listEmp", listEmp);
            return "list";
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
    }

    /**
     * 3. 进入修改页面
     */
    public String viewUpdate() {
        try {
            // 3.1 获取当前修改的记录的主键值
            int id = employee.getId();
            // 3.2 service查询
            Employee emp = employeeService.findById(id);
            // 3.3 数据回显
            // a. 先得到值栈
            ValueStack vs = ActionContext.getContext().getValueStack();
            vs.pop();   //移除栈顶元素
            vs.push(emp);   // emp对象放入栈顶

            return "update";
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
    }

    /**
     * 4. 修改员工
     */
    public String update() {
        try {
            // 调用service修改
            employeeService.update(employee);
            return list();
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
    }
}

5、开发entity

public class Employee {

    private int id;// INT PRIMARY KEY AUTO_INCREMENT,
    private String empName;// VARCHAR(20),
    private Date workDate;// DATE -- 入职时间

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public Date getWorkDate() {
        return workDate;
    }
    public void setWorkDate(Date workDate) {
        this.workDate = workDate;
    }

}

6、开发dao

创建 – 创建数据库

CREATE DATABASE hib_demo DEFAULT CHARACTER SET utf8;

– 建表

CREATE TABLE employee (

id INT PRIMARY KEY AUTO_INCREMENT,

empName VARCHAR(20),

workDate DATE – 入职时间

)

dao接口

/**
 * 数据访问层接口
 *
 *
 */
public interface IEmployeeDao {

    /**
     * 查询全部员工
     */
    List<Employee> getAll();

    /**
     * 根据主键查询
     */
    Employee findById(int id);

    /**
     * 添加员工
     */
    void save(Employee emp);

    /**
     * 修改员工
     */
    void update(Employee emp);

}

dao方法实现

public class EmployeeDao implements IEmployeeDao{

    @Override
    public Employee findById(int id) {
        String sql = "select * from employee where id=?";
        try {
            return JdbcUtils.getQuerrRunner().query(sql, new BeanHandler<Employee>(Employee.class),id);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Employee> getAll() {
        String sql = "select * from employee";
        try {
            return JdbcUtils.getQuerrRunner().query(sql, new BeanListHandler<Employee>(Employee.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void save(Employee emp) {
        String sql = "insert into employee(empName,workDate) values(?,?)";
        try {
            JdbcUtils.getQuerrRunner().update(sql, emp.getEmpName(),emp.getWorkDate());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public void update(Employee emp) {
        String sql = "update employee set empName=?,workDate=? where id=?";
        try {
            JdbcUtils.getQuerrRunner().update(sql, emp.getEmpName(),emp.getWorkDate(),emp.getId());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

}

7、导入 JdbcUtils,以及配置好c3p0

  /**
 * 封装常用的操作
 *
 */
public class JdbcUtils {

    // 初始化连接池
    private static DataSource dataSource;
    static {
        dataSource = new ComboPooledDataSource();
    }

    public static DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 创建DbUtils常用工具类对象
     */
    public static QueryRunner getQuerrRunner() {
        return new QueryRunner(dataSource);
    }

}

c3p0配置文件

<c3p0-config>
  <default-config>
     <property name="driverClass">com.mysql.jdbc.Driver</property>
     <property name="jdbcUrl">jdbc:mysql:///hib_demo</property>
     <property name="user">root</property>
     <property name="password">root</property>
     <property name="initialPoolSize">5</property>
     <property name="maxPoolSize">10</property> 

  </default-config>

  <named-config name="oracleConfig">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
     <property name="jdbcUrl">jdbc:mysql:///day17</property>
     <property name="user">root</property>
     <property name="password">root</property>
     <property name="initialPoolSize">5</property>
     <property name="maxPoolSize">10</property>
   </named-config>

</c3p0-config>

8、开发services

/**
 * 业务逻辑层接口
 *
 *
 */
public interface IEmployeeService {

    /**
     * 查询全部员工
     */
    List<Employee> getAll();

    /**
     * 根据主键查询
     */
    Employee findById(int id);

    /**
     * 添加员工
     */
    void save(Employee emp);

    /**
     * 修改员工
     */
    void update(Employee emp);

}
public class EmployeeService implements IEmployeeService{

    private IEmployeeDao employeeDao = new EmployeeDao();

    @Override
    public Employee findById(int id) {
        try {
            return employeeDao.findById(id);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Employee> getAll() {
        try {
            return employeeDao.getAll();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void save(Employee emp) {
        try {
            employeeDao.save(emp);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public void update(Employee emp) {
        try {
            employeeDao.update(emp);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

}

9、相关jsp页面

webroot下 add.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Add</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>

  <body>
    <s:form action="/emp_save" method="post">
        <!-- 防止表单重复提交,第一步:生成id(客户端、服务器) -->
        <s:token></s:token>

        <table>
            <tr>
                <td>员工名:</td>
                <td><s:textfield name="empName" /></td>
            </tr>
            <tr>
                <td>日期:</td>
                <td><s:textfield name="workDate" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    <s:submit value="保存员工"></s:submit>
                </td>
            </tr>
        </table>
    </s:form>
  </body>
</html>

WebRoot/WEB-INF 下 list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>list</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>

  <body>
     <table border="1" align="center">
        <tr>
            <th>序号</th>
            <th>编号</th>
            <th>员工名称</th>
            <th>日志日期</th>
            <th>操作</th>
        </tr>
        <!-- 1. 先判断;2.  再迭代 -->
        <s:if test="#request.listEmp != null">
            <s:iterator var="emp" value="#request.listEmp" status="st">
                <tr>
                    <td><s:property value="#st.count"/></td>
                    <td><s:property value="#emp.id"/></td>
                    <td><s:property value="#emp.empName"/></td>
                    <td><s:property value="#emp.workDate"/></td>
                    <td>
                        <s:a href="emp_viewUpdate?id=%{#emp.id}">修改</s:a>
                    </td>
                </tr>
            </s:iterator>
        </s:if>
        <s:else>
            <tr>
                <td colspan="5">对不起,没有你要显示的数据</td>
            </tr>
        </s:else>
     </table>
  </body>
</html>

WebRoot/WEB-INF 下 update.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Add</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>

  <body>
    <s:form action="/emp_update" method="post">
        <!-- 隐藏域,保存主键 -->
        <s:hidden name="id"></s:hidden>

        <table>
            <tr>
                <td>员工名:</td>
                <td><s:textfield name="empName" /></td>
            </tr>
            <tr>
                <td>日期:</td>
                <!--
                <td><s:date name="workDate" format="yyyy-MM-dd"/>
                    <s:hidden name="workDate"></s:hidden>
                </td>
                 -->
                 <td>
                    <s:textfield name="workDate" />
                 </td>
            </tr>
            <tr>
                <td colspan="2">
                    <s:submit value="修改员工"></s:submit>
                </td>
            </tr>
        </table>
    </s:form>
  </body>
</html>
时间: 2024-10-04 17:43:22

7、struts2 案例( 模型驱动、 防止表单重复提交--拦截器 、数据回显 、值栈 、 OGNL表达式综合运用)的相关文章

struts2 自带的 token防止表单重复提交拦截器

在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name="token"></interceptor-ref> <result name="invalid.token">/error.jsp</result> 2. 增加error.jsp文件,代码如下:  <h1>禁止重复提交&l

【struts2】struts防止表单重复提交

一.概述 表单重复提交已经存在很久了,也有很多讨论.防止表单重复提交主要是防止"服务器处理慢时的页面刷新",以及浏览器后退后再次提交,甚至是点击提交按钮的时候手快点了很多次. 常用的JS将提交按钮设置成disabled,这种防止不了页面刷新,重定向防止不了浏览器后退后重复提交,两者结合也没用. struts2采用的是页面hidden+session来实现防止重复提交,通过拦截器token或或tokenSession来说hi线,其思想很简单,本文主要是讨论实现代码中涉及的细节. 二.原理

session案例:防止表单重复提交、一次性校验码

session案例1:防止表单重复提交 原理: 1,表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号. 2,当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号. 3,在下列情况下,服务器程序将拒绝用户提交的表单请求

[原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

【Struts2】防止表单重复提交

一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) 解决方案: 在页面上生成一个令牌(就是一个随机字符串),将其存储到session中,并在表单中携带. 在服务器端,获取数据时,也将令牌获取,将它与session中存储的token对比,没问题,将session中令牌删除. 二.Struts2中解决方案 struts2中怎样解决表单重复提交: 在strut

12-struts2防止表单重复提交

防止表单重复提交 问题:什么是表单重复提交? regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) 解决方案: 在页面上生成一个令牌(就是一个随机字符串),将其存储到session中,并在表单中携带. 在服务器端,获取数据时,也将令牌获取,将它与session中存储的token对比,没问题, 将session中令牌删除. struts2中怎样解决表单重复提交: 在struts2中解决表单重复提交,可以使用它定义的一个i

session,url重写,防止表单重复提交

Session入门_session原理 1.Session概述 1.在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象), 注意:一个浏览器独占一个session对象(默认情况下). 2.Session 是一个域 1.作用范围:一个浏览器和服务器会话范围 2.生命周期: 创建 当程序第一次调用到request.getSession()方法时说明客户端明确的需要用到session此时创建出对应客户端的Session对象. request.getSession()=req

避免表单重复提交与等待页面

一.为什么会出现表单重复提交    1.当用户在表单中填写完信息,点击提交按钮后,肯能会因为没有看到成功信息而在此点击提交按钮,从而导致在服务器端收到两条同样的信息,如果这个信息要保存到数据库中的,那么就会出现两条重复的数据,或者可能出现数据库操作异常. 2.当用户填写表单信息完成后,点击表单提交,即使响应及时,也有可能会出现表单重复提交的情况.一般服务器端的程序在处理完用户提交的信息后,调用的是Request.Dispatcher.forward()方法将用户的请求导向成功页面,用户看到成功信

Struts2(八)之UI标签和防止表单重复提交

一.UI标签 1.1.struts2中UI标签的优势 自动的数据回显和错误提示功能 自带的简单样式和排版 1.2.UI案例 结果: 1.3.UI标签的主题 1.3.1.struts2中默认的主题 默认主题的名称是XHTML,都是在struts的默认属性文件中定义着:default.properties 默认模板存放位置: 1.3.2.更改默认主题 1.更改表单某个元素的默认主题:使用的是表单元素的theme属性. 2.更改表单所有主题:使用的是form标签的theme属性. 3.更改全站所有表单