springmvc + spring + jdbc + oracle+c3p0+easyUI

本文介绍了一个使用Spring MVC框架与EasyUI前端框架整合的实战案例,详细讲解了从环境搭建到功能实现的全过程。

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

数据库表使用的是oracle的scott用户的自带表emp

emp(empno/ename/job/mgr/hiredate/sal/comm/deptno)

web项目
1.导入jar包

---spring的CORE、AOP和WEB模块的jar包

org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar

---oracle数据库驱动包

ojdbc6.jar

---C3P0数据库连接池包(高版本需要导入依赖包)

c3p0-0.9.1.2.jar

---工具类包

commons-dbutils-1.4.jar
commons-logging.jar

---json转换包

jackson-core-asl-1.9.11.jar
jackson-mapper-asl-1.9.11.jar

2.导入前台框架easyUI的源文件

jquery.easyui.min.js

easyui-lang-zh_TW.js
jquery.min.js

(建议放在WebRoot下新建的js文件夹中)

和主题包themes(内有css样式的easyUI的图标)

3.配置文件配置

---c3p0数据源文件c3p0-config.xml(建议放在src目录下)

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">oracle.jdbc.OracleDriver</property>
		<property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
		<property name="user">scott</property>
		<property name="password">tiger</property>
				<!-- 连接耗尽时一次获取的连接数,参考默认值3,由于sdkservice用到的mysql proxy在连接不够进行扩容时,会出现获取连接失败的异常,所以将acquireIncrement的值设置较大,以减少mysql proxy的扩容异常。 --><!-- 连接耗尽时一次获取的连接数,参考默认值3,由于sdkservice用到的mysql proxy在连接不够进行扩容时,会出现获取连接失败的异常,所以将acquireIncrement的值设置较大,以减少mysql proxy的扩容异常。 -->
		<property name="acquireIncrement">2</property>
				<!-- 初始化连接数需要在最大和最小连接数之间,否则会被最小连接数的值替换,参考默认值3。 同maxPoolSize的原因, 现已改为20。 --><!-- 初始化连接数需要在最大和最小连接数之间,否则会被最小连接数的值替换,参考默认值3。 同maxPoolSize的原因, 现已改为20。 -->
		<property name="initialPoolSize">5</property>
				<!-- 最大连接数在满足应用需要的情况下,参考默认值15,越小越好。由于sdkservice多次出现连接数不够的情况,该值也越改越大。现已改为100。 --><!-- 最大连接数在满足应用需要的情况下,参考默认值15,越小越好。由于sdkservice多次出现连接数不够的情况,该值也越改越大。现已改为100。 -->
		<property name="maxPoolSize">5</property>
				<!-- 最小连接数 --><!-- 最小连接数 -->
 		<property name="minPoolSize">1</property>		<property name="minPoolSize">1</property>
		</default-config></default-config>
</c3p0-config>


---web.xml文件配置(在WEB-INF目录下)



<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  
   <!-- 注册springmvc的核心控制器类 -->
  <servlet>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <!-- 注册针对post请求的编码器 -->
  <filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class> org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


---spring的核心配置文件springmvc.xml(文件名称和位置不固定,此处是因为我在web.xml中配置的名称是springmvc.xml,路径为src目录下)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xmlns:p="http://www.springframework.org/schema/p"
	     xmlns:context="http://www.springframework.org/schema/context"
	     xmlns:aop="http://www.springframework.org/schema/aop"
	     xmlns:mvc="http://www.springframework.org/schema/mvc"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans 
	     		http://www.springframework.org/schema/beans/spring-beans.xsd
           		http://www.springframework.org/schema/context 
           		http://www.springframework.org/schema/context/spring-context.xsd
           		http://www.springframework.org/schema/aop 
           		http://www.springframework.org/schema/aop/spring-aop.xsd
           		http://www.springframework.org/schema/mvc 
           		http://www.springframework.org/schema/mvc/spring-mvc.xsd
           		http://www.springframework.org/schema/tx 
           		http://www.springframework.org/schema/tx/spring-tx.xsd">
   
   <!-- 注解扫描 -->
   <context:component-scan base-package="com.emp.*"></context:component-scan>
   <!-- springmvc的注解驱动 -->
   <mvc:annotation-driven></mvc:annotation-driven>
   <!-- 注册适配器 -->
   <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
   		<property name="messageConverters">
   			<list>
   				<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
   			</list>
   		</property>
   </bean>
   
  
  <!-- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  	<property name="prefix" value="/"></property>
  	<property name="suffix" value=".jsp"></property>
  </bean> -->
