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>