栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring MVC 02 单例模式及统一异常处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC 02 单例模式及统一异常处理

单例模式及统一异常处理

文章目录
  • 单例模式及统一异常处理
    • 一、学习目标与任务
        • 1.1回顾提问:
        • 1.2学习目标
        • 1.3学习任务
    • 二、单例模式
        • 1.1.问题分析
        • 1.2单例模式的概念
        • 1.3单例模式实现的方式
          • 1.3.1简单的单例模式实现
          • 1.3.2懒汉模式-`synchronized`
          • 1.3.3饿汉模式
          • 1.3.4饿汉模式-静态内部类
        • 1.4.Spring MVC中的单例模式
    • 三、搭建项目运行环境
        • 3.1.实现步骤
        • 3.2.改造登录、注销功能
        • 3.3.改造CVS-用户登录功能
          • 3.3.1 web.xml配置
          • 3.3.2 applicationContext-jdbc.xml配置
          • 3.3.3 springmvc-servlet配置
          • 3.3.4 database.properties文件
          • 3.3.5 log4j.properties文件
          • 3.3.6 SysUserDao
          • 3.3.7 ConfigManager
          • 3.3.8 BaseDao
          • 3.3.9 SysUserDaoImpl
          • 3.3.10 SysUserService
          • 3.3.11 SysUserServiceImpl
          • 3.3.12 SysUserController
          • 3.3.13 login.jsp
          • 3.3.14 frame.jsp
          • 3.3.15 common/head.jsp
          • 3.3.16 common/foot.jsp
          • 3.3.17 maven pom.xml配置
          • 3.3.18 Constants 系统静态常量
    • 四、静态资源文件的引用
        • 4.1静态资源无法正常加载的原因
        • 4.2登录功能优化
    • 五、异常处理
        • 5.1异常处理
        • 5.2异常处理
    • 六、改造用户列表查询功能
        • 6.1需求说明
        • 6.2实现步骤
        • 6.3 练习—改造供货商列表查询功能
    • 七、本章总结
        • 7.1本章总结
    • 八、监听器
        • 8.1 ContextLoaderListener监听器作用

一、学习目标与任务 1.1回顾提问:

1.MVC设计模式是什么?

2.Spring MVC的架构是什么?

3.Spring MVC的请求处理流程是什么?

4.Spring MVC框架是基于哪个核心的Servlet?

5.Spring MVC如何实现View与Controller之间的参数传递?

1.2学习目标
  1. 掌握并理解单例模式
  2. 搭建SSM框架
  3. 掌握Spring MVC访问静态文件
  4. 掌握Servlet API作为控制器接口入参
  5. 掌握Spring MVC异常(局部、全局)处理
1.3学习任务
  1. 改造读取数据库配置文件的工具类为单例模式
  2. 改造724系统-登录、注销、查询用户列表功能
  3. 使用Spring MVC(局部)异常处理,提示登录失败的原因
  4. 使用Spring MVC(全局)异常处理,提示登录失败的原因
  5. 改造724系统-供货商列表查询功能
二、单例模式 1.1.问题分析
  • 回顾学习JDBC操作数据库的基类(BaseDao.java)

  • database.properties文件
driver=com.mysql.cj.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,字符集设置为utf-8,并根据需要设置时区
url=jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
user=root
password=root
  • ConfigManager工具类:
package cn.cvs.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

