Struts2+MVC+MySql数据库增删查改及分页显示

本文介绍了使用Struts2框架结合MVC模式,利用MySQL数据库进行CRUD操作,并实现分页显示的功能。文章详细讲解了工程结构、信息列表展示、分页功能的实现,涉及c3p0连接池的使用,同时提供了Struts.xml配置和相关页面的编写过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始学习Java Web框架中的Struts2,暂且将数据库的增删查改以及分页显示做一总结,过程中使用的是MySQL数据库,其中用到了c3p0连接池,现在将编写过程分享给大家,第一次写,欢迎指正.

工程结构如下:

一.展示信息列表

(1)主页index.jsp只有一个超链接,跳转到展示页面show.jsp

<body>
	<a href="lend.action">展示学生列表</a>
</body>

(2)在struts.xml中配置lend.action
<!-- 展示 -->
<action name="lend" class="com.qf.action.StudentAction" method="list">
	<result>/show.jsp</result>
</action>
(3)编写StudentAction.java

private StudentService service = new StudentServiceImpl();
private Student student;
private List<Student> list;
public String list() throws Exception{
		setStudentList(service.getList());
		return Action.SUCCESS;
}

(4)还没有service层,实体类以及DAO层,所以新建StudentDao接口和StudentDaoImpl实现类,Student类

service接口:

public List<Student> getList() ;

service实现类:

private StudentDao dao = new StudentDaoImpl();
@Override
public List<Student> getList() {
	return dao.getList();
}


StudentDao接口:

public interface StudentDao {

	List<Student> getList() throws Exception;

}
StudentDaoImpl实现类中实现方法:
@Override
public List<Student> getList(int pageNow,int pageSize) throws Exception {
	QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
	String sql = "select * from student";
	List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class));
	return list;
}

这其中用到了c3p0连接池,工具类如下:

public class DataSourceUtils {
	private static ComboPooledDataSource ds=new ComboPooledDataSource();
	//--
	private static ThreadLocal<Connection> tl=new ThreadLocal<>();

	public static DataSource getDataSource(){
		return ds;
	}

	public static Connection getConnection() throws SQLException{

		Connection conn = tl.get();
		if(conn==null){
			 conn=ds.getConnection();
			 
			 tl.set(conn);
		}
		return conn;
	}
	
	public static void closeResource(Connection conn, Statement st, ResultSet rs) {
		closeResource(st, rs);
		closeConn(conn);
	}
	
	 
	public static void closeResource(Statement st, ResultSet rs) {
			closeResultSet(rs);
			closeStatement(st);
	}

