`

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>

 

 

分享到:
评论

相关推荐

    Struts2Day2

    `Struts2Day2_method`可能涉及到如何在Action类中定义和调用不同的业务处理方法。Struts2允许根据HTTP请求参数动态选择要执行的方法,这通过在Action类中定义多个以`execute`命名的重载方法实现。这种方法增强了...

    黑马Struts2视频(day2)

    - Struts2提供了一套完善的异常处理机制,包括全局和局部的异常配置,可以统一处理应用程序可能出现的错误。 8. **最佳实践与性能优化**: - 使用Struts2时应遵循最佳实践,如合理设计Action接口,避免过多的...

    struts2day02

    2. **拦截器的自定义**:开发者可以根据需求自定义拦截器,实现特定的功能,如性能监控、异常处理等。 六、最佳实践与注意事项 1. **Action命名**:Action类的命名最好能体现其业务功能,便于理解。 2. **分层设计...

    黑马程序员_struts2框架开发2016版讲义和笔记资料_day01_day02_day03_day04

    Day04可能涉及Struts2的国际化、异常处理和文件上传下载等进阶主题。国际化允许开发出支持多语言的应用,而异常处理则能确保程序在遇到错误时能够优雅地处理。文件上传下载则是Web应用常见的需求,Struts2提供了方便...

    达内培训机密资料_struts2_day05(2)

    - 在实际应用中,开发者可以通过自定义拦截器来实现诸如日志记录、异常处理、权限验证等功能。 - 注意在`intercept()`方法中通过`actionInvocation.invoke()`调用下一个拦截器或Action是非常关键的一步。 ### 二、...

    超详细Struts2教程及源代码

    day04可能会涵盖Struts2的异常处理和国际化支持。你将学习如何配置全局异常处理策略,以及如何为不同的语言提供本地化资源文件。 day05可能涉及Struts2的标签库。Struts2提供了一系列JSP标签,简化视图层的开发,如...

    黑马Struts2视频(day4)

    - **Struts2的异常处理**:如何配置全局和局部的异常处理策略。 - ** strut2与Spring的集成**:如果项目中使用了Spring,那么可能会讲解如何将Struts2与Spring框架整合,实现依赖注入。 在学习Struts2的过程中,...

    struts2课件第二天

    - Struts2提供了一套完整的异常处理机制,可以在全局和Action级别定义异常处理器。 10. **测试与调试** - 使用Struts2的Mock测试框架进行单元测试,确保Action和拦截器的功能正确。 - 调试技巧和工具的使用也是...

    struts2学习 源码

    9. **异常处理**:Struts2提供了全局的异常处理机制,可以统一处理应用中的异常,提高代码的健壮性。 10. **国际化(i18n)**:框架内置对多语言的支持,方便实现国际化应用。 在"day06"这个文件夹中,很可能包含...

    黑马程序员struts2框架2016版资料

    7. **异常处理**:Struts2提供了一套完善的异常处理机制,可以捕获和处理Action执行过程中的异常,提供统一的错误页面。 在黑马程序员的这个2016版教程中,可能涵盖以下内容: - **基础篇**:介绍Struts2的基本...

    黑马程序员struts2框架2016版资料(笔记+源码+思路图)

    Struts2提供了全局的异常处理机制,可以通过配置捕获和处理特定的运行时异常。 10. **安全问题**: Struts2历史上曾出现过一些安全漏洞,例如著名的CVE-2017-5638,因此在使用时应保持框架版本更新,确保安全性。...

    达内培训机密资料_struts2_day02(2)

    - **OGNL演示04**:通过实例讲解OGNL在异常处理中的应用,如何利用OGNL来捕获和处理异常情况。 ### ValueStack - **ValueStack** 是Struts2中的一个重要概念,它是请求作用域中的对象栈,用于存储与请求相关的...

    struts2小例子

    8. **异常处理**:Struts2提供了一套完整的异常处理机制,可以通过全局异常映射配置来统一处理应用程序中的异常。 9. **插件系统**:Struts2的插件系统非常强大,如Tiles插件用于布局管理,Freemarker或Velocity...

    JavaEE Struts文件上传

    学习Struts2文件上传不仅需要掌握上述概念和技术,还需要了解文件安全性、异常处理和服务器配置等相关知识。在实际应用中,确保文件上传的健壮性和安全性是至关重要的,比如防止文件覆盖、大小限制、非法文件类型...

    达内2012三大框架之struts2附pdf和代码(最新版pdf)

    每个阶段可能包含有关Struts2的特定主题,如Action类的创建、配置文件(struts.xml)的编写、结果类型和拦截器的使用、国际化支持、异常处理以及与Spring、Hibernate等其他框架的整合等内容。例如,"day01"可能介绍...

    Java Struts框架示例项目

    最后,别忘了理解和实践Struts2的异常处理机制,以及如何与Spring等其他框架集成,以实现更完整的应用架构。 总的来说,这个"Java Struts框架示例项目"是一个很好的起点,帮助初学者逐步掌握Struts2框架的各个关键...

    JAVA Struts 框架 代码示例

    5. **异常处理**:全局异常处理机制使得开发者可以统一处理应用中的错误和异常,提高用户体验。 6. **国际化与本地化**:Struts支持多语言环境,通过资源文件可以轻松实现应用的国际化。 7. **数据校验**:...

    struts and hibernate学习笔记

    2. **Struts2实战**:可能涉及到创建一个简单的Struts2应用,处理HTTP请求,展示动态数据到视图,以及错误和异常处理。 3. **Hibernate基础**:涵盖实体类和映射文件的创建、SessionFactory和Session的概念、CRUD...

    struts教学资源

    Struts2提供了一套完整的异常处理机制,可以通过全局异常映射来捕获和处理异常,确保应用程序的健壮性。 10. **国际化与本地化**: Struts2支持多语言环境,通过资源配置文件可以实现应用的国际化和本地化。 本...

    struts2,hibernate,spring,springmvc,mybatis

    `day67_springmvc`可能涵盖了模型-视图-控制器的设计模式,以及Spring MVC如何处理HTTP请求、绑定表单数据、异常处理和视图渲染。它提供了灵活的控制器定义,易于测试,并与Spring其他模块集成。 5. **MyBatis**:...

Global site tag (gtag.js) - Google Analytics