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>
发表评论
-
struts2day06 自定义结果
2012-07-16 12:14 673类implements Result接口 或者 extends ... -
struts2day06 Struts2.0的result
2012-07-16 12:01 950Struts2.0的result Action ... -
struts2day06学习笔记
2012-07-16 10:55 8521.new String(xxx.getBytes(),&qu ... -
Struts2day05学习笔记
2012-07-13 22:19 6751.自定义拦截器 1.im ... -
Struts2day04Struts2.0文件的下载
2012-07-13 08:26 6761.写一个Action,在DownloadAction ext ... -
Struts2day04Struts2.0文件的上传
2012-07-13 08:20 6501、在服务器端提供一个文件夹存放提交的文件,upload文件夹 ... -
Struts2day04Struts2.0实现阻止表单重复提交
2012-07-12 21:01 6231.使用叫做token的拦截器,在表单中加入<s:tok ... -
Struts2day04对Action的方法进行过滤拦截
2012-07-12 20:38 17811.写一个Action类 UserManagerAction ... -
Struts2day04判断用户是否登录
2012-07-12 19:37 8691.在拦截器中获得用户登录的session 在LoginC ... -
Struts2day04测试程序的执行效率,拦截器栈,在Action中覆盖拦截器的属性值
2012-07-12 18:58 11851.在LoginAction.java中,extends Ac ... -
Struts2学习笔记day04
2012-07-12 00:31 6191.自定义类型转换 1.写一个类 extends S ... -
Struts2day03Struts2.0提供的数据格式校验
2012-07-11 21:52 716Struts2.0提供的数据格式校验 js校验:存在被 ... -
Struts2day03Struts2.0国际化
2012-07-11 21:09 764Struts2.0国际化 B/S结构中为网页提供多国 ... -
Struts2day03OGNL自定义类型转换
2012-07-11 20:47 806Struts2.0框架不能够或者不能完整的进行自动类型转换 ... -
Struts2学习笔记day03
2012-07-11 19:09 9471.值栈:ValueStack,存储数 ... -
Struts2day02多个对象提交
2012-07-10 07:15 1187在listUser.jsp页面 <%@ page la ... -
Struts2day02表单标签
2012-07-10 07:15 6651.在struts2Form.jsp中 <%@ ... -
struts2day02访问ValueStack中的数据以及访问Context中的对象
2012-07-10 07:14 10461.在show.jsp页面 <%@ page lang ... -
Struts2day02动态方法调用
2012-07-10 07:14 6521.在opt.jsp页面 <%@ page langu ... -
Struts2day02使用通配符调用指定的方法
2012-07-10 07:14 7291.在opt.jsp页面 <%@ page langu ...
相关推荐
`Struts2Day2_method`可能涉及到如何在Action类中定义和调用不同的业务处理方法。Struts2允许根据HTTP请求参数动态选择要执行的方法,这通过在Action类中定义多个以`execute`命名的重载方法实现。这种方法增强了...
- Struts2提供了一套完善的异常处理机制,包括全局和局部的异常配置,可以统一处理应用程序可能出现的错误。 8. **最佳实践与性能优化**: - 使用Struts2时应遵循最佳实践,如合理设计Action接口,避免过多的...
2. **拦截器的自定义**:开发者可以根据需求自定义拦截器,实现特定的功能,如性能监控、异常处理等。 六、最佳实践与注意事项 1. **Action命名**:Action类的命名最好能体现其业务功能,便于理解。 2. **分层设计...
Day04可能涉及Struts2的国际化、异常处理和文件上传下载等进阶主题。国际化允许开发出支持多语言的应用,而异常处理则能确保程序在遇到错误时能够优雅地处理。文件上传下载则是Web应用常见的需求,Struts2提供了方便...
- 在实际应用中,开发者可以通过自定义拦截器来实现诸如日志记录、异常处理、权限验证等功能。 - 注意在`intercept()`方法中通过`actionInvocation.invoke()`调用下一个拦截器或Action是非常关键的一步。 ### 二、...
day04可能会涵盖Struts2的异常处理和国际化支持。你将学习如何配置全局异常处理策略,以及如何为不同的语言提供本地化资源文件。 day05可能涉及Struts2的标签库。Struts2提供了一系列JSP标签,简化视图层的开发,如...
- **Struts2的异常处理**:如何配置全局和局部的异常处理策略。 - ** strut2与Spring的集成**:如果项目中使用了Spring,那么可能会讲解如何将Struts2与Spring框架整合,实现依赖注入。 在学习Struts2的过程中,...
- Struts2提供了一套完整的异常处理机制,可以在全局和Action级别定义异常处理器。 10. **测试与调试** - 使用Struts2的Mock测试框架进行单元测试,确保Action和拦截器的功能正确。 - 调试技巧和工具的使用也是...
9. **异常处理**:Struts2提供了全局的异常处理机制,可以统一处理应用中的异常,提高代码的健壮性。 10. **国际化(i18n)**:框架内置对多语言的支持,方便实现国际化应用。 在"day06"这个文件夹中,很可能包含...
7. **异常处理**:Struts2提供了一套完善的异常处理机制,可以捕获和处理Action执行过程中的异常,提供统一的错误页面。 在黑马程序员的这个2016版教程中,可能涵盖以下内容: - **基础篇**:介绍Struts2的基本...
Struts2提供了全局的异常处理机制,可以通过配置捕获和处理特定的运行时异常。 10. **安全问题**: Struts2历史上曾出现过一些安全漏洞,例如著名的CVE-2017-5638,因此在使用时应保持框架版本更新,确保安全性。...
- **OGNL演示04**:通过实例讲解OGNL在异常处理中的应用,如何利用OGNL来捕获和处理异常情况。 ### ValueStack - **ValueStack** 是Struts2中的一个重要概念,它是请求作用域中的对象栈,用于存储与请求相关的...
8. **异常处理**:Struts2提供了一套完整的异常处理机制,可以通过全局异常映射配置来统一处理应用程序中的异常。 9. **插件系统**:Struts2的插件系统非常强大,如Tiles插件用于布局管理,Freemarker或Velocity...
学习Struts2文件上传不仅需要掌握上述概念和技术,还需要了解文件安全性、异常处理和服务器配置等相关知识。在实际应用中,确保文件上传的健壮性和安全性是至关重要的,比如防止文件覆盖、大小限制、非法文件类型...
每个阶段可能包含有关Struts2的特定主题,如Action类的创建、配置文件(struts.xml)的编写、结果类型和拦截器的使用、国际化支持、异常处理以及与Spring、Hibernate等其他框架的整合等内容。例如,"day01"可能介绍...
最后,别忘了理解和实践Struts2的异常处理机制,以及如何与Spring等其他框架集成,以实现更完整的应用架构。 总的来说,这个"Java Struts框架示例项目"是一个很好的起点,帮助初学者逐步掌握Struts2框架的各个关键...
5. **异常处理**:全局异常处理机制使得开发者可以统一处理应用中的错误和异常,提高用户体验。 6. **国际化与本地化**:Struts支持多语言环境,通过资源文件可以轻松实现应用的国际化。 7. **数据校验**:...
2. **Struts2实战**:可能涉及到创建一个简单的Struts2应用,处理HTTP请求,展示动态数据到视图,以及错误和异常处理。 3. **Hibernate基础**:涵盖实体类和映射文件的创建、SessionFactory和Session的概念、CRUD...
Struts2提供了一套完整的异常处理机制,可以通过全局异常映射来捕获和处理异常,确保应用程序的健壮性。 10. **国际化与本地化**: Struts2支持多语言环境,通过资源配置文件可以实现应用的国际化和本地化。 本...
`day67_springmvc`可能涵盖了模型-视图-控制器的设计模式,以及Spring MVC如何处理HTTP请求、绑定表单数据、异常处理和视图渲染。它提供了灵活的控制器定义,易于测试,并与Spring其他模块集成。 5. **MyBatis**:...