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

声明:此文是原创,如果需要转载请注明出处: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> {
    @Override
    public 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: 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" %>
<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: 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" %>
<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: 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" %>
<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;
    }

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

 

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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值