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>