您的位置:首页 > 编程语言 > Java开发

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核心过滤器

<!-- 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息