</beans>

4.配置JavaBean

---与数据库表emp对应的实体类EmpBean.java

package com.emp.bean;

import java.util.Date;

public class EmpBean {

	private Integer empno;
	private String ename;
	private String job;
	private Integer mgr;
	private Date hiredate;
	private Integer sal;
	private Integer comm;
	private Integer deptno;
	@Override
	public String toString() {
		return "EmpBean [empno=" + empno + ", ename=" + ename + ", job=" + job
				+ ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal=" + sal
				+ ", comm=" + comm + ", deptno=" + deptno + "]";
	}
	public EmpBean() {
		super();
		// TODO Auto-generated constructor stub
	}
	public EmpBean(Integer empno, String ename, String job, Integer mgr, Date hiredate,
			Integer sal, Integer comm, Integer deptno) {
		super();
		this.empno = empno;
		this.ename = ename;
		this.job = job;
		this.mgr = mgr;
		this.hiredate = hiredate;
		this.sal = sal;
		this.comm = comm;
		this.deptno = deptno;
	}
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Integer getMgr() {
		return mgr;
	}
	public void setMgr(Integer mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public Integer getSal() {
		return sal;
	}
	public void setSal(Integer sal) {
		this.sal = sal;
	}
	public Integer getComm() {
		return comm;
	}
	public void setComm(Integer comm) {
		this.comm = comm;
	}
	public Integer getDeptno() {
		return deptno;
	}
	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}
}

---连接数据库的工具类JdbcUtil.java

package com.emp.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtil {

	/**
	 * 去src目录下加载c3p0-config.xml配置文件
	 */
	private static ComboPooledDataSource dataSource=new ComboPooledDataSource();
	/**
	 * 
	 * date:2017-7-23
	 * author:PeterW
	 * function:获取数据源
	 */
	public static ComboPooledDataSource getDataSource(){
		
		return dataSource;
	}
}

5.DAO数据持久层EmpDao.java(带分页的列表展示方法和查询总记录数的方法)

package com.emp.dao;

import java.math.BigDecimal;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.springframework.stereotype.Repository;

import com.emp.bean.EmpBean;
import com.emp.util.JdbcUtil;

/**
 * 员工管理模块
 * 持久层实现类 
 * @author PETER
 */
@Repository
public class EmpDao {

	/**
	 * 
	 * date:2017-7-23
	 * author:PeterW
	 * function:查询所有员工
	 * @throws Exception 
	 */
	public List<EmpBean> findAll(int currentPage,int pageSize) throws Exception{
		
		QueryRunner runner=new QueryRunner(JdbcUtil.getDataSource());
		String sql="select * from (select e.*,rownum rn from emp e) where rn>=(1+"+(currentPage-1)+"*"+pageSize+") and rn <(1+"+(currentPage)+"*"+pageSize+")";
		List<EmpBean> list = runner.query(sql, new BeanListHandler<EmpBean>(EmpBean.class));
		
		return list;
	}
	/**
	 * 
	 * date:2017-7-23
	 * author:PeterW
	 * function:查询总记录数
	 * ScalarHandler
	 * @throws Exception 
	 */
	public int listCount() throws Exception{
		
		QueryRunner runner=new QueryRunner(JdbcUtil.getDataSource());
		String sql="select count(*) from emp";
		BigDecimal bd = (BigDecimal) runner.query(sql,new ScalarHandler());
		
		return bd.intValue();
	}

	public static void main(String[] args) throws Exception {
		EmpDao dao = new EmpDao();
		
		/*for (EmpBean emp: dao.findAll(1,3)) {
			System.out.print("---"+emp.getEmpno());
			System.out.print("---"+emp.getEname());
			System.out.print("---"+emp.getSal());
		}*/
		
		int i = dao.listCount();
	}
}

6.service业务逻辑层EmpService.java

