后端开发基础-SpringMVC框架学习-011——Springjdbc

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Coder_Boy_/article/details/82941538

springjdbc

springjdbc是什么?

spring框架对jdbc api的封装,使用起来
更加简单,比如,不用考虑获得连接与
关闭连接等等。

如何使用?

step1. 配置DataSource。
step2. 配置JdbcTemplate。

step3. 调用JdbcTemplate提供的方法。

注:
a. 需要导入springjdbc相关的jar文件。
b. JdbcTemplate会将底层的异常转换成
运行时异常,然后抛出。

案例演示:

工程案例目录结构

 pom.xml

<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.study</groupId>
  <artifactId>springcase-netctoss-jdbc</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
   <dependencies>
  	<dependency>
  		<groupId>com.oracle</groupId>
  		<artifactId>ojdbc14</artifactId>
  		<version>10.2.0.4.0</version>
  	</dependency>
  	<dependency>
  		<groupId>commons-dbcp</groupId>
  		<artifactId>commons-dbcp</artifactId>
  		<version>1.4</version>
  	</dependency>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.12</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-webmvc</artifactId>
  		<version>3.2.8.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>jstl</groupId>
  		<artifactId>jstl</artifactId>
  		<version>1.2</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-jdbc</artifactId>
  		<version>3.2.8.RELEASE</version>
  	</dependency>
  </dependencies>
</project>

导入Tomcat类库 

 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>springcase-netctoss-jdbc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:app.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
</web-app>

 app.xml

<?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:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">

		<!-- 配置组件扫描 -->
		<context:component-scan base-package="com.dk.oss"/>
		<!-- 配置mvc注解扫描 -->
		<mvc:annotation-driven/>

		<!-- 
			配置视图解析器:
			负责将视图名解析成真正的视图对象(比如jsp)。
		 -->
		 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		 	<property name="prefix" value="/WEB-INF/"/>
		 	<property name="suffix" value=".jsp"/>
		 </bean>

	<!-- 读取db.properties文件的内容 -->
	<util:properties id="jdbc" location="classpath:db.properties"/>
	<!-- 配置DataSource -->
	<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="#{jdbc.driverclass}" />
		<property name="url" value="#{jdbc.url}" />
		<property name="username" value="#{jdbc.user}" />
		<property name="password" value="#{jdbc.password}" />
		<property name="maxActive" value="#{jdbc.maxActive}" />
	</bean>

	
	<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/toLogin.do"/>
			<mvc:exclude-mapping path="/login.do"/>
			<bean class="com.dk.oss.interceptors.SessionInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>
	
	<!-- 配置JdbcTemplate -->
	<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="ds"/>
	</bean>
	
</beans>

以下配置为本次案例的重点知识点: 

 db.properties

driverclass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=learn
password=learn
maxActive=1
initSize=1

model层 :

 User.java

package com.dk.oss.entity;

/**
 * 实体类
 * @author Cher_du
 *
 */
public class User {

	private Integer id;
	private String name;
	private int age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

 Cost.java

package com.dk.oss.entity;

import java.sql.Timestamp;

/**
 * 实体类
 * @author Cher_du
 *
 */
public class Cost {

	private Integer costId;
	private String name;
	//基本时长
	private Integer baseDuration;
	//基本费用
	private Double baseCost;
	//单位费用
	private Double unitCost;
	//状态:0-启用;1-禁用;
	private String status;
	//描述
	private String descr;
	//创建时间
	private Timestamp creatime; 
	//开通时间
	private Timestamp startime;

	//资费类型:1-包月;2-套餐;3-计时;
	private String costType;

	@Override
	public String toString() {
		return "User [costId=" + costId + ", name=" + name + ", baseDuration=" + baseDuration + ", baseCost=" + baseCost
				+ ", unitCost=" + unitCost + ", status=" + status + ", descr=" + descr + ", creatime=" + creatime
				+ ", startime=" + startime + ", costType=" + costType + "]";
	}

	public Integer getCostId() {
		return costId;
	}

