struts2day05异常处理

Struts2.0的异常处理机制
  1.什么是异常?软件在开发和运行过程中可能遇到的错误。【对象】
  2.异常的种类?
   Check异常【检测时异常】在编译过程中必须进行处理(编译器不通过)
      IOException / ClassNOTFoundException
   Runtime异常[运行时异常] 运行时出现的异常,在程序开发过程中不需要额外的处理
      NUllPOINException/ArrayOutofIndexException
   自定义异常
     如何定义异常
       1.写一类继承Exception/RuntimeException
        A  public class MyException extends Exception{   }
       继承了Exception,检测异常,必须进行处理 try...catch/throw
        B  public class MyExceptionA extends RuntimeException{}
       继承了RuntimeException,运行时异常,不做处理
     如何定义异常的方式?
        现在java开发思路,主要的异常处理采用RuntimeException
      jdbc和hibernate

    3.如何处理异常
      try..catch:如果try块中出现异常,交给catch块处理,如果发生的异常在本类中能够             处理则使用try..catch
      throw :     如果异常本类不能处理,将异常抛给调用者

   4.在J2EE体系中如何处理异常
     MVC模型:DB-->DAO-->BIZ-->Action
    DB数据库:数据库异常和java的关系不大,主要讨论Dao/Biz/Action的异常处理
        DAO操作数据库的异常:Dao层异常不能处理,抛给Biz层
    Biz Dao的异常,业务异常:向上抛Action
    Action Dao的异常,业务异常:Action的异常不能向上抛,只能处理,使用try..catch
                                Struts2.0只能使用一个页面处理异常,告诉用户异常的原因。
 
   在实际开发过程中对于
       Dao层的异常,不需要具体交代,整个封装告知数据库异常即可
       业务异常,需要具体交代【余额不足,账户不存在】

   Struts2.0对于异常处理的机制
     问题:如果在Action中使用大量的try...catch语句会造成代码的结构,以及可维护性的降低
     在Action中不处理异常,主要在配置文件struts.xml中进行处理

 

1.实际开发中的项目框架的搭建

 定义包:1.实体映射包pojo 存放所有开发中用到的实体类 例如:com.jsu.struts2.pojo

            2.util包,存放所有的工具类,如数据库链接,MD5加密等 例如:com.jsu.struts2.util

            3.dao包,存放所有的类的增删改查的方法,一般定义为接口 例如:com.jsu.struts2.dao

            4.dao.impl包,存放所有dao接口的实现类  例如:com.jsu.struts2.dao.impl

            5.biz包,存放所有的业务逻辑的接口例如:com.jsu.struts2.biz

            6.biz.impl包,存放所有biz接口的实现类 例如:com.jsu.struts2.biz.impl

            7. action包存放所有的action   例如 com.jsu.struts2.action

 

以登录为例子写异常的处理

1.定义jsp页面

在login.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    <style type="text/css">
    ul{display:inline;color:red;}
    li{display:inline;color:red;}
    </style>
  </head>
  <body>
  <center>
    <form action="login.action" method="post">
    	userName:<input type="text" name="user.name"/>
        <s:fielderror><s:param>namesError</s:param></s:fielderror><br>
    	passWord:<input type="password" name="user.password"/>
      <s:fielderror><s:param>pwdsError</s:param></s:fielderror><br>
    	<input type="submit" value="Submit"/>
    </form>
   </center>
  </body>
</html>

 在success.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>  </head>
  <body>
  <center>
    	登录成功~~~
   </center>
  </body>
</html>

 在nameErr.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head></head>
	<body>
		<center>
			<h2>
			  用户名不对,请确认你的用户名!
			</h2>
		</center>
	</body>
</html>

 在pwdErr.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head></head>
	<body>
		<center>
			<h2>
				密码不对,请修改!
			</h2>
		</center>
	</body>
</html>

 在daoErr.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head></head>
	<body>
		<center>
			<h2>
			数据库出问题了,你搞不定!
			</h2>
		</center>
	</body>
</html>

 2.在 com.jsu.struts2.pojo包中定义User实体类

package com.jsu.struts2.action;

import com.jsu.struts2.biz.UserBiz;
import com.jsu.struts2.biz.impl.UserBizImpl;
import com.jsu.struts2.pojo.User;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
	
	private User user;
	public String execute() throws Exception {
		UserBiz userBiz = new UserBizImpl();
		boolean flag = userBiz.login(user.getName(), user.getPassword());
		if(flag){
			return SUCCESS;
		}else{
			return "login";
		}
	}
	@Override
	public void validate() {
		if(user.getName()==null||user.getName().equals("")){
			this.addFieldError("namesError", "用户名不能为空!");
		}
		if(user.getPassword()==null||user.getPassword().length()<6){
			this.addFieldError("pwdsError", "密码不能小于6位");
		}
	}
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}

 3. com.jsu.struts2.util包中,定义数据库链接类

/**
 * 数据库连接
 * */
