Struts2 综合案例

1.总结: 1 ModelDriven 来封装前台数据, 通过struts2的参数拦截器,封装到action中的成员变量中,在写方法中,千万不要写参数否则会报找不到save,update等方法的错误,我找了近近一个小时才找到!

action:

public class EmployeeAction extends ActionSupport implements ModelDriven<Employee>{

	private IEmployeeService employeeService = new EmployeeService();

	/*****封装数据**************/
	private Employee emp = new Employee();
	public void setEmp(Employee emp) {
		this.emp = emp;
	}
	public Employee getEmp() {
		return emp;
	}
	public Employee getModel() {
		return emp;
	}

	public String save(){//不能加参数 save(Employee emp)
		try {
			//1.调用service
			employeeService.save(emp);
			//2.跳转页面
			return list();
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	public String list(){
		try {
			//1.去db中拿所有的员工数据
			List<Employee> lists = employeeService.getAll();
			//2.存入域对象中传到前台去 request域
			ActionContext.getContext().getContextMap().put("lists", lists);

			return "list";
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}
//记住千万不能这样写, public String update(Employee emp){...},否则会报找不到这个方法的错误!参数是前台传过的来的,直接封装到了成员变量中了,
	public String update(){
		try {
			employeeService.update(emp);
			return list();
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	public String edit(){
		try{
			//1.获取当前修改的记录的主键值
			int id =emp.getId();
			//2.调用service查询
			Employee emp = employeeService.findById(id);
			//3. 数据回显 通过值栈
			ValueStack vs = ActionContext.getContext().getValueStack();
			vs.pop();
			vs.push(emp);
			return "update";
		}catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

}

  2.serviceimpl  省略接口

public class EmployeeService implements IEmployeeService {

	IEmployeeDao employeeDao = new EmployeeDao();
	public List<Employee> getAll() {

		return employeeDao.getAll();
	}

	public Employee findById(int id) {

		return employeeDao.findById(id);
	}

	public void save(Employee emp) {
		employeeDao.save(emp);

	}

	public void update(Employee emp) {
		employeeDao.update(emp);

	}

	public IEmployeeDao getEmployeeDao() {
		return employeeDao;
	}

	public void setEmployeeDao(IEmployeeDao employeeDao) {
		this.employeeDao = employeeDao;
	}

}

  3.daoimpl 省略接口

public class EmployeeDao implements IEmployeeDao {

	public List<Employee> getAll() {
		String sql = "select * from employees";
		try {
			return JDBCUtils.getQueryRunner().query(sql, new BeanListHandler<Employee>(Employee.class));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public Employee findById(int id) {
		String sql = "select * from employees where id = ?";
		try {
			return JDBCUtils.getQueryRunner().query(sql, new BeanHandler<Employee>(Employee.class),id);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

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

	}

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

	}

}

  4.数据库连接:

public class JDBCUtils {

	//1.初始化连接池
	private static DataSource dataSource;
	static{
		dataSource = new ComboPooledDataSource();
	}
	public static DataSource getDataSource() {
		return dataSource;
	}
	//2.创建一个DBUtils常用工具类对象
	public static QueryRunner getQueryRunner(){
		return  new QueryRunner(dataSource);
	}
}

  

5. entity 省略setter/getter 方法

public class Employee {
	private int id;
	private String empName;
	private Date workDate;
}

  

二:1.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 	<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>

</web-app>

 2.struts.xml  奇怪为什么package的name一去就报错!!!为什么不是写包名?  s:token 防止request的重复提交一共三步,用session一步搞定!

<?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.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">
				<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>
		</action>
	</package>
</struts>

  3.c3p0-config.xml

<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>

  三:

1.add.jsp

    <s:form action="/emp_save" method="post">
    	<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>

  2.list.jsp

<body>
    <table border="1" align="center">
    	<tr>
    		<th>序号</th>
    		<th>编号</th>
    		<th>员工名</th>
    		<th>入职时间</th>
    		<th>操作</th>
    	</tr>
    	<!-- 先判断后迭代 -->
    	<s:if test="#request.lists !=null">
    		<s:iterator var="emp" value="#request.lists" 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_edit?id=%{#emp.id}">修改</s:a>
    				</td>
    			</tr>
    		</s:iterator>
    	</s:if>
    	<s:else>
    		<tr><td colspan="5">sorry,没有你要的数据</td></tr>
    	</s:else>
    </table>
  </body>

  3.update.jsp

    <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:textfield name="workDate"/></td>
    		</tr>
    		<tr>
    			<td colspan="2"><s:submit value="修改员工"/></td>
    		</tr>
    	</table>
    </s:form>

  四:效果图

1.add.jsp

2. list.jsp

3.edit.jsp

4.update.jsp-->list.jsp

 

时间: 2024-11-05 11:55:31

Struts2 综合案例的相关文章

Ext.js入门:常用组件与综合案例(七)

一:datefield简单示例 二:timefield简单示例 三:numberfield简单示例 四:FormPanel提交 datefield简单示例: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <link href="Ext/resources/css/ext-all.css&

综合案例-整合办公系统后台模块

综合案例-整合办公系统后台模块 1.配置虚拟主机(如www.think.com) 2.配置hosts文件并重启Apache服务器 3.复制ThinkPHP核心文件到项目的目录中(如think目录) 4.创建Zend工程 5.创建index.php入口文件(编写四步走) 6.划分项目前后台模块 设置配置文件(./Application/Common/Conf/config.php) 7.创建Public控制器并定义login方法 编写控制器三步走 8.设置URL调度模式 9.复制模板资源到Publ

Winform开发框架中的综合案例Demo

在实际的系统开发中,我们往往需要一些简单的的案例代码,基于此目的我把Winform开发框架中各种闪光点和不错的功能,有些是我们对功能模块的简单封装,而有些则是引入了一些应用广泛的开源组件进行集成使用,因此把它们做了一个Demo进行展示,以方便我们随时了解和参考,并能够快速应用相应的场景到具体的项目中. 1.闪屏展示界面及主体界面 在很多系统里面,提供一个设计不错的图片作为程序界面展示的效果是挺不错的,这个小程序也不例外,基本上整合了一些WInform界面常用的各种功能. 而整个案例的界面的界面以

DOM综合案例、SAX解析、StAX解析、DOM4J解析

今日大纲 1.DOM技术对xml的增删操作 2.使用DOM技术完成联系人管理 3.SAX和StAX解析 4.DOM4J解析 5.XPATH介绍 1.DOM的增删操作 1.1.DOM的增加操作 /* * 演示使用dom技术给xml中添加标签 * <book> <name id="b001">SSH</name> <author>老于</author> <price>152</price> </boo

JavaEE Tutorials (30) - Duke综合案例研究示例

30.1Duke综合应用的设计和架构456 30.1.1events工程458 30.1.2entities工程459 30.1.3dukes—payment工程461 30.1.4dukes—resources工程461 30.1.5Duke商店工程461 30.1.6Duke货运工程46530.2构建和部署Duke综合案例研究应用467 30.2.1使用NetBeans IDE构建和部署Duke综合应用467 30.2.2使用Maven构建和部署Duke综合应用46730.3运行Duke综合

JavaScript:综合案例-表单验证

综合案例:表单验证 开发要求: 要求定义一个雇员信息的增加页面,例如页面名称为"emp_add.htmnl",而后在此页面中要提供有输入表单,此表单定义要求如下: .雇员编号:必须是4位数字,按照正则进行验证: .雇员姓名:不能为空: .雇员职位:不能为空: .雇员日期:按照"yyyy-mm-dd"的格式编写,按照正则进行验证: .基本工资:按照小数编写,小数为最多2位,按照正则进行验证: .佣金:难找小数编写,小数位数最多2位,按照正则进行验证. 具体步骤: 第一

XML学习总结-DOM和SAX解析-综合案例-(四)

============DOM解析    vs   SAX解析             ======== DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 DOM解析任意读取任何位置的数据,甚至往回读 SAX解析只能从上往下,按顺序读取,不能往回读 DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单. S

Linux学习笔记——例说makefile 综合案例

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.一个较为复杂的例子 [代码仓库]--makefile-example 代码仓库位于bitbucket,可借助Tortoise

C语言基础知识之综合案例(1)

1,在屏幕上显示信息. 最常见的显示信息的方式是使用库函数printf()和puts(). a,转义字符. b,转移说明符. printf()函数位于标准C语言库中,它是最通用的在屏幕上显示信息的方式. #include<stdio.h> void main() { //在屏幕上显示文本信息 very nice ! printf("very nice !"); //显示变量的值 int number = 10; /* 格式化字符串 格式化字符串指定如火如荼格式输出,由以下三