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>

 

 

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