package com.emp.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.emp.bean.EmpBean;
import com.emp.dao.EmpDao;

/**
 * 员工管理模块
 * 业务层实现类 
 * @author PETER
 */
@Service
public class EmpService {

	@Resource(name="empDao")
	private EmpDao empDao;
	/**
	 * 
	 * date:2017-7-23
	 * author:PeterW
	 * function:查询所有员工
	 * @throws Exception 
	 */
	public List<EmpBean> findAllEmp(int currentPage,int pageSize) throws Exception{
		
		return empDao.findAll(currentPage,pageSize);
	}
	
	public int listCount() throws Exception{
		
		return empDao.listCount();
	}
}

7.控制层EmpAction.java

package com.emp.action;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.emp.bean.EmpBean;
import com.emp.service.EmpService;

/**
 * 员工管理模块
 * 控制器 
 * @author PETER
 */
@Controller
@RequestMapping("/emp")
public class EmpAction {

	@Resource(name="empService")
	private EmpService empService;
	
	/**
	 * 
	 * date:2017-7-23
	 * author:PeterW
	 * function:查询所有的员工
	 * @throws Exception 
	 */
	@RequestMapping("/findAllEmpMethod")
	public @ResponseBody Map<String,Object> findAllEmpMethod(int page,int rows) throws Exception{
		System.out.println("1-----"+page);
		System.out.println("2-----"+rows);
		//调用业务层,返回List对象
		List<EmpBean> list = empService.findAllEmp(page,rows);
		//查询总记录数
		int listCount = empService.listCount();
		//创建Map对象
		Map<String,Object> map = new LinkedHashMap<String, Object>();
		//封装DataGrid需要的二个参数
		map.put("total", listCount);
		map.put("rows", list);
		System.out.println("map="+map);
		//返回需要转成json文本的对象
		return map;
	}
}

8.在WebRoot下创建empList.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'empList.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!-- 引入easyui的css样式 -->
	<link rel="stylesheet" type="text/css" href="themes/default/easyui.css">
	<link rel="stylesheet" type="text/css" href="themes/icon.css">
	
<!-- 引入easyui的源文件 -->
  <script type="text/javascript" src="js/jquery.min.js"></script>
  <script type="text/javascript" src="js/jquery.easyui.min.js"></script>
  <script type="text/javascript" src="js/easyui-lang-zh_TW.js"></script>
  </head>
  
  <body>
  	<div>
  		<input id="ss"></input> 
		<div id="mm" style="width:120px"> 
		<div data-options="name:'all',iconCls:'icon-ok'">搜索</div> 
		</div> 
  	</div>
    <table id="dg">
    </table>
    <script type="text/javascript">
    $("#ss").searchbox({ 
		searcher:function(value,name){ 
		alert(value + "," + name);
		}, 
		menu:'#mm', 
		prompt:'Please Input Value' 
	}); 

    $("#dg").datagrid({
    	url:"emp/findAllEmpMethod.do?time="+new Date().getTime(),
    	columns:[[
    		{field:'empno',title:'员工编号',width:100},
    		{field:'ename',title:'员工姓名',width:100},
    		{field:'job',title:'员工职位',width:100},
    		{field:'mgr',title:'上级编号',width:100},
    		{field:'hiredate',title:'入职时间',width:100,
    			formatter:function(time){//处理入职日期显示样式
    				var newTime=new Date(time);
    				var year=newTime.getFullYear();
    				var month=newTime.getMonth()+1;
    				var date=newTime.getDate();
    				return year+"年"+month+"月"+date+"日";
    			}
    		},
    		{field:'sal',title:'薪水',width:100},
    		{field:'comm',title:'佣金',width:100,
    			formatter:function(value){//处理奖金为null时显示为0
   					return value==null?0:value;
    			}
    		},
    		{field:'deptno',title:'部门编号',width:100},
    	]],
    	singleSelect:true,//每次只能选中一行
    	pagination:true,//分页工具栏
    	pageNumber:1,
	    pageList:[5,10,20,30,40,50],
    	/* queryParams: {//发送额外的参数
			pageSize:5,
		} */
    	
    });
    </script>
  </body>
</html>

 

9.把项目部署到tomcat服务器上,运行,效果如下图


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值