	public void setCostId(Integer costId) {
		this.costId = costId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getBaseDuration() {
		return baseDuration;
	}

	public void setBaseDuration(Integer baseDuration) {
		this.baseDuration = baseDuration;
	}

	public Double getBaseCost() {
		return baseCost;
	}

	public void setBaseCost(Double baseCost) {
		this.baseCost = baseCost;
	}

	public Double getUnitCost() {
		return unitCost;
	}

	public void setUnitCost(Double unitCost) {
		this.unitCost = unitCost;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getDescr() {
		return descr;
	}

	public void setDescr(String descr) {
		this.descr = descr;
	}

	public Timestamp getCreatime() {
		return creatime;
	}

	public void setCreatime(Timestamp creatime) {
		this.creatime = creatime;
	}

	public Timestamp getStartime() {
		return startime;
	}

	public void setStartime(Timestamp startime) {
		this.startime = startime;
	}

	public String getCostType() {
		return costType;
	}

	public void setCostType(String costType) {
		this.costType = costType;
	}
}

Admin.java

package com.dk.oss.entity;

import java.sql.Timestamp;
/**
 * 实体类
 *  注:
 *  	与要操作的表保持一致。
 * @author Cher_du
 *
 */
public class Admin {

	private Integer adminId;
	private String adminCode;
	private String password;
	private String name;
	private String telephone;
	private String email;
	private Timestamp enrolldate;
	
	public Integer getAdminId() {
		return adminId;
	}
	public void setAdminId(Integer adminId) {
		this.adminId = adminId;
	}
	public String getAdminCode() {
		return adminCode;
	}
	public void setAdminCode(String adminCode) {
		this.adminCode = adminCode;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTelephone() {
		return telephone;
	}
	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Timestamp getEnrolldate() {
		return enrolldate;
	}
	public void setEnrolldate(Timestamp enrolldate) {
		this.enrolldate = enrolldate;
	}
}

DAO层: 

UserDAO.java

package com.dk.oss.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.dk.oss.entity.User;
/**
 * 使用JdbcTemplate实现数据库访问
 * @author Cher_du
 *
 */
@Repository("userDAO")
public class UserDAO {
	
	@Resource(name="jt")
	private JdbcTemplate jt;
	
	public void save(User user){
		jt.update("INSERT INTO user_dk "+
					"VALUES(1,?,?)",
					new Object[]{user.getName(),user.getAge()});
	}
	
	/*
	 * 需要写一个实现了RowMapper接口的类,
	 * 该类规定了如何将结果集中的一条记录
	 * 转换成相应的java对象(比如User对象)。
	 */
	public List<User> findAll(){
		List<User> users = new ArrayList<User>();
		String sql = "SELECT * FROM user_dk";
		users = jt.query(sql, new UserRowMapper());
		return users;
	}
	
	/*
	 * queryForObject方法:
	 * 如果找不到相应的记录,会抛出异常。
	 */
	public User findById(int id){
		User user = null;
		String sql = "SELECT * FROM user_dk "
					+"WHERE ID=?";
		user = jt.queryForObject(sql, new Object[]{id}, new UserRowMapper());
		return user;
	}
	
	public User findById2(int id){
		User user = null;
		String sql = "SELECT * FROM user_dk "
					+"WHERE id=?";
		List<User> users = jt.query(sql, new Object[]{id}, new UserRowMapper());
		if(users !=null && users.size() >0){
			return users.get(0);
		}
		return user;
	}
	
	
	public void update(User user){
		String sql = "UPDATE user_dk "
					+"SET name=?,age=? WHERE id=?";
		jt.update(sql,new Object[]{user.getName(),user.getAge(),user.getId()});
	}
	
	public void delete(int id){
		String sql ="DELETE FROM user_dk WHERE id=?";
		jt.update(sql,new Object[]{id});
	}
	
	/*
	 * 获得总的记录数。
	 * 建议使用queryForObject方法。
	 * 不建议使用queryForInt方法。
	 */
	public int getTotalRow(){
		String sql = "SELECT COUNT(*) FROM user_dk";
		return jt.queryForObject(sql, Integer.class);
	}
	
	
	class UserRowMapper implements RowMapper<User>{
		
		/*
		 * rst:结果集。
		 * rowNum:记录的下标,从0开始。
		 */
		public User mapRow(ResultSet rst, int rowNum) 
				throws SQLException {
			User user = new User();
			user.setId(rst.getInt("id"));
			user.setName(rst.getString("name"));
			user.setAge(rst.getInt("age"));
			return user;
		}
	}
}

 CostDAO.java

package com.dk.oss.dao;

import java.util.List;

import com.dk.oss.entity.Cost;

/**
 * DAO接口
 */
public interface CostDAO {
	public List<Cost> findAll();
}

 CostDAOJdbcImpl.java

package com.dk.oss.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.stereotype.Repository;

import com.dk.oss.entity.Cost;

/**
 * DAO实现类
 *
 */
@Repository("costDAO")
public class CostDAOJdbcImpl implements 
CostDAO{
	//注入DataSource
	@Resource(name="ds")
	private DataSource ds;
	
	//查询出所有资费信息
	public List<Cost> findAll() {
		List<Cost> costs = 
				new ArrayList<Cost>();
		Connection conn = null;
		PreparedStatement prep = null;
		ResultSet rst = null;
		try {
			conn = ds.getConnection();
			String sql = "SELECT * FROM cost "
					+ "ORDER BY cost_id";;
			prep = 
					conn.prepareStatement(sql);
			rst = prep.executeQuery();
			while(rst.next()){
				Cost c = createCost(rst);
				costs.add(c);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return costs;
	}

	//将结果集中的记录转换成一个对象。
	private Cost createCost(ResultSet rst) throws SQLException {
		Cost c = new Cost();
		c.setCostId(rst.getInt("cost_id"));
		c.setName(rst.getString("name"));
		c.setBaseDuration(rst.getInt("base_duration"));
		c.setBaseCost(rst.getDouble("base_cost"));
		c.setUnitCost(rst.getDouble("unit_cost"));
		c.setStatus(rst.getString("status"));
		c.setDescr(rst.getString("descr"));
		c.setCreatime(rst.getTimestamp("creatime"));
		c.setStartime(rst.getTimestamp("startime"));
		c.setCostType(rst.getString("cost_type"));
		return c;
	}

}

 AdminDAO.java

package com.dk.oss.dao;

import com.dk.oss.entity.Admin;

/**
 * DAO接口
 * 注:
 *  任何接口,都不要涉及任何具体的实现。
 */
public interface AdminDAO {
	public Admin findByCode(String code);
	
}

 AdminDAOJdbcImpl.java

package com.dk.oss.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.stereotype.Repository;

import com.dk.oss.entity.Admin;
/**
 * DAO实现类
 * @author Cher_du
 *
 */
@Repository("adminDAO")
public class AdminDAOJdbcImpl implements AdminDAO{

	//注入datasource。
	@Resource(name="ds")
	private DataSource ds;
	
	public Admin findByCode(String code) {
		Admin admin = null;
		Connection conn = null;
		PreparedStatement prep = null;
		ResultSet rst = null;
		
		try {
			conn = ds.getConnection();
			String sql = "SELECT * FROM admin_info "
						+"WHERE admin_code=?";
			prep = conn.prepareStatement(sql);
			prep.setString(1, code);
			rst = prep.executeQuery();
			if(rst.next()){
				admin = new Admin();
				admin.setAdminId(rst.getInt("admin_id"));
				admin.setAdminCode(rst.getString("admin_code"));
				admin.setPassword(rst.getString("password"));
				admin.setName(rst.getString("name"));
				admin.setTelephone(rst.getString("telephone"));
				admin.setEmail(rst.getString("email"));
				admin.setEnrolldate(rst.getTimestamp("enrolldate"));
			}
		} catch (SQLException e) {
			//记日志(保留现场)
			e.printStackTrace();
			/*
			 * 异常是否恢复,如果不能够恢复
			 * (发生了系统异常,比如数据库服务
			 * 暂停,网络中断),则提示用户稍后
			 * 重试。如果能够恢复,则立即恢复。
			 */
			throw new RuntimeException(e);
		}finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		return admin;
	}

}

 


Service层:

 AdminService.java

package com.dk.oss.service;

import com.dk.oss.entity.Admin;

/**
 * 业务层接口
 *
 */
public interface AdminService  {
	
	//用于登录处理
	public Admin  checkLogin(String code,
			String pwd);


}

 AdminServiceImpl.java

package com.dk.oss.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.dk.oss.dao.AdminDAO;
import com.dk.oss.entity.Admin;

/**
 * 业务层实现
 * 
 */
@Service("adminService")
public class AdminServiceImpl implements AdminService{
	
	@Resource(name="adminDAO")
	private AdminDAO adminDAO;

	public Admin checkLogin(String code, String pwd) {
		//调用AdminDAO访问数据库
		Admin admin = adminDAO.findByCode(code);
		if(admin == null){
			//账户不存在,需要提示用户。
			//抛出一个应用异常(用户在使用系统
			//的过程当中,做了一些错误的操作,比如
			//输出入错误的账户或密码)。
			throw new AppException("账户错误");
		}
		if(!admin.getPassword().equals(pwd)){
			//密码错误,需要提示用户
			throw new AppException("密码错误");
		}
		//登录成功
		return admin;
	}

}

 AppException.java

package com.dk.oss.service;

/**
 * 应用异常类。
 *
 */
public class AppException 
	extends RuntimeException {

	public AppException() {
	}

	public AppException(String message) {
		super(message);
	}
	
}

 CostService.java

package com.dk.oss.service;

import java.util.List;

import com.dk.oss.entity.Cost;

public interface CostService {
	public List<Cost> list();
}

 CostServiceImpl.java

package com.dk.oss.service;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.dk.oss.dao.CostDAO;
import com.dk.oss.entity.Cost;
@Service("costService")
public class CostServiceImpl implements CostService{
	
	@Resource(name="costDAO")
	private CostDAO dao;
	
	public List<Cost> list() {
		List<Cost> costs = new ArrayList<Cost>();
		costs = dao.findAll();
		return costs;
	}

}

Controller层:

 CostController.java

package com.dk.oss.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

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

import com.dk.oss.entity.Cost;
import com.dk.oss.service.CostService;

@Controller
public class CostController {
	
	@Resource(name="costService")
	private CostService costService;

	@RequestMapping("/cost.do")
	public String cost(HttpServletRequest request){
		try{
			List<Cost> costs = costService.list();
			request.setAttribute("costs", costs);//Integer.valueOf("w");
		}catch(Exception e){
			e.printStackTrace();
			//系统异常,提示用户稍后重试。
			return "error";
		}
		
		return "cost";
	}
}

 LoginController.java

package com.dk.oss.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

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

import com.dk.oss.entity.Admin;
import com.dk.oss.service.AdminService;
import com.dk.oss.service.AppException;

@Controller
public class LoginController {
	
	@Resource(name="adminService")
	private AdminService adminService;
	
	@RequestMapping("/toLogin.do")
	public String toLogin(){
		return "login";
	}
	
	@RequestMapping("/login.do")
	public String checkLogin(HttpServletRequest request,
							HttpSession session){
		//读取请求参数值
		String adminCode = request.getParameter("adminCode");
		String pwd = request.getParameter("pwd");
		System.out.println("adminCode:"+adminCode+" pwd:"+pwd);
		//调用业务层模块来进行登录处理
		Admin admin  = null;
		try{
			admin = adminService.checkLogin(adminCode, pwd);
			System.out.println(admin);
		}catch(Exception e){
			if(e instanceof AppException ){
				//应用异常,需要明确提示用户。
				request.setAttribute("errorMsg", e.getMessage());
				//转发到登录页面。
				return "login";
			}else{
				//系统异常,提示用户稍后重试
				return "error";
			}
		}
		
		//登录成功,重定向到首页。
		//将一些数据绑定到session对象上,用于
		//session验证。
		session.setAttribute("admin", admin);
		return "redirect:index.do";
		
	}
	
	@RequestMapping("/index.do")
	public String toIndex(){
		return "index";
	}

}

SessionInterceptor.java

package com.dk.oss.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 拦截器,用于session验证。
 * @author Cher_du
 *
 */
public class SessionInterceptor implements HandlerInterceptor{

	public boolean preHandle(HttpServletRequest request, 
			HttpServletResponse response,
			Object handler)
			throws Exception {
		System.out.println("SessionInterceptor的preHandle方法...");
		//session验证
		HttpSession session = request.getSession();
	    Object obj = session.getAttribute("admin");
	    if(obj == null){
	    	//没有登录,跳转到登录页面
	    	response.sendRedirect("toLogin.do");
	    	//中断处理流程。
	    	return false;
	    }
	    //已经登录,继续向后调用
		return true;
	}

	public void postHandle(HttpServletRequest request,
			HttpServletResponse response,
			Object handler,
			ModelAndView modelAndView) throws Exception {

	}

	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response,
			Object handler, 
			Exception ex)
			throws Exception {
		
	}

}

 TestCase.java

package test;

import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dk.oss.dao.AdminDAO;
import com.dk.oss.dao.CostDAO;
import com.dk.oss.entity.Admin;
import com.dk.oss.entity.Cost;
import com.dk.oss.service.AdminService;
import com.dk.oss.service.CostService;

public class TestCase {
	
	@Test
	//测试DataSource
	public void test1() throws SQLException{
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
				"app.xml");
		DataSource ds = 
				ac.getBean("ds",DataSource.class);
		System.out.println(
				ds.getConnection());
		
	}
	
	@Test
	//测试DAO
	public void test2() {
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
				"app.xml");
		AdminDAO dao = 
				ac.getBean("adminDAO",
						AdminDAO.class);
		Admin admin = 
				dao.findByCode("caocao");
		System.out.println(admin);
	}

	@Test
	//测试AdminService
	public void test3() {
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
				"app.xml");
		AdminService service = 
				ac.getBean("adminService",
						AdminService.class);
		Admin admin  =
				service.checkLogin("caocao", 
						"123");
		System.out.println(admin.getTelephone());
	}

	@Test
	//测试CostDAO
	public void test4() {
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
				"app.xml");
		CostDAO dao = 
				ac.getBean("costDAO",CostDAO.class);
		List<Cost> costs = 
				dao.findAll();
		System.out.println(costs);
	}
	
