声明:此文是原创,如果需要转载请注明出处: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注解开发实现简单的增删改查就完成了。由于本人也还是新手一枚,文中有些概念的描述或者讲解错误的地方敬请提出,这也是一个相互学习的途径,谢谢~
最后,如果我的这篇文章对您有帮助,欢迎扫一扫关注我的公众号,第一时间获取最新干货