声明:此文是原创,如果需要转载请注明出处:https://blog.csdn.net/hunter_max/article/details/80575542

上一篇博客《Struts2 注解开发的简单应用实现》介绍了Struts2 注解开发的简单应用,此篇文章则用来实现一个小项目完成Struts2注解开发的简单的增删改查。

因为上一篇博客已经讲了基本的配置,这里就不赘述了。
此项目用的数据库表是product,要实现的功能是:
1.对product表的各栏数据循环输出显示,

2.对上面数据实现增删改功能。

以下是步骤:
1.修改pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>Struts2_study</artifactId><groupId>Struts2_study</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>Struts2_study_05</artifactId><packaging>war</packaging><name>Struts2_study_05</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.5.10</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId><version>2.5.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.33</version></dependency></dependencies><build><finalName>Struts2_study_05</finalName><!--使用的插件列表--><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><!--配置 --><configuration><!--端口号 --><port>8066</port><path>/</path></configuration></plugin></plugins></build>
</project>

修改WEB-INF目录下的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><filter><filter-name>strtus2</filter-name><filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>strtus2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

resources目录(resources目录需要自己创建,并且把目录改成resource root)下新建struts.xml文件,代码如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""http://struts.apache.org/dtds/struts-2.5.dtd"><struts><!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 --><constant name="struts.i18n.encoding" value="UTF-8" /><!--该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开--><constant name="struts.action.extension" value="do,action,htm" /><!-- strtus2 开放动态方法访问 DMI--><constant name="struts.enable.DynamicMethodInvocation" value="true"/></struts>

2.创建需要的数据库product,创建product的dao层,entity层,service层。
这三样都是很基础的了,就直接贴上代码了。

首先是目录结构

ProductEntity的代码(我这里为了方便,只设置了四个属性,其中productid是主键,自增长。):

package com.hunter.entity;import java.io.Serializable;/*** Created by hunter on 2018/6/3.*/
public class ProductEntity implements Serializable {private int productid;private String productname;private double productprice;private int productnum;public int getProductid() {return productid;}public void setProductid(int productid) {this.productid = productid;}public String getProductname() {return productname;}public void setProductname(String productname) {this.productname = productname;}public double getProductprice() {return productprice;}public void setProductprice(double productprice) {this.productprice = productprice;}public int getProductnum() {return productnum;}public void setProductnum(int productnum) {this.productnum = productnum;}
}

BaseDAO的代码:

