重新学习struts

这就是所谓的一边工作一边学习。

今天准备把给公司写个管理页面,按照之前的路数,写起来应该挺快,但是不太规范。也就沉下心来学习一下了。

第一个学习的是,之前,在学校,听师兄说过,对页面编码可用interceptor去统一拦截处理。百度了一下,看来看去只有一份代码,试了一下,对响应的内容不生效,只对请求参数生效。

第二个学习的是,异常处理。

也是在学校的时候,听老师说过,struts2有提供一个异常处理机制。

平常我们有些异常处理,会在代码中写try catch。

public String login(){
    try{
       //do something
    }catch(SQLException e){
         return "SQLError";    //去struts.xml中找对就"SQLError"这个视图
    }
    return SUCCESS;
}
View Code

而现在struts2中,在action的方法中,直接抛出异常,代码如下(如果是runtime异常,可以不用抛出)

public String login() throws SQLException{
    
    //do something

    return SUCCESS;
}
View Code

两份代码,效果是一样的,如果出现sql异常,都会跳转到SQLError对应的视图。但是后者代码不用写一些try catch代码,使代码更加简洁。而异常处理也可以统一使用(复用)。

但是,后者要配置一下struts.xml文件。(看到这里,我又想起,struts.xml可以有多个,所以又再去学了这个知识点,而之前所有配置都写在一个struts.xml文件中)

struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

    <constant name="struts.multipart.saveDir" value="tem"></constant>
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.multipart.maxSize" value="52428800000" />
    <constant name="struts.action.extension" value="action,do,webwork" />
    
    <include file="struts-user.xml"></include>
    <include file="struts-error.xml"></include>
    
</struts>   
View Code

struts-user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

    <constant name="struts.multipart.saveDir" value="tem"></constant>
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.multipart.maxSize" value="52428800000" />
    <constant name="struts.action.extension" value="action,do,webwork" />
    
    <package name="web" extends="exception">
        
        <action name="user_*" class="UserAction" method="{1}">
            <result name="input">/index.jsp</result>
            <result name="success">/WEB-INF/view/management.jsp</result>
        </action>
    </package>
</struts>   
View Code

struts-error.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

    <constant name="struts.multipart.saveDir" value="tem"></constant>
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.multipart.maxSize" value="52428800000" />
    <constant name="struts.action.extension" value="action,do,webwork" />
    
    
    <!-- 错误、异常相关的 -->
    <package name="exception" extends="struts-default">
        <global-results>
            <result name="error">/WEB-INF/view/error/error.jsp</result>
            <result name="sql">/WEB-INF/view/error/sql_error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping result="sql" 
            exception="java.sql.SQLException"></exception-mapping>
        </global-exception-mappings>
        
        
    </package>
</struts>    
View Code

从上面的xml的代码可以看出,我又学了一个知识点。

之前一直没注意struts.xml里面的package里面name 和 extends这个作用。

今天通过这个学习又发现了。

一开始,直接抛出异常,照理说,应该跳转到sqlerror对应的视图上去的,但是,提示,UserAction这个action没有对应的视图。

后来再看看,试了一下继承,让struts-user.xml里的web那个package继承struts-error.xml里面的exception这个package,代码就调通了。

之前完全对package这个节点里面的name属性乱起名。现在明白了。

后来又查了一下,package是可以多继承的。

 

posted @ 2013-07-30 18:34  BaronZ  阅读(232)  评论(1编辑  收藏  举报