	@Test
	//测试CostService
	public void test5() {
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
				"app.xml");
		CostService service = 
				ac.getBean("costService",CostService.class);
		List<Cost> costs = 
				service.list();
		System.out.println(costs);
	}
}

 TestCase2.java

package test;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dk.oss.dao.UserDAO;
import com.dk.oss.entity.User;

public class TestCase2 {
	
	@Test
	public void test1(){
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
			"app.xml");
		UserDAO dao = ac.getBean("userDAO",
				UserDAO.class);
		User user = new User();
		user.setName("Sally");
		user.setAge(22);
		dao.save(user);
		
	}
	
	@Test
	public void test2(){
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
			"app.xml");
		UserDAO dao = ac.getBean("userDAO",
				UserDAO.class);
		List<User> users = 
				dao.findAll();
		System.out.println(users);
		
	}
	
	@Test
	public void test3(){
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
			"app.xml");
		UserDAO dao = ac.getBean("userDAO",
				UserDAO.class);
		User user = dao.findById2(2);
		System.out.println(user);
		
	}

	
	@Test
	public void test4(){
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
			"app.xml");
		UserDAO dao = ac.getBean("userDAO",
				UserDAO.class);
		User user = dao.findById2(1);
		user.setAge(user.getAge() * 2);
		dao.update(user);
		System.out.println(user);
		
	}
	
	@Test
	public void test5(){
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
			"app.xml");
		UserDAO dao = ac.getBean("userDAO",
				UserDAO.class);
		dao.delete(1);
		
	}
	
	@Test
	public void test6(){
		ApplicationContext ac = 
		new ClassPathXmlApplicationContext(
			"app.xml");
		UserDAO dao = ac.getBean("userDAO",
				UserDAO.class);
		int rows = dao.getTotalRow();
		System.out.println(rows);
	}
}

 cost.jsp