	public static void closeConn(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
				tl.remove();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}

	}

	public static void closeStatement(Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			st = null;
		}

	}

	public static void closeResultSet(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}

	}

	public static void startTransaction() throws SQLException{
		getConnection().setAutoCommit(false);;
	}
	
	public static void commitAndClose(){
		try {
			Connection conn = getConnection();
			conn.commit();
			conn.close();
			tl.remove();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void rollbackAndClose(){
		try {
			Connection conn = getConnection();
			conn.rollback();
			conn.close();
			tl.remove();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

Student实体类:

public class Student {

	private int id;
	private String stuname;
	private int age;
	private String course;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getStuname() {
		return stuname;
	}
	public void setStuname(String stuname) {
		this.stuname = stuname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getCourse() {
		return course;
	}
	public void setCourse(String course) {
		this.course = course;
	}
}

数据库创建过程不再赘述,其中id自增.

(5)编写show.jsp展示信息列表

<h3>展示学生信息列表</h3>
<table border="1px">
	<tr>
		<td>编号</td>
		<td>姓名</td>
		<td>年龄</td>
		<td>课程</td>
		<td>操作</td>
	</tr>

	<s:iterator>
		<tr>
			<td><s:property value="id"/></td>
			<td><s:property value="stuname"/></td>
			<td><s:property value="age"/></td>
			<td><s:property value="course"/></td>
			<td>
			<a href="toUpdate.action?student.id=<s:property value="id"/>">修改</a>
			<a href="delete.action?student.id=<s:property value="id"/>">删除</a>
			</td>
		</tr>
		
	</s:iterator>
	<tr>
		<td colspan="5"><a href="toAdd.action">添加学生信息</a></td>
	</tr>
		
</table>

注意添加Struts标签库.增删改等页面同样如此

<%@taglib uri="/struts-tags" prefix="s"%>

二.增删改原理类似,下面只写增的过程.

先前在上一步的show.jsp中已经预先写了增删改等功能,下面就是实现了.

配置Struts.xml

<!-- 添加 -->
		<action name="toAdd" class="com.qf.action.StudentAction"
			method="toAdd">
			<result>/add.jsp</result>
		</action>
StudentAction中添加跳转方法:

//跳转到添加页面
	public String toAdd(){
		return Action.SUCCESS;
	}


跳转到add.jsp页面以增加信息.

<form action="add.action" method="post">
	姓名:<input type="text" name="student.stuname" /><br>
	年龄:<input type="text" name="student.age" /><br>
	课程:<input type="text" name="student.course" /><br>
	<input type="submit" value="添加">
</form>

配置add.action

<action name="add" class="com.qf.action.StudentAction" method="add">
			<result name="success" type="redirect">/lend</result>
		</action>

在StudentAction中添加add方法

//添加
	public String add() throws Exception{
		service.add(student);
		return Action.SUCCESS;
	}

同展示页面过程一样,在service接口实现类以及dao的接口实现类中添加方法,StudentDaoImpl中add方法如下:

@Override
	public void add(Student student) throws Exception {
		QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
		String sql = "insert into student(stuname,age,course) values(?,?,?)";
		qr.update(sql, student.getStuname(), student.getAge(), student.getCourse());
	}

至此添加功能结束,删除修改功能类似不再赘述.

三.分页功能的实现

在这里分页的实现考虑到数据量大的情况所以采用分页查找分页分页展示.这部分代码比较简单,变量都用全名翻译一看就懂所以也就没加注释.

首先page实体类:

public class Page {

	private int pageNow;
	private int pageSize = 5;
	private int totalPage;
	private int totalSize;
	@SuppressWarnings("unused")
	private boolean hasFirst;
	@SuppressWarnings("unused")
	private boolean hasPre;
	@SuppressWarnings("unused")
	private boolean hasNext;
	@SuppressWarnings("unused")
	private boolean hasLast;
	public Page(int pageNow, int totalSize) {
		this.pageNow = pageNow;
		this.totalSize = totalSize;
	}
	public int getPageNow() {
		return pageNow;
	}
	public void setPageNow(int pageNow) {
		this.pageNow = pageNow;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalPage() {
		totalPage = getTotalSize()/getPageSize();
		if (totalSize%pageSize!=0) {
			totalPage++;
		}
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getTotalSize() {
		return totalSize;
	}
	public void setTotalSize(int totalSize) {
		this.totalSize = totalSize;
	}
	public boolean isHasFirst() {
		if (pageNow==1) {
			return false;
		}
		return true;
	}
	public void setHasFirst(boolean hasFirst) {
		this.hasFirst = hasFirst;
	}
	public boolean isHasPre() {
		if (pageNow==1) {
			return false;
		}
		return true;
	}
	public void setHasPre(boolean hasPre) {
		this.hasPre = hasPre;
	}
	public boolean isHasNext() {
		if (pageNow==this.getTotalPage()) {
			return false;
		}
		return true;
	}
	public void setHasNext(boolean hasNext) {
		this.hasNext = hasNext;
	}
	public boolean isHasLast() {
		if (pageNow==this.getTotalPage()) {
			return false;
		}
		return true;
	}
	public void setHasLast(boolean hasLast) {
		this.hasLast = hasLast;
	}
	
}

修改dao层,分页查找数据:

@Override
	public List<Student> getList(int pageNow,int pageSize) throws Exception {
		QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
		String sql = "select * from student limit ?,?";
		List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class),(pageNow-1)*pageSize,pageSize);
		return list;
	}

当然同时还有Service层.Action里顺手也改一下吧...

private int pageNow = 1;
	private int pageSize = 5;
	//查询学生列表
	public String list() throws Exception{
		setStudentList(service.getList(pageNow, pageSize));
		Page page = new Page(pageNow,new StudentDaoImpl().getListSize());
		Map<String, Object> session = ActionContext.getContext().getSession();
		session.put("stuinfo", list);
		session.put("pageinfo", page);
		return Action.SUCCESS;
	}

最后是显示分页按钮,这里我将其另写了一个lend.jsp页面,然后嵌入到show.jsp中

<s:set name="page" value="#session.pageinfo" />
	<a href="lend?pageNow=1">首页</a>
	<s:if test="#page.hasPre">
		<a href="lend?pageNow=<s:property value="#page.pageNow-1" />">上一页</a>
	</s:if>
	<s:else>
		<a href="lend?pageNow=1">上一页</a>
	</s:else>
	<s:if test="#page.hasNext">
		<a href="lend?pageNow=<s:property value="#page.pageNow+1"/>">下一页</a>
	</s:if>
	<s:else>
		<a href="lend?pageNow=<s:property value="#page.totalPage"/>">下一页</a>
	</s:else>

	<a href="lend?pageNow=<s:property value="#page.totalPage"/>">尾页</a>

至此所有功能开发结束.工程文件已上传, http://pan.baidu.com/s/1o8dTRIU,密码9x7r,看一下效果吧...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值