package com.hunter.dao;import java.io.Serializable;
import java.sql.*;
import java.util.List;public abstract class BaseDAO<T extends Serializable> {private String driver = "com.mysql.jdbc.Driver";private String url = "jdbc:mysql://localhost:3306/goods";private String user = "root";private String password = "123456";private Connection conn = null;private PreparedStatement ps = null;private ResultSet rs = null;/*** 打开数据连接*/public Connection OpenConnection(){try {Class.forName(driver);conn = DriverManager.getConnection(url,user,password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 设置参数* @param ps* @param objects* @throws SQLException*/public void setPram(PreparedStatement ps,Object[] objects) throws SQLException {if(null != objects){for (int i = 0;i<objects.length;i++){ps.setObject(i+1,objects[i]);}}}/***  查询* @param sql sql语句* @param objects 参数* @return 执行是否成功*/public List<T> executeQuery(String sql, Object[] objects){OpenConnection();try {ps = conn.prepareStatement(sql);setPram(ps,objects);rs = ps.executeQuery();return rsToList(rs);}catch (SQLException e){e.printStackTrace();}finally {try {closeConnection();} catch (SQLException e) {e.printStackTrace();}}return null;}public abstract List<T> rsToList(ResultSet rs) throws SQLException;public int executeUpdate(String sql,Object[] objects){int flag = -1;OpenConnection();try {ps = conn.prepareStatement(sql);setPram(ps,objects);flag = ps.executeUpdate();}catch (SQLException e){e.printStackTrace();}finally {try {closeConnection();} catch (SQLException e) {e.printStackTrace();}}return flag;}/**** 关闭数据操作* @throws SQLException*/public void closeConnection() throws SQLException {if(null != rs)rs.close();if(null != ps)ps.close();if(null != conn)conn.close();}
}

然后是ProductDAOImpl代码:

package com.hunter.dao;import com.hunter.entity.ProductEntity;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** Created by hunter on 2018/6/3.*/
public class ProductDAOImpl extends BaseDAO<ProductEntity> {@Overridepublic List<ProductEntity> rsToList(ResultSet rs) throws SQLException {List<ProductEntity> list=new ArrayList<>();while (rs.next()){ProductEntity p=new ProductEntity();p.setProductid(rs.getInt("productid"));p.setProductname(rs.getString("productname"));p.setProductprice(rs.getDouble("productprice"));p.setProductnum(rs.getInt("productnum"));list.add(p);}return list;}
}

ProductService代码:

package com.hunter.service;import com.hunter.dao.ProductDAOImpl;
import com.hunter.entity.ProductEntity;import java.util.List;/*** Created by hunter on 2018/6/3.*/
public class ProductService {private ProductDAOImpl dao=new ProductDAOImpl();//查询商品信息(此demo没有用到这个方法)public ProductEntity query_by_id(int a){String sql="select * from product where productid=?";List<ProductEntity> list=dao.executeQuery(sql,new Object[]{a});if (list.size()>0){return list.get(0);}else return null;}//显示商品信息public List<ProductEntity> showall(){String sql="select * from product";return dao.executeQuery(sql,null);}//删除商品信息public int delete_by_id(ProductEntity a){String sql="delete from product where productid=?";Object[] objects=new Object[]{a.getProductid()};return dao.executeUpdate(sql,objects);}//修改商品信息public int update_by_id(ProductEntity p){String sql="update product set productname=?,productprice=?,productnum=? where productid=?";Object[] objects=new Object[]{p.getProductname(),p.getProductprice(),p.getProductnum(),p.getProductid()};return dao.executeUpdate(sql,objects);}//增加商品信息public int add_product(ProductEntity p){String sql="insert into product (productname,productprice,productnum) values(?,?,?)";Object[] objects=new Object[]{p.getProductname(),p.getProductprice(),p.getProductnum()};return dao.executeUpdate(sql,objects);}
}

数据库我用的是mysql,表很简单,就贴个图吧:

3.以上数据库和entity,dao,service层都创建好后,就开始Struts2 注解开发实现简单的增删改查了。

我这里项目的思路是进入默认的index.jsp 页面后,创建一个提交按钮(点击进入商品显示页面),提交后会进入Action("showall"),代码如下:

@Action("showall")
public String showall(){List<ProductEntity> list=service.showall();list_product= list;/*request.put("Product",list);*/return "show";
}

结果返回的路径是:

@Result(name = "show",location = "/view/show.jsp"),

这里,贴上index.jsp的代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/showall.action"><button type="submit">进入商品信息页面</button>
</form>
</body>
</html>

结果返回的路径show.jsp代码,基本上做了详细的注释:

<%--Created by IntelliJ IDEA.User: hunterDate: 2018/6/3Time: 22:58To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--这里是声明使用的标签是Struts2标签--%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>Title</title>
</head>
<body>
<%--这是增加了一个跳转到添加商品页面的超链接--%>
<a href="${pageContext.servletContext.contextPath}/view/add.jsp">添加</a>
<table border="2px" width="500px"><tr><td>商品编号</td><td>商品名称</td><td>商品价格</td><td>商品数量</td><td>操作</td></tr><%--这里用的是s:iterator标签,其中,value表示的是被迭代的集合,从后台返回的结果集;var表示的是页面用于迭代使用的代替名称,就相当于你给返回的结果集起个别名;statue是迭代元素的索引--%><s:iterator value="%{list_product}" var="p" status="status"><%--这里就是对返回的结果集以table的表现方式进行遍历--%><tr><td><s:property value="%{#p.productid}"/> </td><td><s:property value="%{#p.productname}"/></td><td><s:property value="%{#p.productprice}"/></td><td><s:property value="%{#p.productnum}"/></td><td><%--这里对修改和删除设置了超链接,分别跳转到修改页面和delete的Action,并且将productid的值传到下一个界面/Action。--%><a href="${pageContext.servletContext.contextPath}/view/update.jsp?productid=${p.productid}">修改</a> <a href="${pageContext.servletContext.contextPath}/delete.action?productid=${p.productid}">删除</a></td></tr></s:iterator>
</table></body>
</html>

然后是add.jsp

<%--Created by IntelliJ IDEA.User: hunterDate: 2018/6/3Time: 22:58To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%--跳转到add的Action中,并将productname,productprice,productnum获取的值传入--%>
<form method="post" action="${pageContext.servletContext.contextPath}/add.action"><table><tr><td>商品名称</td><td><input type="text" name="productname"></td></tr><tr><td>商品价格</td><td><input type="text" name="productprice"></td></tr><tr><td>商品数量</td><td><input type="text" name="productnum"></td></tr></table><button type="submit">提交</button>
</form></body>
</html>

update.jsp

<%--Created by IntelliJ IDEA.User: hunterDate: 2018/6/4Time: 1:46To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form method="post" action="${pageContext.servletContext.contextPath}/update.action?productid=${param.productid}"><h4>现在开始修改商品编号为:${param.productid}的商品信息</h4><table><tr><td>商品名</td><td><input type="text" name="productname"></td></tr><tr><td>商品价格</td><td><input type="text" name="productprice"></td></tr><tr><td>商品数量</td><td><input type="text" name="productnum"></td></tr></table><button type="submit">提交修改</button></form>
</body>
</html>

最后就是最重要的ProductAction:

package com.hunter.actions;import com.hunter.entity.ProductEntity;
import com.hunter.service.ProductService;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.*;
import org.apache.struts2.interceptor.RequestAware;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;/*** Created by hunter on 2018/6/3.*/
@ParentPackage("struts-default")
@Namespace("/")
@Results({@Result(name = "show",location = "/view/show.jsp"),@Result(name = "update",location = "showall",type = "chain"),@Result(name = "add",location = "showall",type = "chain"),@Result(name = "update",location = "showall",type = "chain")})
public class ProductAction extends ActionSupport implements RequestAware {private ProductService service=new ProductService();private Map<String, Object> request;private List<ProductEntity> list_product=new ArrayList<>();private ProductEntity product;private int productid;private String productname;private Double productprice;private int productnum;public String getProductname() {return productname;}public void setProductname(String productname) {this.productname = productname;}public Double getProductprice() {return productprice;}public void setProductprice(Double productprice) {this.productprice = productprice;}public int getProductnum() {return productnum;}public void setProductnum(int productnum) {this.productnum = productnum;}public int getProductid() {return productid;}public void setProductid(int productid) {this.productid = productid;}public List<ProductEntity> getList_product() {return list_product;}public void setList_product(List<ProductEntity> list_product) {this.list_product = list_product;}public ProductEntity getProduct() {return product;}public void setProduct(ProductEntity product) {this.product = product;}@Overridepublic void setRequest(Map<String, Object> request) {this.request=request;}@Action("showall")public String showall(){List<ProductEntity> list=service.showall();list_product= list;/*request.put("Product",list);*/return "show";}@Action("delete")public String delete_product(){ProductEntity product=new ProductEntity();System.out.println(productid);product.setProductid(productid);service.delete_by_id(product);return "update";}@Action("add")public String add_product(){ProductEntity product=new ProductEntity();product.setProductname(productname);product.setProductprice(productprice);product.setProductnum(productnum);service.add_product(product);return "add";}@Action("update")public String update_product(){ProductEntity product=new ProductEntity();product.setProductname(productname);product.setProductprice(productprice);product.setProductnum(productnum);product.setProductid(productid);service.update_by_id(product);return "update";}
}

在ProductAction中,我在@Result里面添加了type="chain",这个应该是个需要注意的点,在这里解释下。在此项目中,我把所有的商品信息都显示后,在对商品信息做添加,修改,删除的时候,我的目的是添加/修改/删除完商品就立马显示所有的商品信息,但这里我只在jsp页面中发送过一次提交。在此提交是进入其对应的Action中(add/update/delete),而显示所有的商品信息需要调用Action("show")。所以此时type="chain"的作用就出来了。

这里调用下chain的解释:

Chain:基本用途是构造成一条动作链。前一个动作将控制权转交给后一个动作,而前一个动作的状态在后一个动作里仍然保持着。动作链由Chaining拦截器负责处理,因为这个拦截器是defaultStack拦截器栈的一份子,多以你随时都可以使用动作链。

个人理解,在这里,chain的作用就是当一个Action结束后,返回result,这个result跳转的location不是一个jsp,而是一个Action方法,差不多理解成是Action跳转到Action,然后在把结果返回到jsp页面吧。
这应该是编程时需要注意的一个问题。

最后附上运行的界面:

进入商品信息页面:

添加操作:

提交返回结果:

修改大西瓜成小西瓜:

提交修改:

删除小西瓜,点击删除:

至此,Struts2注解开发实现简单的增删改查就完成了。由于本人也还是新手一枚,文中有些概念的描述或者讲解错误的地方敬请提出,这也是一个相互学习的途径,谢谢~

最后,如果我的这篇文章对您有帮助,欢迎扫一扫关注我的公众号,第一时间获取最新干货

Struts2 注解开发实现简单的增删改查,超详细教程相关推荐

  1. mybatis学习4之使用注解开发实现简单的增删改查

    前言 使用注解完成简单的增删改查操作 本质:反射机制的体现 原理:动态代理 一.需要注意什么 1.注解在接口上实现 2.需要在核心配置文件上绑定接口,使用类绑定或者包绑定时,接口和它的Mapper配置 ...

  2. .net开发下简单的增删改查

    前台页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TeachingP ...

  3. mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数

    mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...

  4. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] arg ...

  5. 使用 NodeJS+Express+MySQL 实现简单的增删改查

    关于node.js暂时记录如下,以后有时间一定学习 文章来自简书,作者:sprint,2016-07 使用 Node.js + Express+MySQL 实现简单的增删改查 https://www. ...

  6. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)...

    此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...

  7. Springboot整合JDBC和DBUtils,实现简单的增删改查.

    Springboot整合JDBC和DBUtils,实现简单的增删改查. 一.pom.xml文件 <?xml version="1.0" encoding="UTF- ...

  8. SpringMVC_实现简单的增删改查

    实现简单的增删改查 1:创建User的javabean package com.doaoao.bean; public class User {private String name;private ...

  9. php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例

    本文实例讲述了PHP实现对xml进行简单的增删改查(CRUD)操作.分享给大家供大家参考,具体如下: 假如有下面xml文件: 55.8 56 40 339 如何使用php对它进行CRUD?其实像这种简 ...

最新文章

  1. 忘记mysql 密码的取回方法
  2. linux 命令行模式下,浏览网页方法
  3. Python写简单的TCP服务器
  4. Centos7 下部署yapi 详细教程
  5. 【linux(1),八年Java开发心路历程
  6. JavaScript里的父、子节点操作源码解析
  7. macos下安装redis客户端
  8. 基于W5500+Yeelink的远程灯光控制设计
  9. 开源同步文件软件对比
  10. CAD制图软件中动态块功能的使用技巧
  11. ubuntu18.04 安装RabbitVCS
  12. 带有en的单词有哪些_英语前缀大全en:开头是EN的单词有哪些
  13. Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)
  14. 【每日随笔】记录完整的劳动仲裁过程 一 ( 赢火虫律师平台 | 赢火虫手机端跟进案件信息 | 等待律师接单 | 提交信息给律师 )
  15. Pycharm下同一目录py文件不能相互调用?
  16. 南昌专门学计算机的技校,2019南昌技校计算机专业都学什么有哪些专业-江西技校都有什么专...
  17. 计算机网络英文论文,计算机网络与因特网论文(英文版).doc
  18. 2021华数杯C题总结
  19. Linux运维|记录一个挖矿病毒
  20. 从一而始,总要试着去遇见更好的自己

热门文章

  1. Apache Flink之架构概述和环境(章节一)
  2. 中国二次锂离子电池电解液市场需求现状与销售策略分析报告2022-2028年
  3. 3-regexp-golang 爬虫基础正则的使用
  4. 音乐播放器小程序(音乐搜索)
  5. java游戏开发入门(十) -粒子特效
  6. 计算机机房建设标准.doc,Kyztql计算机机房建设标准
  7. win10计算机恢复到一天前,5种方法!快速解决Win10系统还原点丢失问题
  8. 如何改变Windows 11 中任务栏位置(最新有效方式)
  9. docker容器无法访问宿主机报出 No route to host
  10. HLT外网GitLab账号申请