<%@page pageEncoding="utf-8" 
contentType="text/html; charset=utf-8" %>
<%@taglib prefix="c" 
uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" 
prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>案例-NetCTOSS</title>
        <link type="text/css" rel="stylesheet" media="all" href="styles/global.css" />
        <link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" />
        <script language="javascript" 
        type="text/javascript">
            //排序按钮的点击事件
            function sort(btnObj) {
                if (btnObj.className == "sort_desc")
                    btnObj.className = "sort_asc";
                else
                    btnObj.className = "sort_desc";
            }

            //启用
            function startFee() {
                var r = window.confirm("确定要启用此资费吗?资费启用后将不能修改和删除。");
                document.getElementById("operate_result_info").style.display = "block";
            }
            //删除
            function deleteFee() {
                var r = window.confirm("确定要删除此资费吗?");
                document.getElementById("operate_result_info").style.display = "block";
            }
        </script>        
    </head>
    <body>
        <!--Logo区域开始-->
        <div id="header">
            <img src="images/logo.png" alt="logo" class="left"/>
            <a href="#">[退出]</a>            
        </div>
        <!--Logo区域结束-->
        <!--导航区域开始-->
        <div id="navi">                        
            <ul id="menu">
                <li><a href="../index.html" class="index_off"></a></li>
                <li><a href="../role/role_list.html" class="role_off"></a></li>
                <li><a href="../admin/admin_list.html" class="admin_off"></a></li>
                <li><a href="../fee/fee_list.html" class="fee_on"></a></li>
                <li><a href="../account/account_list.html" class="account_off"></a></li>
                <li><a href="../service/service_list.html" class="service_off"></a></li>
                <li><a href="../bill/bill_list.html" class="bill_off"></a></li>
                <li><a href="../report/report_list.html" class="report_off"></a></li>
                <li><a href="../user/user_info.html" class="information_off"></a></li>
                <li><a href="../user/user_modi_pwd.html" class="password_off"></a></li>
            </ul>            
        </div>
        <!--导航区域结束-->
        <!--主要区域开始-->
        <div id="main">
            <form action="" method="">
                <!--排序-->
                <div class="search_add">
                    <div>
                        <!--<input type="button" value="月租" class="sort_asc" onclick="sort(this);" />-->
                        <input type="button" value="基费" class="sort_asc" onclick="sort(this);" />
                        <input type="button" value="时长" class="sort_asc" onclick="sort(this);" />
                    </div>
                    <input type="button" value="增加" class="btn_add" onclick="location.href='fee_add.html';" />
                </div> 
                <!--启用操作的操作提示-->
                <div id="operate_result_info" class="operate_success">
                    <img src="../images/close.png" onclick="this.parentNode.style.display='none';" />
                    删除成功!
                </div>    
                <!--数据区域:用表格展示数据-->     
                <div id="data">            
                    <table id="datalist">
                        <tr>
                            <th>资费ID</th>
                            <th class="width100">资费名称</th>
                            <th>基本时长</th>
                            <th>基本费用</th>
                            <th>单位费用</th>
                            <th>创建时间</th>
                            <th>开通时间</th>
                            <th class="width50">状态</th>
                            <th class="width200"></th>
                        </tr> 
                        <c:forEach items="${costs}" var="c">                     
                        <tr>
                            <td>${c.costId }</td>
                            <td><a href="fee_detail.html">${c.name }</a></td>
                            <td>${c.baseDuration } 小时</td>
                            <td>${c.baseCost } 元</td>
                            <td>${c.unitCost } 元/小时</td>
                            <td><fmt:formatDate value="${c.creatime }" pattern="yyyy/MM/dd"/></td>
                            <td><fmt:formatDate value="${c.startime }" pattern="yyyy/MM/dd"/></td>
                            <td>
                            	<c:if test="${c.status=='0' }">开通</c:if>
                            	<c:if test="${c.status=='1' }">暂停</c:if>
                            </td>
                            <td>                                
                                <input type="button" value="启用" class="btn_start" onclick="startFee();" />
                                <input type="button" value="修改" class="btn_modify" onclick="location.href='toUpdateCost.do?id=${c.costId }';" />
                                <input type="button" value="删除" class="btn_delete" onclick="deleteFee();" />
                            </td>
                        </tr>
                        </c:forEach>
                        
                    </table>
                    <p>业务说明:<br />
                    1、创建资费时,状态为暂停,记载创建时间;<br />
                    2、暂停状态下,可修改,可删除;<br />
                    3、开通后,记载开通时间,且开通后不能修改、不能再停用、也不能删除;<br />
                    4、业务账号修改资费时,在下月底统一触发,修改其关联的资费ID(此触发动作由程序处理)
                    </p>
                </div>
                <!--分页-->
                <div id="pages">
        	        <a href="#">上一页</a>
                    <a href="#" class="current_page">1</a>
                    <a href="#">2</a>
                    <a href="#">3</a>
                    <a href="#">4</a>
                    <a href="#">5</a>
                    <a href="#">下一页</a>
                </div>
            </form>
        </div>
        <!--主要区域结束-->
        <div id="footer">
            <p>[源自北美的技术,最优秀的师资,最真实的企业环境,最适用的实战项目]</p>
            <p>版权所有(C)加拿大达内IT培训集团公司 </p>
        </div>
    </body>