package com.jsu.struts2.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DBUtil {
	private  static String url;
	private static Properties ps;
	private static  String userName;
	private static  String password;
	private static DBUtil dbUtil;
	private DBUtil(){
		
	}
	
	static{
		try {
			ps=new Properties();
			Class.forName("oracle.jdbc.OracleDriver");
			InputStream io = DBUtil.class.getClassLoader().getResourceAsStream(
			"db.properties");//加载配置文件
			ps.load(io);
			userName=ps.getProperty("userName");
			password=ps.getProperty("password");
			url=ps.getProperty("url");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	public static DBUtil getConnUtil(){
		if(dbUtil==null){
			dbUtil = new DBUtil();
		}
		return dbUtil;
	}
	
	public static Connection getConnection(){
		Connection conn=null;
		try {
			conn=DriverManager.getConnection(url,userName,password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void close(Connection conn,Statement state,ResultSet rs){
		if(rs!=null)
		{
			try {
					rs.close();
				} catch (SQLException e) {
				
					e.printStackTrace();
				}
				finally{
					if(state!=null)
						try {
							state.close();
						} catch (SQLException e) {
					
							e.printStackTrace();
						}
						finally{
							if(conn!=null)
								try {
									conn.close();
								} catch (SQLException e) {
									
									e.printStackTrace();
								}
						}
				}
			
		}
	}
	public static void close(Connection conn,Statement state){
		if(state!=null)
			try {
				state.close();
			} catch (SQLException e) {
		
				e.printStackTrace();
			}
			finally{
				if(conn!=null)
					try {
						conn.close();
					} catch (SQLException e) {
						
						e.printStackTrace();
					}
			}
	}

}

 在src目录下,定义配置文件

userName=scott
password=tiger
url=jdbc\:oracle\:thin\:@localhost\:1521\:oracle

 4. com.jsu.struts2.dao包中,定义UserDao,和异常处理类 DaoExeption

    UserDao.java中

package com.jsu.struts2.dao;

import com.jsu.struts2.pojo.User;

public interface UserDao {
	 public User findByName(String name);
}

 在 DaoExeption.java中

package com.jsu.struts2.dao;

public class DaoExeption extends RuntimeException {

}

 5. com.jsu.struts2.dao.impl包中,定义dao接口的实现类

package com.jsu.struts2.dao.impl;

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

import com.jsu.struts2.dao.UserDao;
import com.jsu.struts2.pojo.User;
import com.jsu.struts2.util.DBUtil;

public class UserDaoImpl implements UserDao {
	Connection con=null;
	PreparedStatement psmt=null;
	ResultSet rs =null;
	public User findByName(String name) {
		User u = null;
		con=DBUtil.getConnection(); 
		String sql="select * from tb_User where name=?";
		try {
			psmt=con.prepareStatement(sql);
			psmt.setString(1, name);
			rs = psmt.executeQuery();
			while(rs.next()){
				u=new User();
				int id =rs.getInt("id");
				String username= rs.getString("name");
				String pwd = rs.getString("password");
				u.setId(id);
				u.setName(username);
				u.setPassword(pwd);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		DBUtil.close(con, psmt, rs);
		return u;
	}

}

 6.在 com.jsu.struts2.biz包中定义业务逻辑

    UserBiz.java


package com.jsu.struts2.biz;

public interface UserBiz {
	public boolean login(String name, String password);
}

 在NameErrorException.java中

package com.jsu.struts2.biz;

public class NameErrorException extends RuntimeException {

}

 在PasswordErrorException.java中

package com.jsu.struts2.biz;

public class PasswordErrorException extends RuntimeException{

}

 7. com.jsu.struts2.biz.impl包中,定义biz的实现类

   UserBizImpl。java中


package com.jsu.struts2.biz.impl;

import com.jsu.struts2.biz.UserBiz;
import com.jsu.struts2.dao.UserDao;
import com.jsu.struts2.dao.impl.UserDaoImpl;
import com.jsu.struts2.pojo.User;

public class UserBizImpl implements UserBiz{

	public boolean login(String name, String password) {
		UserDao  userDao = new UserDaoImpl();
		User users = userDao.findByName(name);
		if(users.getPassword().equals(password)){
			System.out.println("登录成功。。。");
		}else{
			System.out.println("登录失败。。。");
		}
		return true;
	}

}

 8.在com.jsu.struts2.action包中

定义LoginAction.java

package com.jsu.struts2.action;

import com.jsu.struts2.biz.UserBiz;
import com.jsu.struts2.biz.impl.UserBizImpl;
import com.jsu.struts2.pojo.User;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
	
	private User user;
	public String execute() throws Exception {
		UserBiz userBiz = new UserBizImpl();
		boolean flag = userBiz.login(user.getName(), user.getPassword());
		if(flag){
			return SUCCESS;
		}else{
			return "login";
		}
	}
	@Override
	public void validate() {
		if(user.getName()==null||user.getName().equals("")){
			this.addFieldError("namesError", "用户名不能为空!");
		}
		if(user.getPassword()==null||user.getPassword().length()<6){
			this.addFieldError("pwdsError", "密码不能小于6位");
		}
	}
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}

 9.在struts.xml中配置

<?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="loginDemo" namespace="/" extends="struts-default">	
		<!-- 定义全局的异常 -->
		<global-exception-mappings>
			<exception-mapping
				exception="com.jsu.struts2.dao.DaoExeption" result="daoError">
			</exception-mapping>
		</global-exception-mappings>
	
		<action name="login" class="com.jsu.struts2.action.LoginAction">
		<!-- 局部异常:处理Action中可能发生的异常 -->
			<exception-mapping
				exception="com.jsu.struts2.biz.NameErrorException"
				result="nameError">
			</exception-mapping>
			<exception-mapping
				exception="com.jsu.struts2.biz.PasswordErrorException"
				result="pwdError">
			</exception-mapping>
		<interceptor-ref name="defaultStack"></interceptor-ref>
		<result>/success.jsp</result>
		<result name="input">/login.jsp</result>
		<result name="login">/login.jsp</result>
		<result name="nameError" type="redirect">/nameErr.jsp</result>
		<result name="daoError" type="redirect">/daoErr.jsp</result>
		<result name="pwdError" type="redirect">/pwdErr.jsp</result>
		</action>
	</package>
</struts>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章