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

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

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

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

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

 

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

 




    
        Struts2_study
        Struts2_study
        1.0-SNAPSHOT
    
    4.0.0

    Struts2_study_05
    war

    Struts2_study_05
    
    http://www.example.com

    
        UTF-8
        1.7
        1.7
    

    
        
            junit
            junit
            4.11
            test
        
        
            jstl
            jstl
            1.2
        
        
            org.apache.struts
            struts2-core
            2.5.10
        
        
            org.apache.struts
            struts2-convention-plugin
            2.5.10
        
        
            mysql
            mysql-connector-java
            5.1.33
        
    

    
        Struts2_study_05
        
        
            
            
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                2.2
                
                
                    
                    8066
                    /
                
            
        
    

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

 




  
    strtus2
    org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
  
  
    strtus2
    /*
  

  
    index.jsp
  

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







    
    
    
    
    
    

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

首先是目录结构

Struts2 注解开发实现简单的增删改查,超详细教程_第1张图片

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 {
    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 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 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 {
    @Override
    public List rsToList(ResultSet rs) throws SQLException {
        List 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 list=dao.executeQuery(sql,new Object[]{a});
        if (list.size()>0){
            return list.get(0);
        }else return null;
    }
    //显示商品信息
    public List 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,表很简单,就贴个图吧:

Struts2 注解开发实现简单的增删改查,超详细教程_第2张图片

Struts2 注解开发实现简单的增删改查,超详细教程_第3张图片

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

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

@Action("showall")
public String showall(){
    List 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" %>


    Title


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

<%--
  Created by IntelliJ IDEA.
  User: hunter
  Date: 2018/6/3
  Time: 22:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--这里是声明使用的标签是Struts2标签--%>
<%@taglib prefix="s" uri="/struts-tags" %>


    Title


<%--这是增加了一个跳转到添加商品页面的超链接--%>
添加

    <%--这里用的是s:iterator标签,其中,value表示的是被迭代的集合,从后台返回的结果集;var表示的是页面用于迭代使用的代替名称,就相当于你给返回的结果集起个别名
    ;statue是迭代元素的索引--%>
    
    <%--这里就是对返回的结果集以table的表现方式进行遍历--%>
    
商品编号 商品名称 商品价格 商品数量 操作
<%--这里对修改和删除设置了超链接,分别跳转到修改页面和delete的Action,并且将productid的值传到下一个界面/Action。--%> 修改  删除

然后是add.jsp

<%--
  Created by IntelliJ IDEA.
  User: hunter
  Date: 2018/6/3
  Time: 22:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


<%--跳转到add的Action中,并将productname,productprice,productnum获取的值传入--%>
商品名称
商品价格
商品数量

update.jsp

<%--
  Created by IntelliJ IDEA.
  User: hunter
  Date: 2018/6/4
  Time: 1:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


现在开始修改商品编号为:${param.productid}的商品信息

商品名
商品价格
商品数量

最后就是最重要的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 request;
   private List 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 getList_product() {
        return list_product;
    }

    public void setList_product(List list_product) {
        this.list_product = list_product;
    }



    public ProductEntity getProduct() {
        return product;
    }

    public void setProduct(ProductEntity product) {
        this.product = product;
    }

    @Override
    public void setRequest(Map request) {
         this.request=request;
    }
    @Action("showall")
    public String showall(){
        List 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 注解开发实现简单的增删改查,超详细教程_第4张图片

进入商品信息页面:

Struts2 注解开发实现简单的增删改查,超详细教程_第5张图片

添加操作:

Struts2 注解开发实现简单的增删改查,超详细教程_第6张图片

提交返回结果:

Struts2 注解开发实现简单的增删改查,超详细教程_第7张图片

修改大西瓜成小西瓜:

Struts2 注解开发实现简单的增删改查,超详细教程_第8张图片

提交修改:

Struts2 注解开发实现简单的增删改查,超详细教程_第9张图片

删除小西瓜,点击删除:

Struts2 注解开发实现简单的增删改查,超详细教程_第10张图片

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

 

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

你可能感兴趣的:(Java,Struts2)