</html>

 error.jsp

<%@page pageEncoding="utf-8" 
contentType="text/html; charset=utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>案例-NetCTOSS</title>
        <link type="text/css" rel="stylesheet" media="all" href="styles/global.css" />
        <link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" />
        <script language="javascript" type="text/javascript">
            var timer;
            //启动跳转的定时器
            function startTimes() {
                timer = window.setInterval(showSecondes,1000);
            }

            var i = 5;
            function showSecondes() {
                if (i > 0) {
                    i--;
                    document.getElementById("secondes").innerHTML = i;
                }
                else {
                    window.clearInterval(timer);
                    location.href = "login.html";
                }
            }

            //取消跳转
            function resetTimer() {
                if (timer != null && timer != undefined) {
                    window.clearInterval(timer);
                    location.href = "login.html";
                }
            }
        </script> 
    </head>
    <body class="error_page" onload="startTimes();">
        <h1 id="error">
	        遇到错误,&nbsp;<span id="secondes">5</span>&nbsp;秒后将自动跳转,立即跳转请点击&nbsp;
            <a  href="javascript:resetTimer();">返回</a>
        </h1>
    </body>
</html>

 index.jsp

<%@page pageEncoding="utf-8" 
contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>案例-NetCTOSS</title>
        <link type="text/css" rel="stylesheet" media="all" href="styles/global.css" />
        <link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" /> 
    </head>
    <body class="index">
        <!--导航区域开始-->
        <div id="index_navi">
            <ul id="menu">
                <li><a href="index.html" class="index_on"></a></li>
                <li><a href="role/role_list.html" class="role_off"></a></li>
                <li><a href="admin/admin_list.html" class="admin_off"></a></li>
                <li><a href="fee/fee_list.html" class="fee_off"></a></li>
                <li><a href="account/account_list.html" class="account_off"></a></li>
                <li><a href="service/service_list.html" class="service_off"></a></li>
                <li><a href="bill/bill_list.html" class="bill_off"></a></li>
                <li><a href="report/report_list.html" class="report_off"></a></li>
                <li><a href="user/user_info.html" class="information_off"></a></li>
                <li><a href="user/user_modi_pwd.html" class="password_off"></a></li>
            </ul>
        </div>
    </body>
