7、struts2 案例( 模型驱动、 防止表单重复提交--拦截器 、数据回显 、值栈 、 OGNL表达式综合运用)
2016-05-11 01:27
786 查看
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核心过滤器
3、配置struts.xml
4、开发Action
5、开发entity
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接口
dao方法实现
7、导入 JdbcUtils,以及配置好c3p0
c3p0配置文件
8、开发services
9、相关jsp页面
webroot下 add.jsp
WebRoot/WEB-INF 下 list.jsp
WebRoot/WEB-INF 下 update.jsp
技术点:
模型驱动
防止表单重复提交–拦截器
数据回显
值栈
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>
相关文章推荐
- 我是运营,我没有假期
- JQuery+Strusts1.x无刷新登录
- 在线用表单建立文件夹
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- Jquery 表单取值赋值的一些基本操作
- 修复mysql数据库
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- C#中的委托数据类型简介
- SQL Server删除表及删除表中数据的方法
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- Oracle数据库数据丢失恢复的几种方法总结
- javascript 表单的友好用户体现
- js 提交和设置表单的值