声明:此文是原创,如果需要转载请注明出处: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层。
这三样都是很基础的了,就直接贴上代码了。
首先是目录结构
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,表很简单,就贴个图吧:
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
最后就是最重要的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注解开发实现简单的增删改查就完成了。由于本人也还是新手一枚,文中有些概念的描述或者讲解错误的地方敬请提出,这也是一个相互学习的途径,谢谢~