</html>

 login.jsp

<%@page pageEncoding="utf-8" 
contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
		<title>案例-NetCTOSS</title>
		<link type="text/css" rel="stylesheet"  media="all" href="styles/global.css"/>
		<link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" /> 
	</head>
	<body class="index">
		<div class="login_box">
			<form action="login.do" method="post">
				<table>
					<tr>
						<td class="login_info">账号:</td>
						<td colspan="2">
							<input name="adminCode" type="text" class="width150" />
						</td>
						<td class="login_error_info"><span class="required">30长度的字母、数字和下划线</span></td>
					</tr>
					<tr>
						<td class="login_info">密码:</td>
						<td colspan="2">
							<input name="pwd" type="password" class="width150" />
						</td>
						<td><span class="required">30长度的字母、数字和下划线</span></td>
					</tr>
					<tr>
						<td class="login_info">验证码:</td>
						<td width="width70">
							<input name="" type="text" class="width70" />
						</td>
						<td><img src="images/valicode.jpg" alt="验证码" title="点击更换" /></td>
						<td><span class="required">验证码错误</span></td>
					</tr>
					<tr>
						<td></td>
						<td class="login_button" colspan="2">
							<a href="javascript:document.forms[0].submit();">
								<img src="images/login_btn.png" alt="" />
							</a>
						</td>
						<td><span class="required">${errorMsg }</span></td>
					</tr>
				</table>
			</form>
		</div>
	</body>
</html>

 启动Tomcat 运行springcase-netctoss-jdbc工程,测试SessionInterceptor拦截器

录入请求http://localhost:8088/springcase-netctoss-jdbc/index.do

如果打开浏览器已经登录过系统--后台与前台页面:

如果打开浏览器未登录过系统 --后台与前台页面:

 

发出的请求都会经过拦截器处理。

测试springjdbc:

编写每一个方法对应依次运行test进行测试:


练习:

  1. 使用springjdbc重写CostDAO。
    2.(可选)使用spring提供的异常处理机制
    重写登录模块。

猜你喜欢

转载自blog.csdn.net/Coder_Boy_/article/details/82941538