//存在问题:每个线程操作数据库都需new一个BaseDao实例,即每个线程都会单独加载配置文件,影响系统性能
public class ConfigManager {
	private static Properties properties;
	static{
   init();
 } 
	public static void init(){
		String configFile = "database.properties";
		properties = new Properties();
		InputStream is = 
		ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
		try {
			properties.load(is);
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static String getProperty(String key){
		return properties.getProperty(key);
	}
}
  • BaseDao工具类:
package cn.cvs.dao;

import cn.cvs.utils.ConfigManager;

import java.sql.*;


public class BaseDao {

	
	public static Connection getConnection(){
		Connection connection = null;
		String driver = ConfigManager.getProperty("driver"); 
     String url = ConfigManager.getProperty("url");
     String user = ConfigManager.getProperty("user");
     String password = ConfigManager.getProperty("password");
		try {
			Class.forName(driver);
			connection = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connection;
	}
	
	public static ResultSet execute(Connection connection,PreparedStatement pstm,ResultSet rs,
			String sql,Object[] params) throws Exception{
		pstm = connection.prepareStatement(sql);
		for(int i = 0; i < params.length; i++){
			pstm.setObject(i+1, params[i]);
		}
		rs = pstm.executeQuery();
		return rs;
	}
	
	public static int execute(Connection connection,PreparedStatement pstm,
			String sql,Object[] params) throws Exception{
		int updateRows = 0;
		pstm = connection.prepareStatement(sql);
		for(int i = 0; i < params.length; i++){
			pstm.setObject(i+1, params[i]);
		}
		updateRows = pstm.executeUpdate();
		return updateRows;
	}
	
	
	public static boolean closeResource(Connection connection,PreparedStatement pstm,ResultSet rs){
		boolean flag = true;
		if(rs != null){
			try {
				rs.close();
				rs = null;//GC回收
			} catch (SQLException e) {
				e.printStackTrace();
				flag = false;
			}
		}
		if(pstm != null){
			try {
				pstm.close();
				pstm = null;//GC回收
			} catch (SQLException e) {
				e.printStackTrace();
				flag = false;
			}
		}
		if(connection != null){
			try {
				connection.close();
				connection = null;//GC回收
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				flag = false;
			}
		}
		
		return flag;
	}

}

问题1:

  • BaseDao:操作数据库的基类
    • init()方法
      • 从配置文件中读取数据库连接的初始化参数
      • 读取配置文件属于I/O操作,十分消耗资源,影响系统性能
  • 每个线程操作数据库都需new一个BaseDao实例,即每个线程都会单独加载配置文件,影响系统性能,该如何解决呢?

分析:

  • 对于每个线程,可共享一个实例
  • 单例模式

1.2单例模式的概念

单例模式:系统运行期间,有且仅有一个实例

  • 一个类只有一个实例

    • 私有构造方法
  • 自行创建实例对象

    • 定义了静态的该类私有对象
  • 对外提供实例对象

    • 提供一个静态的公有方法,返回创建的或者获取本身的静态私有对象

1.3单例模式实现的方式
1.3.1简单的单例模式实现
package cn.cvs.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

//通过单例模式读取配置文件
public class ConfigManager {
   //1.定义静态实例属性
	private static ConfigManager configManager;
	private static Properties properties;
   
	//2.私有构造器-读取数据库配置文件
	private ConfigManager(){
		String configFile = "database.properties";
		properties = new Properties();
		InputStream is =
   ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
		try {
		properties.load(is);
		is.close();
		 } catch (IOException e) {
			  e.printStackTrace();
		 }
	}

	//3.对外提供的获取ConfigManager实例的方法
	public static ConfigManager getInstance(){
		if(configManager == null){
		configManager = new ConfigManager();
		}
		return configManager;
	}

	public String getValue(String key){
		return properties.getProperty(key);
	}
}

问题2:

  • 在并发环境下,上述的单例模式实现是否存在弊端,线程是否安全?是否会出现多个configManager实例?

分析:

  1. 懒汉模式
  2. 饿汉模式

1.3.2懒汉模式-synchronized

懒汉模式:

  • 类加载时不创建实例,采用延迟加载的方式,在运行调用时创建实例

  • 特点

  • 线程不安全

  • 延迟加载(Lazy Loading)

  • 如何解决线程安全问题?

  • synchronized关键字

  • 在方法中添加 synchronized 关键字:public static synchronized ConfigManager getInstance()

package cn.cvs.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

//通过单例模式读取配置文件
public class ConfigManager {
	private static ConfigManager configManager;
	private static Properties properties;
	//私有构造器-读取数据库配置文件
	private ConfigManager(){
		String configFile = "database.properties";
		properties = new Properties();
		InputStream is =
				ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
		try {
			properties.load(is);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	// 对外提供的获取ConfigManager实例的方法
	public static synchronized ConfigManager getInstance(){
		if(configManager == null){
			configManager = new ConfigManager();
		}
		return configManager;
	}

	public String getValue(String key){
		return properties.getProperty(key);
	}
}

1.3.3饿汉模式
  • 类加载的时候,就完成初始化
  • 特点
  • 线程安全
  • 不具备延迟加载特性

饿汉模式示例

  1. 直接创建实例对象:
  • private static ConfigManager configManager = new ConfigManager();
  1. 定义获取实例对象的方法getInstance:
  • public static ConfigManager getInstance()
package cn.cvs.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

//通过单例模式读取配置文件
public class ConfigManager {

	private static ConfigManager configManager = new ConfigManager();
	private static Properties properties;
	
//私有构造器-读取数据库配置文件
	private ConfigManager(){
		String configFile = "database.properties";
		properties = new Properties();
		InputStream is =
				ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
		try {
			properties.load(is);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	

	//饿汉模式
	public static ConfigManager getInstance(){
		return configManager;
	}

	public String getValue(String key){
		return properties.getProperty(key);
	}
}

问题3:

  • 若实例化单例类(比如说:ConfigManager)很消耗资源,我们希望它可以延迟加载,即不想让它在类加载的时候就实例化,应该如何处理呢?

分析:

  • 要求饿汉模式同时要具备延迟加载的特性

  • 静态内部类

1.3.4饿汉模式-静态内部类
  1. 定义Single类,在类的内部增加内部静态类 SingleHelper
package cn.cvs.utils;

public class Single {
	
	private static Single single;
	
//私有化构造
	private Single(){
	   // 整个运行期间,只执行一次的业务代码操作,如:读取配置文件的操作。
//......
	}
	
	public static class SingleHelper{
		private static final Single INSTANCE = new Single();
	}
	//对外提供获取本实例的方法
	public static Single getInstance(){
		single = SingleHelper.INSTANCE;
		return single;
	}
	public static Single test(){
		return single;
	}
	
}
  1. 测试分别使用Single.test(); 与Single.getInstance();获取对象
package cn.cvs.utils;

public class TestSingle {
	public static void main(String[] args) {
		Single single = Single.test();
		System.out.println("调用Singleton.test()方法获取实例对象:" + single);

		single = Single.getInstance();
		System.out.println("第一次调用Singleton.getInstance()方法获取实例对象:" + single);

		single = Single.getInstance();
		System.out.println("第二次调用Singleton.getInstance()方法获取实例对象:" + single);
	}
}
  1. 运行结果:


学员操作—增加读取数据库配置文件的工具类

需求说明:

  1. 在上章学员操作的基础上增加ConfigManager.java的工具类完成数据库配置文件的读取
  2. 该类设计为单例模式,使用懒汉模式、饿汉模式、静态内部类等方式均可,但需要考虑线程安全问题。

1.4.Spring MVC中的单例模式
  • Spring MVC-Controller

    • 默认scope为singleton
    • 速度和性能优越
  • 在Spring MVC的Controller中声明成员变量,需要注意线程安全问题

  • 一般情况下,Controller内的成员变量就只有service对象

package cn.cvs.controller;
import cn.cvs.pojo.SysUser;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

@Controller
@RequestMapping("/user")
@Scope("prototype")//默认scope为singleton
public class SysUserController {
	private Logger logger = Logger.getLogger(SysUserController.class);

	private ArrayList userList = new ArrayList();
	// 用于返回查询到的用户数据
	private ArrayList queryUserList = new ArrayList();
	
 public SysUserController(){
			userList.add(new SysUser(5,"zhaojing","赵静","5555555",1
					, "13054784445","上海市宝山区",1,1,new Date(),1, new Date()));
			userList.add(new SysUser(4,"wanglin","王林","4444444",1
					,"18965652364","北京市学院路",1,1,new Date(),1,new Date()));
			userList.add(new SysUser(1,"test001","测试用户001","1111111",1
					, "13566669998","北京市朝阳区",1,1,new Date(),1, new Date()));
			userList.add(new SysUser(2,"zhaoyan","赵燕","2222222",1
					, "18678786545","北京市海淀区",1,1,new Date(),1, new Date()));
			userList.add(new SysUser(3,"test003","测试用户003","1111111",1
					,"13121334531","北京市海淀区",1,1,new Date(),1,new Date()));
	}

	
	@GetMapping("/list")
	public String list(Model model){
		logger.info("当查询条件位空时,查询用户信息" + this);
		queryUserList.clear();
		queryUserList.addAll(userList);
		model.addAttribute("queryUserList",userList);
		return "sysUser/sysUserList";
	}

	
	@PostMapping("/list")
	public String list(@RequestParam(value="realName",required=false) String realName, Model model){
		logger.info("查询条件:【realName】= " + realName +", 查询用户信息");
		queryUserList.clear();
		if(realName != null && !realName.equals("")){
			for(SysUser user:userList){
				if(user.getRealName().indexOf(realName) != -1){
					queryUserList.add(user);
				}
			}
		}else{
			queryUserList.addAll(userList);
		}
		model.addAttribute("queryUserList",queryUserList);
		return "sysUser/sysUserList";
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
      pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>



 
 查询用户信息


查询用户列表
用户名称:
id= ${sysUser.id }; 用户编码= ${sysUser.account }; 用户名称= ${sysUser.realName }; 用户密码= ${sysUser.password }; 用户地址= ${sysUser.address };
  • 注意当控制器获取视图传递的值出现乱码时需要配置过滤器


     CharacterEncodingFilter
     org.springframework.web.filter.CharacterEncodingFilter
     
         encoding
         utf-8
     
 
 
     CharacterEncodingFilter
     
public interface SysUserDao {
        
        int insert(Connection connection, SysUser sysUser) throws Exception;

        
        SysUser findUserByAccount(Connection connection, String account) throws Exception;

        
        List findList(Connection connection, String realName, int userRoleId, int currentPageNo, int pageSize) throws Exception;

        
        int getTotalCount(Connection connection, String realName, int userRoleId) throws Exception;

        
        int deleteUserById(Connection connection, Integer id) throws Exception;


        
        SysUser getUserById(Connection connection, String id) throws Exception;

        
        int modify(Connection connection, SysUser user) throws Exception;


        
        int updatePwd(Connection connection, int id, String password) throws Exception;
}
3.3.7 ConfigManager
package com.aiden.springmvc.cvs.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


public class ConfigManager {

    private static ConfigManager configManager;
    private static Properties properties;
    //私有构造
    private ConfigManager() {
        String configFile = "database.properties";
        InputStream is = null;
        properties = new Properties();
        try {
            is = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
            properties.load(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    
    public static class ConfigManagerHelper {
        private static final ConfigManager CONFIG_MANAGER = new ConfigManager();
    }

    
    public static ConfigManager getInstance() {
        configManager = ConfigManagerHelper.CONFIG_MANAGER;
        return configManager;
    }

    public static String getProperty(String key) {
        return properties.getProperty(key);
    }
}

3.3.8 BaseDao
package com.aiden.springmvc.cvs.dao;

import com.aiden.springmvc.cvs.utils.ConfigManager;

import java.sql.*;


public class BaseDao {
    private static BaseDao baseDao = new BaseDao();

    
    private BaseDao() {
        getConnection();
    }

    
    public static BaseDao getInstance() {
        return baseDao;
    }

    
    public static Connection getConnection() {
        Connection connection = null;
        String driver = ConfigManager.getInstance().getProperty("driver");
        String url = ConfigManager.getInstance().getProperty("url");
        String user = ConfigManager.getInstance().getProperty("user");
        String password = ConfigManager.getInstance().getProperty("password");
        try {
            Class.forName(driver);//加载驱动
            connection = DriverManager.getConnection(url, user, password);//建立连接
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    
    public static ResultSet execute(Connection connection, PreparedStatement stmt, ResultSet rs,
                                    String sql, Object... params) throws Exception {
        stmt = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            stmt.setObject(i + 1, params[i]);
        }
        rs = stmt.executeQuery();
        return rs;
    }

    
    public static int execute(Connection connection, PreparedStatement stmt,
                              String sql, Object... params) throws Exception {
        int updateRows = 0;
        stmt = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            stmt.setObject(i + 1, params[i]);
        }
        updateRows = stmt.executeUpdate();
        return updateRows;
    }

    
    public static boolean closeResource(Connection connection, PreparedStatement stmt, ResultSet rs) {
        boolean flag = true;
        if (rs != null) {
            try {
                rs.close();
                rs = null;//GC回收
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
                stmt = null;//GC回收
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if (connection != null) {
            try {
                connection.close();
                connection = null;//GC回收
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                flag = false;
            }
        }

        return flag;
    }
}
3.3.9 SysUserDaoImpl
package com.aiden.springmvc.cvs.dao.impl;

import com.aiden.springmvc.cvs.dao.BaseDao;
import com.aiden.springmvc.cvs.dao.SysUserDao;
import com.aiden.springmvc.cvs.pojo.SysUser;
import org.springframework.stereotype.Repository;

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


@Repository
public class SysUserDaoImpl implements SysUserDao {


   @Override
   public int insert(Connection connection, SysUser sysUser) throws Exception {
       PreparedStatement stmt = null;
       int updateRows = 0;
       if (null != connection) {
           String sql = "insert into t_sys_user (account,realName,password," +
                   "roleId,sex,birthday,phone,address,createTime,createUserId) " +
                   "values(?,?,?,?,?,?,?,?,?,?)";
           Object[] params = {sysUser.getAccount(), sysUser.getRealName(), sysUser.getPassword(),
                   sysUser.getRoleId(), sysUser.getSex(), sysUser.getBirthday(),
                   sysUser.getPhone(), sysUser.getAddress(), sysUser.getCreatedTime(), sysUser.getCreatedUserId()};
           updateRows = BaseDao.execute(connection, stmt, sql, params);
           BaseDao.closeResource(null, stmt, null);
       }
       return updateRows;
   }

   @Override
   public SysUser findUserByAccount(Connection connection, String account) throws Exception {
       PreparedStatement pstm = null;
       ResultSet rs = null;
       SysUser user = null;
       if (null != connection) {
           String sql = "select * from t_sys_user where account=?";
           Object[] params = {account};
           rs = BaseDao.execute(connection, pstm, rs, sql, params);
           if (rs.next()) {
               user = new SysUser();
               user.setId(rs.getInt("id"));
               user.setAccount(rs.getString("account"));
               user.setRealName(rs.getString("realName"));
               user.setPassword(rs.getString("password"));
               user.setSex(rs.getInt("sex"));
               user.setBirthday(rs.getDate("birthday"));
               user.setPhone(rs.getString("phone"));
               user.setAddress(rs.getString("address"));
               user.setRoleId(rs.getInt("roleId"));
               user.setCreatedUserId(rs.getInt("createdUserId"));
               user.setCreatedTime(rs.getTimestamp("createdTime"));
               user.setUpdatedUserId(rs.getInt("updatedUserId"));
               user.setUpdatedTime(rs.getTimestamp("updatedTime"));
           }
           BaseDao.closeResource(null, pstm, rs);
       }
       return user;
   }

   @Override
   public List findList(Connection connection, String realName, int userRoleId, int currentPageNo, int pageSize) throws Exception {
       PreparedStatement stmt = null;
       ResultSet rs = null;
       List userList = new ArrayList();
       if (connection != null) {
           StringBuffer sql = new StringBuffer();
           sql.append("select u.*,r.roleName as roleIdName from t_sys_user u,t_sys_role r where u.roleId = r.id");
           List list = new ArrayList();

           if (userRoleId > 0) {
               sql.append(" and u.roleId = ?");
               list.add(userRoleId);
           }
           sql.append(" order by createdTime DESC limit ?,?");
           currentPageNo = (currentPageNo - 1) * pageSize;

           list.add(currentPageNo);
           list.add(pageSize);

           Object[] params = list.toArray();
           System.out.println("sql ----> " + sql.toString());
           rs = BaseDao.execute(connection, stmt, rs, sql.toString(), params);
           while (rs.next()) {
               SysUser _user = new SysUser();
               _user.setId(rs.getInt("id"));
               _user.setAccount(rs.getString("account"));
               _user.setRealName(rs.getString("realName"));
               _user.setSex(rs.getInt("sex"));
               _user.setBirthday(rs.getDate("birthday"));
               _user.setPhone(rs.getString("phone"));
               _user.setRoleId(rs.getInt("roleId"));
               _user.setRoleIdName(rs.getString("roleIdName"));
               userList.add(_user);
           }
           BaseDao.closeResource(null, stmt, rs);
       }
       return userList;
   }

   @Override
   public int getTotalCount(Connection connection, String realName, int userRoleId) throws Exception {
       PreparedStatement stmt = null;
       ResultSet rs = null;
       int count = 0;
       if (connection != null) {
           StringBuffer sql = new StringBuffer();
           sql.append("select count(1) as count from t_sys_user u,t_sys_role r where u.roleId = r.id");
           List list = new ArrayList();

           if (userRoleId > 0) {
               sql.append(" and u.roleId = ?");
               list.add(userRoleId);
           }
           Object[] params = list.toArray();
           System.out.println("sql ----> " + sql.toString());
           rs = BaseDao.execute(connection, stmt, rs, sql.toString(), params);
           if (rs.next()) {
               count = rs.getInt("count");
           }
           BaseDao.closeResource(null, stmt, rs);
       }
       return count;
   }

   @Override
   public int deleteUserById(Connection connection, Integer id) throws Exception {
       PreparedStatement stmt = null;
       int updateRows = 0;
       if (null != connection) {
           String sql = "delete from t_sys_user where id=?";
           Object[] params = {id};
           updateRows = BaseDao.execute(connection, stmt, sql, params);
           BaseDao.closeResource(null, stmt, null);
       }
       return updateRows;
   }

   @Override
   public SysUser getUserById(Connection connection, String id) throws Exception {
       SysUser user = null;
       PreparedStatement stmt = null;
       ResultSet rs = null;
       if (null != connection) {
           String sql = "select u.*,r.roleName as roleIdName from t_sys_user u,t_sys_role r where u.id=? and u.roleId = r.id";
           Object[] params = {id};
           rs = BaseDao.execute(connection, stmt, rs, sql, params);
           if (rs.next()) {
               user = new SysUser();
               user.setId(rs.getInt("id"));
               user.setAccount(rs.getString("account"));
               user.setRealName(rs.getString("realName"));
               user.setPassword(rs.getString("password"));
               user.setSex(rs.getInt("sex"));
               user.setBirthday(rs.getDate("birthday"));
               user.setPhone(rs.getString("phone"));
               user.setAddress(rs.getString("address"));
               user.setRoleId(rs.getInt("roleId"));
               user.setCreatedUserId(rs.getInt("createUserId"));
               user.setCreatedTime(rs.getTimestamp("createdTime"));
               user.setUpdatedUserId(rs.getInt("updatedUserId"));
               user.setUpdatedTime(rs.getTimestamp("updatedTime"));
               user.setRoleIdName(rs.getString("roleIdName"));
           }
           BaseDao.closeResource(null, stmt, rs);
       }
       return user;
   }

   @Override
   public int modify(Connection connection, SysUser user) throws Exception {
       int updateRows = 0;
       PreparedStatement pstm = null;
       if (null != connection) {
           String sql = "update t_sys_user set realName=?,sex=?,birthday=?,phone=?,address=?,roleId=?,updatedUserId=?,updatedTime=? where id = ? ";
           Object[] params = {user.getRealName(), user.getSex(), user.getBirthday(),
                   user.getPhone(), user.getAddress(), user.getRoleId(), user.getUpdatedUserId(),
                   user.getUpdatedTime(), user.getId()};
           updateRows = BaseDao.execute(connection, pstm, sql, params);
           BaseDao.closeResource(null, pstm, null);
       }
       return updateRows;
   }

   @Override
   public int updatePwd(Connection connection, int id, String password) throws Exception {
       int updateRows = 0;
       PreparedStatement stmt = null;
       if (connection != null) {
           String sql = "update t_sys_user set password= ? where id = ?";
           Object[] params = {password, id};
           updateRows = BaseDao.execute(connection, stmt, sql, params);
           BaseDao.closeResource(null, stmt, null);
       }
       return updateRows;
   }
}

 
 
3.3.10 SysUserService 
package com.aiden.springmvc.cvs.service;

import com.aiden.springmvc.cvs.pojo.SysUser;

import java.util.List;


public interface SysUserService {
   
   boolean addUser(SysUser user);

   
   SysUser login(String account, String password);

   
   List findUserList(String queryUserName, int queryUserRoleId, int currentPageNo, int pageSize);

   
   int getUserCount(String queryUserName, int queryUserRoleId);

   
   SysUser findUserByAccount(String account);

   
   boolean deleteUserById(Integer delId);

   
   SysUser findUserById(String id);

   
   boolean modifyUser(SysUser user);

   
   boolean updatePwd(int id, String password);
}

3.3.11 SysUserServiceImpl
package com.aiden.springmvc.cvs.service.impl;

import com.aiden.springmvc.cvs.dao.BaseDao;
import com.aiden.springmvc.cvs.dao.SysUserDao;
import com.aiden.springmvc.cvs.pojo.SysUser;
import com.aiden.springmvc.cvs.service.SysUserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;


@Service
public class SysUserServiceImpl implements SysUserService {

   @Resource
   private SysUserDao userDao;

   @Override
   public boolean addUser(SysUser user) {
       boolean flag = false;
       Connection connection = null;
       try {
           connection = BaseDao.getConnection();
           connection.setAutoCommit(false);//开启JDBC事务管理
           int updateRows = userDao.insert(connection, user);
           connection.commit();//提交事务
           if (updateRows > 0) {
               flag = true;
               System.out.println("新增成功!");
           } else {
               System.out.println("新增失败!");
           }

       } catch (Exception e) {
           e.printStackTrace();
           try {
               System.out.println("rollback 回滚事务");
               connection.rollback();
           } catch (SQLException e1) {
               e1.printStackTrace();
           }
       } finally {
           //在service层进行connection连接的关闭
           BaseDao.closeResource(connection, null, null);
       }
       return flag;
   }

   @Override
   public SysUser login(String account, String password) {
       Connection connection = null;
       SysUser user = null;
       try {
           connection = BaseDao.getConnection();
           user = userDao.findUserByAccount(connection, account);
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       //判断密码是否匹配
       if (null != user) {
           if (!user.getPassword().equals(password)) {
               user = null;
           }
       }

       return user;
   }

   @Override
   public List findUserList(String queryUserName, int queryUserRoleId, int currentPageNo, int pageSize) {
       Connection connection = null;
       List userList = null;
       System.out.println("queryUserName ---- > " + queryUserName);
       System.out.println("queryUserRoleId ---- > " + queryUserRoleId);
       System.out.println("currentPageNo ---- > " + currentPageNo);
       System.out.println("pageSize ---- > " + pageSize);
       try {
           connection = BaseDao.getConnection();
           userList = userDao.findList(connection, queryUserName, queryUserRoleId, currentPageNo, pageSize);
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return userList;
   }

   @Override
   public int getUserCount(String queryUserName, int queryUserRoleId) {
       Connection connection = null;
       int count = 0;
       System.out.println("queryUserName ---- > " + queryUserName);
       System.out.println("queryUserRoleId ---- > " + queryUserRoleId);
       try {
           connection = BaseDao.getConnection();
           count = userDao.getTotalCount(connection, queryUserName, queryUserRoleId);
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return count;
   }

   @Override
   public SysUser findUserByAccount(String account) {
       Connection connection = null;
       SysUser user = null;
       try {
           connection = BaseDao.getConnection();
           user = userDao.findUserByAccount(connection, account);
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return user;
   }

   @Override
   public boolean deleteUserById(Integer delId) {
       Connection connection = null;
       boolean flag = false;
       try {
           connection = BaseDao.getConnection();
           if (userDao.deleteUserById(connection, delId) > 0)
               flag = true;
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return flag;
   }

   @Override
   public SysUser findUserById(String id) {
       SysUser user = null;
       Connection connection = null;
       try {
           connection = BaseDao.getConnection();
           user = userDao.getUserById(connection, id);
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
           user = null;
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return user;
   }

   @Override
   public boolean modifyUser(SysUser user) {
       Connection connection = null;
       boolean flag = false;
       try {
           connection = BaseDao.getConnection();
           if (userDao.modify(connection, user) > 0)
               flag = true;
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return flag;
   }

   @Override
   public boolean updatePwd(int id, String password) {
       boolean flag = false;
       Connection connection = null;
       try {
           connection = BaseDao.getConnection();
           if (userDao.updatePwd(connection, id, password) > 0) {
               flag = true;
           }
       } catch (Exception e) {
           //记录异常日志....
           e.printStackTrace();
       } finally {
           BaseDao.closeResource(connection, null, null);
       }
       return flag;
   }
}

3.3.12 SysUserController
package com.aiden.springmvc.cvs.controller;


import com.aiden.springmvc.cvs.pojo.SysUser;
import com.aiden.springmvc.cvs.service.SysUserService;
import com.aiden.springmvc.cvs.utils.Constants;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Controller
@RequestMapping("user")
public class SysUserController {
       //日志
       private Logger logger = Logger.getLogger(SysUserController.class);
       //用户业务实例对象
       @Resource
       private SysUserService sysUserService;

       @RequestMapping("/hello")
       public String welcome(String realName) {
            logger.info("欢迎使用Spring MVC, realName:" + realName);
            return "index";
       }

       //跳转到登录页面
       @RequestMapping(value = "/toLogin")
       public String login() {
            logger.debug("跳转到登录页面");
            return "login";
       }

       //处理登录请求的方法
       @RequestMapping(value = "/login", method = RequestMethod.POST)
       public String doLogin(@RequestParam String account, @RequestParam String password, HttpServletRequest request, HttpSession session) {
            logger.debug("登录方法");
            //调用service方法,进行用户匹配
            SysUser sysUser = sysUserService.login(account, password);
            if (null != sysUser) {//登录成功
                //放入session
                session.setAttribute(Constants.USER_SESSION, sysUser);
                //重定向到/user/main.htme接口
                return "redirect:/user/toMain";
            } else {
                //页面跳转(login.jsp)带出提示信息--转发
                request.setAttribute("error", "用户名或密码不正确");
                return "login";
            }
       }

       @RequestMapping(value = "/toMain")
       public String main(HttpSession session) {
            if (session.getAttribute(Constants.USER_SESSION) == null) {
                //重定向到登录页面接口
                return "redirect:/user/toLogin";
            }
            return "frame";
       }

       @RequestMapping(value = "/logout")
       public String logout(HttpSession session) {
            //清除session
            session.removeAttribute(Constants.USER_SESSION);
            return "login";
       }
}
3.3.13 login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>



   
   系统登录 - 724便利店管理系统
   


724便利店管理系统
${error }
3.3.14 frame.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="/WEB-INF/jsp/common/head.jsp"%>
   
       
       
           ${userSession.realName }
           

欢迎来到724便利店管理系统!

<%@include file="/WEB-INF/jsp/common/foot.jsp" %>
3.3.15 common/head.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>	



   
   724便利店管理系统
   
   



   
724便利店管理系统

${userSession.realName } , 欢迎光临!

登出
2019年1月1日 11:11 星期一 为了保证正常使用,请使用IE10.0以上版本!

菜单 "/>

3.3.16 common/foot.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


	
版权归Aiden所有
3.3.17 maven pom.xml配置

    
        junit
        junit
        4.13.2
        test
    
    
        log4j
        log4j
        1.2.17
    
    
        org.springframework
        spring-webmvc
        5.3.19
    
    
        javax.servlet
        javax.servlet-api
        3.1.0
    
    
    
        jstl
        jstl
        1.2
    

3.3.18 Constants 系统静态常量
package com.aiden.springmvc.cvs.utils;


public interface Constants {
    
    String USER_SESSION = "userSession";
    
    String SYS_MESSAGE = "message";
    
    int pageSize = 5;
}

四、静态资源文件的引用
4.1静态资源无法正常加载的原因
  • 为什么页面中没有相应的样式和图片?

分析:

  • web.xml中配置的DispatcherServlet请求映射为 “/”
  • 怎么解决?

方案:

标签

  1. mapping:将静态资源映射到指定的路径下
  2. location:本地静态资源文件所在的目录

		logger.debug("一个抛出异常的接口");
		//调用service方法,进行用户匹配
		SysUser user = sysUserService.login(account,password);
		if(null == user){//登录失败
			throw new NullPointerException("空指针异常!");
		}else{
			throw new RuntimeException("用户名或者密码不正确,跳转到错误页面!");
		}
		//return "redirect:/user/toMain";
	}

	
	@ExceptionHandler(value={Exception.class})
	public String handlerException(Exception e, HttpServletRequest req){
		req.setAttribute("e", e);
		return "error";
	}
}
  • 视图页面 error.jsp


	${e.message }


5.2异常处理
  • 全局异常处理
  • 对所有异常进行统一处理
  • 配置 SimpleMappingExceptionResolver ,发生异常时使用对应的视图error报告异常

    
    
        
            error
        
    

  • 视图页面 error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    错误信息页面


异常信息:${requestScope.ex}



六、改造用户列表查询功能 6.1需求说明
  • 原有业务不变,实现技术引入Spring和Spring MVC框架
  • 改造用户管理功能模块中的用户列表查询功能
    • 查询条件
      • 用户名称(模糊匹配)、用户角色(精确匹配)
    • 列表页显示字段
      • 用户名、真实姓名、角色名称、年龄、电话等
      • 分页显示数据列表

6.2实现步骤
  1. 改造Controller
    • SysUserController中增加查询用户列表getUserList()方法
  2. 增加异常处理
    • 增加处理异常请求的接口/user/toSysError
  3. 改造View层
    • list.jsp
      rollpage.jsp
  4. 增加sysError.jsp页面
6.3 练习—改造供货商列表查询功能

需求说明

  1. 在前面学员操作的基础上,实现供货商列表查询功能
  2. 要求可根据供货商编码、供货商名称进行模糊匹配并包含分页功能

七、本章总结 7.1本章总结

八、监听器 8.1 ContextLoaderListener监听器作用
  1. ContextLoaderListener是一个监听器,由Spring编写并提供。

  2. ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

  3. 配合ContextLoaderListener一起使用的,经常是context-param,用来指定Spring要加载的配置文件,比如:

    
    
        
        Aiden Create Spring Web MVC
        
            contextConfigLocation
            classpath:applicationContext-*.xml
        
    
        
            spring-mvc
            org.springframework.web.servlet.DispatcherServlet
            
                contextConfigLocation
                classpath:springmvc-servlet.xml
            
        
        
            spring-mvc
            /
        
    
        
            org.springframework.web.context.ContextLoaderListener
        
    
    
    
  4. 在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号