`
sxw7362693
  • 浏览: 60935 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Struts2 学习笔记10--声明式异常处理

阅读更多

声明式异常处理
在程序中出现异常可以尽管往外抛,由统一接口做页面处理
代码:
服务层:抛出异常

public List<Category> list() throws SQLException {
        Connection conn = DB.createConn();
        String sql = "select * from _category_";
        PreparedStatement ps = DB.prepare(conn, sql);
        List<Category> categories = new ArrayList<Category>();
        try {
            ResultSet rs = ps.executeQuery();
            Category c = null;
            while(rs.next()) {
                c = new Category();
                c.setId(rs.getInt("id"));
                c.setName(rs.getString("name"));
                c.setDescription(rs.getString("description"));
                categories.add(c);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw(e);
        }
        DB.close(ps);
        DB.close(conn);
        return categories;
    }
 



Action:调用服务,抛出异常

public String list() throws Exception {
        categories = categoryService.list();
        return SUCCESS;
    }
 



配置声明异常:

<package name="bbs2009_default" extends="struts-default">
    <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
    <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
        </global-exception-mappings>
</package>
 


这样抛出的异常java.lang.Exception由struts2处理,跳转到/error.jsp页面。
这个异常声明是全局的,也可以声明成局部的。

原理:
Struts2利用exception的拦截器try…catch Action的调用,在catch中做异常的跳转处理。
这个拦截器的实现类可以从struts2-core.jar中的struts-default.xml文件中找到:

<package name="struts-default" abstract="true">
        <result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
        </result-types>

        <interceptors>
            <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
            <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
            <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
            <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
            <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
            <interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
            <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
            <interceptor name="exception
" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor
"/>
 


ExceptionMappingInterceptor类中

public String intercept(ActionInvocation invocation)
{
String result;
    try
    {
            result = invocation.invoke();
    }
    catch(Exception e)
    {
            if(isLogEnabled())
                handleLogging(e);
            List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
           String mappedResult = findResultFromExceptions(exceptionMappings, e);
            if(mappedResult != null)
            {
                result = mappedResult;
             publishException(invocation, new ExceptionHolder(e));
            } else
            {
                throw e;
            }
       }
       return result;
}

 

ActionInvocation为Action的调用过程。

 

 

I18N
1、原理:
    a)ResourceBundle和Locale的概念
    b)资源文件
    c) native2ascii

2、Struts资源文件
    a)Action-Package-App级
    b)一般只用app
        i.在struts.xml中定义<constant name="struts.custom.i18n.resources" value="bbs2009">

            </constant>
        ii.页面中去国际化值使用<s:property value="getText('login.username')"/>
    c)    PropertiesEditor插件

补充:LocalizedTextUtil是Struts 2.0中国际化的工具类,<s:text>标志就是通过调用它实现国际化的

国际化占位符使用:
如:

welcome.msg=欢迎你:{0}
页面:
<s:text name="welcome.msg">
    <s:param value="username"></s:param>
</s:text>
或
<s:text name="welcome.msg">
    <s:param>test</s:param>
</s:text>

 

上面value中设置变量为取得是值栈中的属性值

动态语言切换
     通过在当前页面加个链接并且这个链接是自动继续返回到这个当前页面,需要在页面链接后面加上一个参数     

    request_locale:

<a href="admin/lang?request_locale=en_US">en</a>
<a href="admin/lang?request_locale=zh_CN">cn</a>

    前面admin/lang这个action请求是返回到当前这个页面



标签取出国际化值:

      <s:textfield name="name" label="%{getText('UserName')}"/>
      或者
      <s:property value="%{getText('UserName')}"/>

 

    其中这个调用getText表示OGNL表达式调用Action中的普通方法:

public String getText(String aTextName, String defaultValue)

 



资源文件查找顺序
     之所以说Struts2的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在Struts 2.0中

     有下面几种方法:

1.使用全局的资源文件,方法如上例所示。这适用于遍布于整个应用程序的国际化字符
   串,它们在不同的包(package)中被引用,如一些比较共用的出错提示;
2.使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties
   和 package_xx_XX.properties文件。这就适用于在包中不同类访问的资源;
3.使用Action范围的资源文件。做法为 Action的包下新建文件名(除文件扩展名外)
   与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以
   在不同的 Action里使用相同的properties名表示不同的值。例如,在ActonOne中
   title为“动作一”,而同样用title在 ActionTwo表示“动作二”,节省一些命名工夫;
4.使用<s:i18n>标志访问特定路径的properties文件。使用方法请参考我早前的文
   章《常用的Struts 2.0的标志(Tag)介绍》。在您使用这一方法时,请注意
   <s:i18n>标志的范围。在<s:i18n name="xxxxx">到</s:i18n>之间,所有的
    国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts 2.0就会输出
    默认值(国际化字符串的名字)。

 

上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts 2.0在查找国际化字符串所遵循的是特定的顺序 ,如图所示:


纠正图中查找在struts.properties中配置的默认资源文件,在struts2.1.6中是配置在default.properties,也可以配置在struts.xml中。

struts.xml:
    <constant name="struts.custom.i18n.resources" value="bbs2009"></constant>
    这样就会在classpath下查找bbs2009_locale.properties的资源文件。

在Application级别时需要配置资源文件名称:
    在strut2-core.jar#org.apache.struts2.default.properties中找到


 

 

 

 

 

  • 大小: 69.6 KB
  • 大小: 60.5 KB
分享到:
评论

相关推荐

    struts2学习笔记

    ### Struts2学习笔记知识点详解 #### 一、准备工作及实例 **1. 解压struts-2.1.6-all.zip** - **Apps目录**:包含struts2自带的例子程序,适合初学者通过实际案例了解框架的基本用法。 - **Docs目录**:官方文档...

    Struts2学习笔记

    ### Struts2学习笔记知识点概览 #### 一、Struts的作用 - **核心功能**:Struts2框架的核心功能之一就是将业务逻辑与展示层分离,实现MVC(Model-View-Controller)架构模式。这有助于提高代码的可维护性、可扩展...

    牧紫小岩的Struts2学习笔记

    综上所述,**牧紫小岩的Struts2学习笔记**涵盖了Struts2框架的关键概念和技术细节,从框架的初始化流程、配置管理到Action的实现与调用,再到结果处理和异常管理,为初学者和资深开发者提供了一个全面深入的学习资源...

    Struts2 学习笔记

    07 声明式异常处理 33 08 国际化 35 一、 国际化资源文件 35 二、 Java国际化 35 三、 Struts2国际化 35 1、 Action级别 35 2、 Package级别 36 3、 Application级别 36 四、 资源文件中的参数处理 37 五、 国际化-...

    struts2详细学习笔记

    2. **修改Struts2的配置常量**:有多种方式可以覆盖默认常量,如在应用的`struts.properties`文件中直接定义、在`struts.xml`的`&lt;constant&gt;`标签内声明,或在`web.xml`中配置过滤器参数。 - 方式一:在`struts....

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2学习笔记二

    在本篇学习笔记中,我们将重点讨论Struts2框架中的Action和拦截器(Interceptor)如何处理请求参数。 首先,Struts2的核心是拦截器机制,它允许我们在Action执行前后插入自定义的处理逻辑。在`struts-default.xml`...

    struts2学习笔记四(第4讲.Struts2的类型转换续)

    在"Struts2学习笔记四(第4讲.Struts2的类型转换续)"中,我们将会深入探讨Struts2中的类型转换机制,这是一个核心特性,用于处理Action类属性与HTTP请求参数之间的数据类型转换。 在HTTP请求中,数据通常是字符串...

    struts2学习笔记九(第9讲.Struts2的校验框架 续)

    Struts2的校验框架通过提供声明式和编程式的验证方式,使得数据验证变得更为简洁和灵活。 1. **声明式验证**:在Action类中,我们可以使用注解来定义字段的验证规则。例如,`@RequiredFieldValidator`用于检查字段...

    圣思园struts2笔记

    Struts2是Java Web开发中一个非常重要的框架,由Apache软件基金会维护,它基于MVC(Model-View-Controller...通过学习这些笔记,开发者能够更好地理解和运用Struts2进行企业级Web应用开发,提高代码的可维护性和效率。

    Struts2 笔记代码

    在这个"Struts2笔记代码"压缩包中,很可能是包含了一系列与Struts2相关的示例代码和学习资料。 Struts2的核心特性包括: 1. **Action类和结果类型**:Action类是业务逻辑的载体,负责处理用户的请求。每个Action...

    struts2学习笔记十二(第12讲.Struts2的文件上传和下载)

    在Struts2中,文件上传和下载是两个重要的功能,常用于处理用户在网页上提交的文件。在第12讲中,我们将深入探讨Struts2如何实现这两个特性。 首先,我们来看文件上传。在Web应用中,用户可能需要上传图片、文档或...

    struts2的学习笔记+测试源代码

    这个学习笔记和测试源代码的资源着重于Struts2中的视图类型与全局视图的概念,以及结果类型转换和全局结果的配置。 首先,我们要理解在Struts2中视图的作用。视图是MVC模式中的一个重要组成部分,它负责展示数据,...

    struts2笔记(修改版)

    - 添加DTD文件,Location为dtd文件所在位置(如struts-2.0.dtd位于struts2-core-2.1.6.jar中),KeyType选择URI,Key为struts-2.0.dtd文件中文档声明的内容(http://struts.apache.org/dtds/struts-2.0.dtd)。...

    struts学习笔记

    10. **异常处理**:Struts 2提供了全局异常处理机制,可以在配置文件中定义如何处理特定类型的异常,避免了在每个Action中单独处理。 通过深入理解和熟练运用Struts API,开发者可以构建出高效、可维护的Java Web...

    2022年Java学习笔记-Java课程配套案例.rar

    这份"2022年Java学习笔记-Java课程配套案例.rar"压缩包文件显然是为了帮助学习者深入理解Java编程,通过实践案例来巩固理论知识。下面将详细探讨Java语言的一些核心知识点,并结合压缩包中的案例进行说明。 1. **...

    spring学习笔记

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...

Global site tag (gtag.js) - Google Analytics